Redis在jwt中作用小結(jié)
Redis 在上述認證流程中主要扮演狀態(tài)管理者和性能加速器的角色,彌補了 JWT 無狀態(tài)特性的不足。以下是具體作用:
核心作用:解決 JWT 的"不可撤銷"問題
JWT 一旦簽發(fā),在過期前無法主動失效(這是無狀態(tài)的雙刃劍)。Redis 通過存儲關鍵狀態(tài),實現(xiàn)了有狀態(tài)的控制能力:
傳統(tǒng) JWT:簽發(fā) ──? 過期前一直有效(即使用戶登出)
JWT + Redis:簽發(fā) ──? Redis 標記失效 ──? 即時作廢
具體應用場景
Token 黑名單(登出失效)
場景 實現(xiàn)方式 Redis 數(shù)據(jù)結(jié)構(gòu) 用戶主動登出 將 Token 的 jti(唯一ID)存入 Redis,設置過期時間為 Token 剩余有效期 SET blacklist:{jti} 1 EX {remaining_ttl} 后臺強制下線 同上,或存儲用戶級標記 SET user:{id}:force_logout 1
# 登出時加入黑名單
def logout(token_jti, exp_timestamp):
ttl = exp_timestamp - current_time()
redis.setex(f"blacklist:{token_jti}", ttl, "revoked")
# 驗證時檢查
def is_token_valid(token_jti):
return not redis.exists(f"blacklist:{token_jti}")
多端登錄控制
限制同一賬號同時登錄設備數(shù)(如 QQ/微信的"已在其他設備登錄"):
# 登錄時記錄設備
redis.lpush(f"user:{user_id}:sessions", token_jti)
redis.ltrim(f"user:{user_id}:sessions", 0, 2) # 只保留最近3個
# 驗證時檢查當前 Token 是否在列表中
valid_tokens = redis.lrange(f"user:{user_id}:sessions", 0, -1)
if token_jti not in valid_tokens:
raise Exception("賬號已在其他設備登錄")
Refresh Token 存儲
Access Token 短期有效(15分鐘),Refresh Token 長期有效(7天),但需可撤銷:
# 存儲 Refresh Token 與用戶綁定
redis.setex(
f"refresh:{user_id}:{device_id}",
7*24*3600, # 7天過期
hash(refresh_token) # 存儲哈希值防泄露
)
# 刷新時驗證
stored_hash = redis.get(f"refresh:{user_id}:{device_id}")
if stored_hash != hash(incoming_refresh_token):
raise Exception("Refresh Token 無效或已輪換")
速率限制與安全防護
# 登錄失敗計數(shù)(防暴力破解)
key = f"login_attempts:{ip}"
attempts = redis.incr(key)
if attempts == 1:
redis.expire(key, 3600) # 1小時窗口
if attempts > 5:
raise Exception("嘗試次數(shù)過多,請稍后再試")
# Token 使用頻率限制(防 Token 泄露后被濫用)
redis.zadd(f"token:{jti}:requests", {current_time(): current_time()})
# 清理1分鐘前的記錄
redis.zremrangebyscore(f"token:{jti}:requests", 0, current_time()-60)
if redis.zcard(f"token:{jti}:requests") > 100:
# 1分鐘內(nèi)請求超過100次,可能泄露,加入黑名單
redis.setex(f"blacklist:{jti}", 3600, "suspected_leak")
架構(gòu)對比
方案 優(yōu)點 缺點 適用場景 純 JWT 完全無狀態(tài),擴展性強 無法強制失效,難以追蹤 內(nèi)部服務、短期令牌 JWT + Redis 黑名單 可撤銷,保留無狀態(tài)優(yōu)勢 每次驗證需查 Redis 常規(guī) Web 應用 純 Redis Session 完全可控,可實時強制下線 有狀態(tài),擴展需共享 Session 高安全要求(金融)
關鍵設計原則
- 最小化存儲:Redis 只存必要的狀態(tài)標記(如黑名單),不存完整的用戶數(shù)據(jù)
- TTL 對齊:Redis 鍵的過期時間嚴格對齊 JWT 的
exp時間,避免永久堆積 - 異步清理:黑名單過期后自動刪除,無需人工維護
本質(zhì):Redis 讓 JWT 從"完全不可控"變?yōu)?quot;可控的無狀態(tài)",在架構(gòu)簡潔性和業(yè)務需求間取得平衡。
到此這篇關于Redis在jwt中作用小結(jié)的文章就介紹到這了,更多相關Redis jwt作用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Redisson分布式限流器RRateLimiter的使用及原理小結(jié)
本文主要介紹了Redisson分布式限流器RRateLimiter的使用及原理小結(jié),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2024-06-06
通過Redisson監(jiān)聽Redis集群的Key過期事件的實現(xiàn)指南
在分布式系統(tǒng)中,監(jiān)聽 Redis 鍵過期事件是實現(xiàn)緩存失效、訂單超時取消等功能的常用方案,本文將詳細介紹如何通過 Redisson 高效監(jiān)聽 Redis 集群的 Key 過期事件,需要的朋友可以參考下2025-11-11

