一、概念及本質(zhì)
| 概念 | 本質(zhì) | 存儲(chǔ)位置 | 主要用途 | 特點(diǎn) |
|---|---|---|---|---|
| Cookie | HTTP狀態(tài)管理機(jī)制 | 瀏覽器端 | 維持會(huì)話狀態(tài) | 自動(dòng)攜帶,有大小限制 |
| Session | 服務(wù)端會(huì)話信息 | 服務(wù)器端 | 存儲(chǔ)用戶狀態(tài) | 服務(wù)端維護(hù),需要管理存儲(chǔ) |
| Token | 訪問(wèn)憑證 | 客戶端/服務(wù)端 | 身份認(rèn)證 | 自包含,可驗(yàn)證,無(wú)需服務(wù)器存儲(chǔ)狀態(tài) |
| JWT | Token標(biāo)準(zhǔn)化實(shí)現(xiàn) | 客戶端/服務(wù)端 | 安全傳輸信息 | 標(biāo)準(zhǔn)化、自包含、可簽名 |
| OAuth2 | 授權(quán)框架 | 不直接存儲(chǔ) | 第三方授權(quán) | 標(biāo)準(zhǔn)化授權(quán)流程,定義角色和訪問(wèn)令牌 |
二、工作原理和實(shí)現(xiàn)
1. Cookie
作用:瀏覽器自動(dòng)帶上標(biāo)識(shí),維持會(huì)話狀態(tài)
示例代碼:
// 設(shè)置Cookie
Cookie cookie = new Cookie("session_id", generateSessionId());
cookie.setMaxAge(3600);
cookie.setHttpOnly(true);
cookie.setSecure(true);
response.addCookie(cookie);
// 讀取Cookie
@CookieValue("session_id") String sessionId
-
重要屬性:
HttpOnly:防 XSS
Secure:僅 HTTPS 傳輸
SameSite:防 CSRF
Max-Age:有效期
2. Session
作用:服務(wù)端存儲(chǔ)用戶狀態(tài),瀏覽器通過(guò) Cookie 攜帶 session ID
-
存儲(chǔ)方案:
內(nèi)存存儲(chǔ)(默認(rèn))
Redis 分布式存儲(chǔ)(適合集群)
示例代碼:
// Spring Session
session.setAttribute("currentUser", user);
User user = (User) session.getAttribute("currentUser");
-
特點(diǎn):
服務(wù)器狀態(tài)維護(hù)
需要同步管理
適合傳統(tǒng) Web 應(yīng)用
3. Token
作用:自包含身份憑證,服務(wù)器無(wú)需存儲(chǔ)會(huì)話
示例代碼(JWT):
String token = JWT.create()
.withIssuer("myapp")
.withSubject(user.getId())
.withClaim("username", user.getUsername())
.sign(Algorithm.HMAC256(secret));
-
特點(diǎn):
無(wú)狀態(tài)(stateless)
可放在 Header、Cookie 或 URL
適合前后端分離、移動(dòng)端
4. JWT(JSON Web Token)
結(jié)構(gòu):
header.payload.signature示例:
// Header
{"alg":"HS256","typ":"JWT"}
// Payload
{"sub":"123","name":"John Doe","iat":1516239022,"exp":1516242622}
// Signature
HMACSHA256(base64UrlEncode(header)+"."+base64UrlEncode(payload), secret)
-
最佳實(shí)踐:
安全存儲(chǔ):HttpOnly Cookie 或內(nèi)存
雙Token機(jī)制:Access Token(短期) + Refresh Token(長(zhǎng)期)
5. OAuth2
作用:第三方授權(quán)框架
-
角色:
Resource Owner(用戶)
Client(第三方應(yīng)用)
Authorization Server(頒發(fā)令牌)
Resource Server(托管資源)
授權(quán)流程:常用授權(quán)碼模式(Authorization Code)
示例(Spring Security OAuth2):
// 授權(quán)服務(wù)器配置
clients.inMemory()
.withClient("clientapp")
.secret(passwordEncoder.encode("123456"))
.authorizedGrantTypes("authorization_code","refresh_token")
.scopes("read","write")
.redirectUris("http://localhost:8080/callback");
三、應(yīng)用場(chǎng)景對(duì)比
| 場(chǎng)景 | 推薦方案 | 說(shuō)明 |
|---|---|---|
| 傳統(tǒng) Web 應(yīng)用 | Session + Cookie | 簡(jiǎn)單易用,生態(tài)成熟 |
| 前后端分離 | JWT | 無(wú)狀態(tài) API 認(rèn)證,跨域友好 |
| 第三方登錄 | OAuth2 | 標(biāo)準(zhǔn)化授權(quán)流程,安全可靠 |
| 微服務(wù)架構(gòu) | JWT | 分布式認(rèn)證,無(wú)需會(huì)話同步 |
| 移動(dòng)端 | Token | 輕量、適合移動(dòng)網(wǎng)絡(luò) |
四、安全考慮
| 威脅 | Cookie方案防護(hù) | Token/JWT防護(hù) |
|---|---|---|
| XSS | HttpOnly | 避免 localStorage 存儲(chǔ) |
| CSRF | SameSite Cookie | 自定義 Header + CSRF Token |
| 令牌泄露 | 短期有效 + HTTPS | 短期有效 + HTTPS + 刷新機(jī)制 |
| 數(shù)據(jù)篡改 | 服務(wù)端驗(yàn)證 | 簽名驗(yàn)證 |
五、總結(jié)
Cookie:HTTP 狀態(tài)管理載體
Session:服務(wù)端狀態(tài)信息
Token:自包含身份憑證
JWT:Token 標(biāo)準(zhǔn)化實(shí)現(xiàn)
OAuth2:授權(quán)框架
選擇原則:
簡(jiǎn)單 Web 應(yīng)用 → Session + Cookie
前后端分離 → JWT + HTTP Header
第三方授權(quán) → OAuth2 + JWT
沒(méi)有絕對(duì)的最佳方案,只有最適合的方案。理解本質(zhì)和適用場(chǎng)景才能做出正確架構(gòu)決策。