傻傻分不清之 Cookie、Session、Token、JWT

作者:秋天不落葉

https://juejin.cn/user/1838039171859662

什麼是認證(Authentication)

什麼是授權(Authorization)

什麼是憑證(Credentials)

cookie 重要的屬性屬性說明 name=value 鍵值對,設置 Cookie 的名稱及相對應的值,都必須是字符串類型

什麼是 Session

根據以上流程可知,SessionID 是連接 Cookie 和 Session 的一道橋樑,大部分系統也是根據此原理來驗證用戶登錄狀態。

什麼是 Token(令牌)

Acesss Token

  1. 客戶端使用用戶名跟密碼請求登錄

  2. 服務端收到請求,去驗證用戶名與密碼

  3. 驗證成功後,服務端會簽發一個 token 並把這個 token 發送給客戶端

  4. 客戶端收到 token 以後,會把它存儲起來,比如放在 cookie 裏或者 localStorage 裏

  5. 客戶端每次向服務端請求資源的時候需要帶着服務端簽發的 token

  6. 服務端收到請求,然後去驗證客戶端請求裏面帶着的 token ,如果驗證成功,就向客戶端返回請求的數據

Refresh Token

Token 和 Session 的區別

什麼是 JWT

生成 JWT

jwt.io/www.jsonwebtoken.io/

JWT 的原理

JWT 的使用方式

方式一

    GET /calendar/v1/events
    Host: api.example.com
    Authorization: Bearer <token>

方式二

方式三

    http://www.example.com/user?token=xxx

項目中使用 JWT

** 項目地址: https://github.com/yjdjiayou/jwt-demo **

Token 和 JWT 的區別

相同:

區別:

常見的前後端鑑權方式

  1. Session-Cookie

  2. Token 驗證(包括 JWTSSO

  3. OAuth2.0(開放授權)

常見的加密算法

image.png

注意:

  1. 以上不能保證數據被惡意篡改,原始數據和哈希值都可能被惡意篡改,要保證不被篡改,可以使用 RSA 公鑰私鑰方案,再配合哈希值。

  2. 哈希算法主要用來防止計算機傳輸過程中的錯誤,早期計算機通過前 7 位數據第 8 位奇偶校驗碼來保障(12.5% 的浪費效率低),對於一段數據或文件,通過哈希算法生成 128bit 或者 256bit 的哈希值,如果校驗有問題就要求重傳。

常見問題

使用 session 時需要考慮的問題

使用 token 時需要考慮的問題

使用 JWT 時需要考慮的問題

使用加密算法時需要考慮的問題

分佈式架構下 session 共享方案

1. session 複製

優點: 可容錯,各個服務器間 session 能夠實時響應。

缺點: 會對網絡負荷造成一定壓力,如果 session 量大的話可能會造成網絡堵塞,拖慢服務器性能。

2. 粘性 session /IP 綁定策略

優點: 簡單,不需要對 session 做任何處理。

缺點: 缺乏容錯性,如果當前訪問的服務器發生故障,用戶被轉移到第二個服務器上時,他的 session 信息都將失效。

適用場景: 發生故障對客戶產生的影響較小;服務器發生故障是低概率事件。實現方式: 以 Nginx 爲例,在 upstream 模塊配置 ip_hash 屬性即可實現粘性 session。

3. session 共享(常用)

4. session 持久化

優點: 服務器出現問題,session 不會丟失

缺點: 如果網站的訪問量很大,把 session 存儲到數據庫中,會對數據庫造成很大壓力,還需要增加額外的開銷維護數據庫。

只要關閉瀏覽器 ,session 真的就消失了?

不對。對 session 來說,除非程序通知服務器刪除一個 session,否則服務器會一直保留,程序一般都是在用戶做 log off 的時候發個指令去刪除 session。然而瀏覽器從來不會主動在關閉之前通知服務器它將要關閉,因此服務器根本不會有機會知道瀏覽器已經關閉,之所以會有這種錯覺,是大部分 session 機制都使用會話 cookie 來保存 session id,而關閉瀏覽器後這個 session id 就消失了,再次連接服務器時也就無法找到原來的 session。如果服務器設置的 cookie 被保存在硬盤上,或者使用某種手段改寫瀏覽器發出的 HTTP 請求頭,把原來的 session id 發送給服務器,則再次打開瀏覽器仍然能夠打開原來的 session。恰恰是由於關閉瀏覽器不會導致 session 被刪除,迫使服務器爲 session 設置了一個失效時間,當距離客戶端上一次使用 session 的時間超過這個失效時間時,服務器就認爲客戶端已經停止了活動,纔會把 session 刪除以節省存儲空間。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/zB9zr0al-tWUx8qsX5Q4-g