session cookie 和token登入驗證

2021-09-02 12:55:58 字數 4111 閱讀 3167

最近研究了下基於token的身份驗證,並將這種機制整合在個人專案中。現在很多**的認證方式都從傳統的seesion+cookie轉向token校驗。對比傳統的校驗方式,token確實有更好的擴充套件性與安全性。

傳統的session+cookie身份驗證

由於http是無狀態的,它並不記錄使用者的身份。使用者將賬號與密碼傳送給伺服器後,後台通過校驗,但是並沒有記錄狀態,於是下一次使用者的請求仍然需要校驗身份。為了解決這一問題,需要在服務端生成一條包含使用者身份的記錄,也就是session,再將這條記錄傳送給使用者並儲存在使用者本地,即cookie。接下來使用者的請求都會帶上這條cookie,若客戶端的cookie與服務端的session能對應上,則說明使用者身份驗證通過。

token身份校驗

流程大致如下:

第一次請求時,使用者傳送賬號與密碼

後台校驗通過,則會生成乙個有時效性的token,再將此token傳送給使用者

使用者獲得token後,將此token儲存在本地,一般儲存在localstorage或cookie

之後的每次請求都會將此token新增在請求頭里,所有需要校驗身份的介面都會被校驗token,若token解析後的資料報含使用者身份資訊,則身份驗證通過。

對比傳統的校驗方式,token校驗有如下優勢:

在基於token的認證,token通過請求頭傳輸,而不是把認證資訊儲存在session或者cookie中。這意味著無狀態。你可以從任意一種可以傳送http請求的終端向伺服器傳送請求。

可以避免csrf攻擊

當在應用中進行 session的讀,寫或者刪除操作時,會有乙個檔案操作發生在作業系統的temp 資料夾下,至少在第一次時。假設有多台伺服器並且 session 在第一台服務上建立。當你再次傳送請求並且這個請求落在另一台伺服器上,session 資訊並不存在並且會獲得乙個「未認證」的響應。我知道,你可以通過乙個粘性 session 解決這個問題。然而,在基於 token 的認證中,這個問題很自然就被解決了。沒有粘性 session 的問題,因為在每個傳送到伺服器的請求中這個請求的 token 都會被攔截。

下面介紹一下利用node+jwt(jwt教程)搭建簡易的token身份校驗

示例

當使用者第一次登入時,提交賬號與密碼至伺服器,伺服器校驗通過,則生成對應的token,**如下:

const fs = require('fs');

const path = require('path');

const jwt = require('jsonwebtoken');

//生成token的方法

functiongeneratetoken(data), cert, );

returntoken;

}

//登入介面

router.post('/oa/login', async (ctx, next) => = data;

let sql ='select uid from t_user where name=? and password=? and is_delete=0', value = [name, md5(password)];

await db.query(sql, value).then(res => );

ctx.body =

}

}else

}).catch(e => );

});

使用者通過校驗將獲取到的token存放在本地:?

store.set('loginedtoken',token);//store為外掛程式

之後客戶端請求需要驗證身份的介面,都會將token放在請求頭里傳遞給服務端:?

service.interceptors.request.use(config => ;

let loginedtoken = store.get('loginedtoken');

let time = date.now();

let = config;

headers = ;

params = ;

config = ;

returnconfig;

}, error => )

服務端對所有需要登入的介面均攔截token並校驗合法性。?

functionverifytoken(token)) || {};

let = result,current = math.floor(date.now()/1000);

if(current <= exp);

}

}catch(e)

returnres;

}

let = ctx;

if(url.indexof('/user/') > -1) = header;

if(loginedtoken) = result;

if(uid);

await next();

}else

}else

}else

});

本示例使用的公鑰與私鑰可自己生成,操作如下:

開啟命令列工具,輸入openssl,開啟openssl;

生成私鑰:genrsa -out rsa_private_key.pem 2048

生成公鑰: rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

點此檢視node後台** 

點此檢視前端**

文章出處:

session cookie和cache的區別

其中cookie是儲存在客戶端的一組資料,主要用來儲存使用者名稱等個人資訊。session session用來儲存每乙個使用者的專有資訊 session的生存期是使用者持續請求時間加上一段時間 一般是20分鐘左右 session資訊是儲存在web伺服器記憶體中的,儲存資料量可大可小 由於使用者停止使...

session cookie 和token登入驗證

最近研究了下基於token的身份驗證,並將這種機制整合在個人專案中。現在很多 的認證方式都從傳統的seesion cookie轉向token校驗。對比傳統的校驗方式,token確實有更好的擴充套件性與安全性。傳統的session cookie身份驗證 由於http是無狀態的,它並不記錄使用者的身份。...

session cookie和token的區別

web應用程式是使用http協議來傳送資料的。而http是無狀態的協議。所以一旦http報文交換完成,客戶端和伺服器端就會誰也不認識誰了,這意味著伺服器無法從連線上跟蹤會話。即當使用者a購買了一件商品並放入購物車中,當再次購買該商品時,伺服器已經無法判斷是哪個使用者的會話了,所以才必須引入一種機制用...