1. 程式人生 > >session和token實現使用者認證的異同

session和token實現使用者認證的異同

現在貌似大多數網站使用者認證都是基於 session 的,即在服務端生成使用者相關的 session 資料,而發給客戶端 sesssion_id 存放到 cookie 中,這樣用客戶端請求時帶上 session_id 就可以驗證伺服器端是否存在 session 資料,以此完成使用者認證。這種認證方式,可以更好的在服務端對會話進行控制,安全性比較高(session_id 隨機),但是服務端需要儲存 session 資料(如記憶體或資料庫),這樣無疑增加維護成本和減弱可擴充套件性(多臺伺服器)。 CSRF 攻擊一般基於 cookie 。另外,如果是原生 app 使用這種服務介面,又因為沒有瀏覽器 cookie 功能,所以接入會相對麻煩。

基於 token 的使用者認證是一種服務端無狀態的認證方式,服務端不用存放 token 資料。使用者驗證後,服務端生成一個 token(hash 或 encrypt)發給客戶端,客戶端可以放到 cookie 或 localStorage 中,每次請求時在 Header 中帶上 token ,服務端收到 token 通過驗證後即可確認使用者身份。這種方式相對 cookie 的認證方式就簡單一些,服務端不用儲存認證資料,易維護擴充套件性強, token 存在 localStorage 可避免 CSRF , web 和 app 應用這用介面都比較簡單。不過這種方式在加密或解密的時候會有一些效能開銷(好像也不是很大),有些對稱加密存在安全隱患(aes cbc 位元組翻轉攻擊)。