一文搞懂 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的概念,以及為什麼需要這些技術。至於更深入的原理和程式碼使用,就請讀者自行研究了哦。至少這篇文章能讓你搞懂,看到不會覺得陌生了。哈哈哈。
參考資料
jwt-handbook-v0_14_1
如果你覺得這篇文章寫的還不錯的話,關注公眾號“測試老樹”,你的支援就是我寫文章的最大動力。
相關文章
- 一文搞懂Cookie,Session,Token,JWTCookieSessionJWT
- 【網路傳輸】Cookie、Session、Token、JWTCookieSessionJWT
- 一文搞懂Session和JWT登入認證SessionJWT
- 理解 cookie、session、tokenCookieSession
- 一文搞懂Session和Cookie的用法及區別SessionCookie
- 徹底理解cookie,session,tokenCookieSession
- JWT Token儲存在Cookie還是LocalStorageJWTCookie
- 3分鐘搞懂Cookie與SessionCookieSession
- 【轉】Session ID/session token 及和cookie區別SessionCookie
- Token ,Cookie、Session 三者區別CookieSession
- 一文弄懂 HTTP、cookie、sessionHTTPCookieSession
- Token ,Cookie、Session傻傻分不清楚?CookieSession
- JWT簡介:從Session到Token的轉變JWTSession
- 不要用JWT替代session管理(上):全面瞭解Token,JWT,OAuth,SAML,SSOJWTSessionOAuth
- JWT TokenJWT
- 一篇文章弄懂cookie、session和tokenCookieSession
- 除了cookie,你還可以用jwt(json web token)!CookieJWTJSONWeb
- 一文快速回顧 Session 和 CookieSessionCookie
- 一文說通Jwt、Session、Cooike區別JWTSession
- nodejs學習08——會話控制 session cookie tokenNodeJS會話SessionCookie
- 一問帶你區分清楚Authentication,Authorization以及Cookie、Session、TokenCookieSession
- ASP.NET Core Web Api之JWT VS Session VS Cookie(二)ASP.NETWebAPIJWTSessionCookie
- 淺談 Cookie-Session 、Jwt 兩種身份認證機制CookieSessionJWT
- Cookie、Session、JWT在koa中的應用及實現原理CookieSessionJWT
- 憑證管理揭秘:Cookie-Session 與 JWT 方案的對決CookieSessionJWT
- jwt生成token和token解析基礎JWT
- Session、Cookie、Token 【淺談三者之間的那點事】SessionCookie
- Web 開發必須掌握的三個技術:Token、Cookie、SessionWebCookieSession
- JWT(Json WEB Token)JWTJSONWeb
- jwt生成token報錯JWT
- cookie & sessionCookieSession
- cookie sessionCookieSession
- token 會話設計 (JWT)會話JWT
- Jwt建立身份令牌TokenJWT
- Session與CookieSessionCookie
- cookie 和 sessionCookieSession
- cookie與sessionCookieSession
- session和cookieSessionCookie