cookie,session,token,jwt,oauth2 有什么區(qū)別

一、概念及本質(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ǔ)方案

    1. 內(nèi)存存儲(chǔ)(默認(rèn))

    2. 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é)

  1. Cookie:HTTP 狀態(tài)管理載體

  2. Session:服務(wù)端狀態(tài)信息

  3. Token:自包含身份憑證

  4. JWT:Token 標(biāo)準(zhǔn)化實(shí)現(xiàn)

  5. 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)決策。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容