在用戶認(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 來保證安全和可控性。