一文搞懂 Cookie,Session,Token,JWT
HTTP 協議是無狀態的,無狀態意味著,伺服器無法給不同的客戶端響應不同的資訊。這樣一些互動業務就無法支撐了。Cookie 應運而生。
Cookie
透過 F12 開發者工具,先瞅瞅 Cookie 的顏值
從圖中可以看到 Cookie 包括這些內容:Name,Value,Domain,Path,Expires / Max-Age,Size,HttpOnly,Secure,SameSite,Priority。
Cookie 的傳遞會經歷這 4 步
- Client 傳送 HTTP 請求給 Server
- Server 響應,並附帶 Set-Cookie 的頭部資訊
- Client 儲存 Cookie,之後請求 Server 會附帶 Cookie 的頭部資訊
- Server 從 Cookie 知道 Client 是誰了,返回相應的響應
Cookie 的英文翻譯是甜品,使用 Cookie 可以自動填寫使用者名稱、記住密碼等,是給使用者的一點甜頭。
Server 拿到 Cookie 後,透過什麼資訊才能判斷是哪個 Client 呢?伺服器的 SessionID。
Session
如果把使用者名稱、密碼等重要隱私都存到客戶端的 Cookie 中,還是有洩密風險。為了更安全,把機密資訊儲存到伺服器上,這就是 Session。Session 是伺服器上維護的客戶檔案,可以理解為伺服器端資料庫中有一張 user 表,裡面存放了客戶端的使用者資訊。SessionID 就是這張表的主鍵 ID。
Cookie 中儲存 SessionID
Session 資訊存到伺服器,必然佔用記憶體。使用者多了以後,開銷必然增大。為了提高效率,需要做分散式,做負載均衡。因為認證的資訊儲存在記憶體中,使用者訪問哪臺伺服器,下次還得訪問相同這臺伺服器才能拿到授權資訊,這就限制了負載均衡的能力。而且 SeesionID 存在 Cookie,還是有暴露的風險,比如 CSRF(Cross-Site Request Forgery,跨站請求偽造)。
如何解決這些問題呢?基於 Token 令牌鑑權。
Token
首先,Token 不需要再儲存使用者資訊,節約了記憶體。其次,由於不儲存資訊,客戶端訪問不同的伺服器也能進行鑑權,增強了擴充套件能力。然後,Token 可以採用不同的加密方式進行簽名,提高了安全性。
Token 就是一段字串
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)
再畫個妝,漂亮
可以到https://jwt.io/#debugger-io這個網址卸妝哦
給 Token 穿個外套
Authorization: Bearer <token>
這就是我們在請求 Header 裡面看到的內容格式了。
簡要回顧
本文簡單介紹了 Cookie、Session、Token、JWT 的概念,以及為什麼需要這些技術。至於更深入的原理和程式碼使用,就請讀者自行研究了哦。至少這篇文章能讓你搞懂,看到不會覺得陌生了。哈哈哈。
參考資料
https://jwt.io/introduction/
jwt-handbook-v0_14_1
如果你覺得這篇文章寫的還不錯的話,關注公眾號 “測試老樹”,你的支援就是我寫文章的最大動力。
相關文章
- 一文搞懂Cookie,Session,Token,JWTCookieSessionJWT
- 【網路傳輸】Cookie、Session、Token、JWTCookieSessionJWT
- 理解 cookie、session、tokenCookieSession
- 一文搞懂Session和JWT登入認證SessionJWT
- 一文搞懂Session和Cookie的用法及區別SessionCookie
- 徹底理解cookie,session,tokenCookieSession
- 3分鐘搞懂Cookie與SessionCookieSession
- Token ,Cookie、Session 三者區別CookieSession
- 一文弄懂 HTTP、cookie、sessionHTTPCookieSession
- Token ,Cookie、Session傻傻分不清楚?CookieSession
- JWT簡介:從Session到Token的轉變JWTSession
- nodejs學習08——會話控制 session cookie tokenNodeJS會話SessionCookie
- 一篇文章弄懂cookie、session和tokenCookieSession
- 不要用JWT替代session管理(上):全面瞭解Token,JWT,OAuth,SAML,SSOJWTSessionOAuth
- 除了cookie,你還可以用jwt(json web token)!CookieJWTJSONWeb
- 一文快速回顧 Session 和 CookieSessionCookie
- 一文說通Jwt、Session、Cooike區別JWTSession
- JWT TokenJWT
- 一問帶你區分清楚Authentication,Authorization以及Cookie、Session、TokenCookieSession
- 憑證管理揭秘:Cookie-Session 與 JWT 方案的對決CookieSessionJWT
- Cookie、Session、JWT在koa中的應用及實現原理CookieSessionJWT
- 淺談 Cookie-Session 、Jwt 兩種身份認證機制CookieSessionJWT
- ASP.NET Core Web Api之JWT VS Session VS Cookie(二)ASP.NETWebAPIJWTSessionCookie
- cookie sessionCookieSession
- cookie & sessionCookieSession
- Session、Cookie、Token 【淺談三者之間的那點事】SessionCookie
- Web 開發必須掌握的三個技術:Token、Cookie、SessionWebCookieSession
- cookie&sessionCookieSession
- Cookie和SessionCookieSession
- session和cookieSessionCookie
- cookie 和 sessionCookieSession
- Session與CookieSessionCookie
- JWT(Json WEB Token)JWTJSONWeb
- jwt生成token和token解析基礎JWT
- 1分鐘帶你理解Java Web開發必掌握的:Token ,Cookie,SessionJavaWebCookieSession
- 看完這篇 Session、Cookie、Token,和麵試官扯皮就沒問題了SessionCookie
- cookie、session、web storageCookieSessionWeb
- 【Javaweb】Cookie和SessionJavaWebCookieSession