理解 Token —— 從 Session 到 JWT

在用戶認(rèn)證和授權(quán)的世界里,Token 是一個繞不開的關(guān)鍵詞。無論是傳統(tǒng)的 Web 應(yīng)用,還是當(dāng)下流行的前后端分離、微服務(wù)架構(gòu),都需要一個安全、可靠的機(jī)制來識別用戶身份。而 Token 正是這個核心。

本文將從基礎(chǔ)概念講起,逐步介紹業(yè)界常見的幾種 Token 方案,并結(jié)合實(shí)踐談?wù)勊鼈兊膬?yōu)缺點(diǎn)。


1. 什么是 Token

Token,本質(zhì)上就是一串“憑證字符串”。
用戶登錄成功后,服務(wù)器生成并返回一個 Token,之后用戶在請求接口時帶上這個 Token,服務(wù)器通過驗證它來判斷用戶身份,而無需每次都重復(fù)輸入用戶名密碼。

可以把它理解為:

  • 在電影院,你買了票(賬號+密碼登錄)
  • 檢票員給你一個手環(huán)(Token)
  • 之后你憑手環(huán)就能在影院里自由進(jìn)出,而不用再出示購票信息

2. 常見的 Token 方案

2.1 Session + Cookie

這是最傳統(tǒng)的 Web 鑒權(quán)方案:

  • 用戶登錄后,服務(wù)器生成 sessionId 并存儲在數(shù)據(jù)庫/Redis 中
  • 同時把 sessionId 寫入瀏覽器 Cookie
  • 用戶請求時自動帶上 Cookie,服務(wù)器查表確認(rèn)身份

優(yōu)點(diǎn)

  • 簡單、易用
  • httpOnly Cookie 防止 XSS 攻擊

缺點(diǎn)

  • 需要在服務(wù)端存儲 Session
  • 分布式集群下需要共享 Session(通常依賴 Redis)

典型場景:傳統(tǒng) Web 應(yīng)用、后臺管理系統(tǒng)


2.2 UUID Token + Redis

在移動互聯(lián)網(wǎng)時代,前后端分離成為常態(tài),Cookie 不再是唯一的選擇。于是出現(xiàn)了用 UUID 作為 Token:

  • 登錄成功后,服務(wù)端生成一個 UUID 作為 Token
  • 存入 Redis,映射關(guān)系如 token -> userId
  • 客戶端請求時帶上這個 Token,服務(wù)端查詢 Redis 驗證

優(yōu)點(diǎn)

  • 靈活,可以隨時撤銷 Token(刪除 Redis)
  • TTL(過期時間)控制方便

缺點(diǎn)

  • 每次驗證都要訪問 Redis,依賴緩存性能

典型場景:移動 App、支付系統(tǒng)、高安全要求的業(yè)務(wù)


2.3 JWT(JSON Web Token)

JWT 是一種無狀態(tài) Token,內(nèi)部結(jié)構(gòu)分為三段:

Header.Payload.Signature
  • Header:描述簽名算法
  • Payload:存儲用戶數(shù)據(jù)(如 userId、過期時間 exp)
  • Signature:用秘鑰簽名,防止篡改

特點(diǎn)是:服務(wù)端不用存儲任何數(shù)據(jù),只需校驗簽名即可。

優(yōu)點(diǎn)

  • 無狀態(tài),天然適合分布式、微服務(wù)架構(gòu)
  • 可攜帶少量用戶信息(避免頻繁查詢數(shù)據(jù)庫)

缺點(diǎn)

  • 一旦簽發(fā)無法主動撤銷,只能等過期
  • 如果泄漏,在過期前會一直有效

典型場景:API 網(wǎng)關(guān)、微服務(wù)內(nèi)部鑒權(quán)、OAuth2.0


2.4 混合方案(JWT + Redis)

業(yè)界很多公司采用的其實(shí)是混合方案

  • 短期 Token:JWT,有效期較短(例如 15 分鐘)
  • 長期 Token:Refresh Token(UUID),存 Redis,有效期 7~30 天
  • 當(dāng) JWT 過期時,客戶端用 Refresh Token 換新 JWT
  • 如果用戶登出或管理員禁用賬戶,刪除 Redis 的 Refresh Token,即可徹底失效

典型場景:OAuth2、OpenID Connect、現(xiàn)代 SaaS 平臺


3. 如何設(shè)置過期時間

無論哪種 Token,都需要考慮過期時間:

  • JWT:在 Payload 里設(shè)置 exp 字段,自動過期
  • UUID Token:在 Redis 中設(shè)置 TTL,到期自動清理

實(shí)踐中常見做法:

  • 短期 Token(幾分鐘 ~ 幾小時):減少泄漏風(fēng)險
  • 長期 Token(幾天 ~ 幾周):提升用戶體驗,用于換新

4. 業(yè)界的主流選擇

總結(jié)一下現(xiàn)在常見的幾種方案:

方案 存儲 優(yōu)點(diǎn) 缺點(diǎn) 典型場景
Session + Cookie 數(shù)據(jù)庫/Redis 簡單、安全 集群下要共享 Session 傳統(tǒng) Web、管理后臺
UUID Token + Redis Redis 可控、可撤銷 依賴緩存性能 移動 App、支付業(yè)務(wù)
JWT 無存儲 無狀態(tài)、分布式友好 無法主動失效 微服務(wù)、API 鑒權(quán)
JWT + Redis JWT + Redis 兼顧無狀態(tài)與可控性 實(shí)現(xiàn)復(fù)雜度高 OAuth2、SaaS 平臺

5. 總結(jié)

  • Token = 身份憑證,是現(xiàn)代認(rèn)證體系的核心

  • Session → UUID Token → JWT → 混合方案,是業(yè)界常見的演進(jìn)路線

  • JWT 用得很多,但幾乎都會配合 Redis 做增強(qiáng),以解決主動失效的問題

  • 實(shí)際選擇方案時,要根據(jù)業(yè)務(wù)場景:

    • 傳統(tǒng) Web → Session + Cookie
    • App / 高安全業(yè)務(wù) → UUID + Redis
    • 微服務(wù) / API → JWT + Refresh Token

JWT 的無狀態(tài)優(yōu)勢很強(qiáng),但在真正的生產(chǎn)環(huán)境里,往往需要結(jié)合 Redis 來保證安全和可控性。

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

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

  • 鄭重聲明:本文原創(chuàng)非首發(fā),首發(fā)平臺縱橫,ID西西利比亞,文責(zé)自負(fù) 【周末】 南召小鎮(zhèn)的秋天,總是給人帶來一種昏昏欲...
    麒麟故事房閱讀 1,302評論 9 89
  • 第一篇:探尋紅色中國 在外界對中國共產(chǎn)黨和紅軍充滿誤解與猜測之時,斯諾懷揣著對真相的渴望,帶著給蘇維埃政府主...
    43d79cbc7988閱讀 302評論 0 0
  • 第一篇:看不見的城市[http://www.itdecent.cn/p/10a0317f270a] 作者:kir...
    楠央閱讀 698評論 9 21
  • 希希的童話故事集 第一篇 變高了的螞蟻東東 螞蟻東東和他的家人生活在一個美麗的大森林里。我們都覺得小螞蟻那么小,肯...
    了不起的牛人閱讀 501評論 0 0
  • 《達(dá)拉斯時間》 BD 【序】 獻(xiàn)給我一個傻傻的朋友, 她一難過就要哭鼻子, 還要打電話哭給我聽 ——朋友們,她有感...
    BD小黑黑閱讀 1,113評論 0 0

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