一文搞懂 Cookie,Session,Token,JWT

测试开发体系發表於2020-10-10

HTTP 協議是無狀態的,無狀態意味著,伺服器無法給不同的客戶端響應不同的資訊。這樣一些互動業務就無法支撐了。Cookie 應運而生。

透過 F12 開發者工具,先瞅瞅 Cookie 的顏值

一文搞懂 Cookie,Session,Token,JWT

從圖中可以看到 Cookie 包括這些內容:Name,Value,Domain,Path,Expires / Max-Age,Size,HttpOnly,Secure,SameSite,Priority。
Cookie 的傳遞會經歷這 4 步

  1. Client 傳送 HTTP 請求給 Server
  2. Server 響應,並附帶 Set-Cookie 的頭部資訊
  3. Client 儲存 Cookie,之後請求 Server 會附帶 Cookie 的頭部資訊
  4. Server 從 Cookie 知道 Client 是誰了,返回相應的響應

一文搞懂 Cookie,Session,Token,JWT

Cookie 的英文翻譯是甜品,使用 Cookie 可以自動填寫使用者名稱、記住密碼等,是給使用者的一點甜頭。
Server 拿到 Cookie 後,透過什麼資訊才能判斷是哪個 Client 呢?伺服器的 SessionID。

Session

如果把使用者名稱、密碼等重要隱私都存到客戶端的 Cookie 中,還是有洩密風險。為了更安全,把機密資訊儲存到伺服器上,這就是 Session。Session 是伺服器上維護的客戶檔案,可以理解為伺服器端資料庫中有一張 user 表,裡面存放了客戶端的使用者資訊。SessionID 就是這張表的主鍵 ID。
Cookie 中儲存 SessionID

一文搞懂 Cookie,Session,Token,JWT

Session 資訊存到伺服器,必然佔用記憶體。使用者多了以後,開銷必然增大。為了提高效率,需要做分散式,做負載均衡。因為認證的資訊儲存在記憶體中,使用者訪問哪臺伺服器,下次還得訪問相同這臺伺服器才能拿到授權資訊,這就限制了負載均衡的能力。而且 SeesionID 存在 Cookie,還是有暴露的風險,比如 CSRF(Cross-Site Request Forgery,跨站請求偽造)。
如何解決這些問題呢?基於 Token 令牌鑑權。

Token

首先,Token 不需要再儲存使用者資訊,節約了記憶體。其次,由於不儲存資訊,客戶端訪問不同的伺服器也能進行鑑權,增強了擴充套件能力。然後,Token 可以採用不同的加密方式進行簽名,提高了安全性。
Token 就是一段字串

一文搞懂 Cookie,Session,Token,JWT

Token 傳遞的過程跟 Cookie 類似,只是傳遞物件變成了 Token。使用者使用使用者名稱、密碼請求伺服器後,伺服器就生成 Token,在響應中返給客戶端,客戶端再次請求時附帶上 Token,伺服器就用這個 Token 進行認證鑑權。
Token 雖然很好的解決了 Session 的問題,但仍然不夠完美。伺服器在認證 Token 的時候,仍然需要去資料庫查詢認證資訊做校驗。為了不查庫,直接認證,JWT 出現了。

JWT

JWT 的英文全稱是 JSON Web Token。JWT 把所有資訊都存在自己身上了,包括使用者名稱密碼、加密資訊等,且以 JSON 物件儲存的。
JWT 長相是xxxxx.yyyyy.zzzzz,極具藝術感。包括三部分內容

  • Header

包括 token 型別和加密演算法(HMAC SHA256 RSA)。

{
  "alg": "HS256",
  "typ": "JWT"
}
  • Payload

傳輸內容。

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}
  • Signature

簽名,把 header 和 payload 用 base64 編碼後"."拼接,加鹽 secret(伺服器私鑰)。

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

再畫個妝,漂亮

一文搞懂 Cookie,Session,Token,JWT

可以到https://jwt.io/#debugger-io這個網址卸妝哦

一文搞懂 Cookie,Session,Token,JWT

給 Token 穿個外套

Authorization: Bearer <token>

這就是我們在請求 Header 裡面看到的內容格式了。

簡要回顧

本文簡單介紹了 Cookie、Session、Token、JWT 的概念,以及為什麼需要這些技術。至於更深入的原理和程式碼使用,就請讀者自行研究了哦。至少這篇文章能讓你搞懂,看到不會覺得陌生了。哈哈哈。

參考資料

https://jwt.io/introduction/

jwt-handbook-v0_14_1

如果你覺得這篇文章寫的還不錯的話,關注公眾號 “測試老樹”,你的支援就是我寫文章的最大動力。

相關文章