Redis在jwt中作用小結(jié)
Redis 在上述認(rèn)證流程中主要扮演狀態(tài)管理者和性能加速器的角色,彌補(bǔ)了 JWT 無(wú)狀態(tài)特性的不足。以下是具體作用:
核心作用:解決 JWT 的"不可撤銷"問(wèn)題
JWT 一旦簽發(fā),在過(guò)期前無(wú)法主動(dòng)失效(這是無(wú)狀態(tài)的雙刃劍)。Redis 通過(guò)存儲(chǔ)關(guān)鍵狀態(tài),實(shí)現(xiàn)了有狀態(tài)的控制能力:
傳統(tǒng) JWT:簽發(fā) ──? 過(guò)期前一直有效(即使用戶登出)
JWT + Redis:簽發(fā) ──? Redis 標(biāo)記失效 ──? 即時(shí)作廢
具體應(yīng)用場(chǎng)景
Token 黑名單(登出失效)
場(chǎng)景 實(shí)現(xiàn)方式 Redis 數(shù)據(jù)結(jié)構(gòu) 用戶主動(dòng)登出 將 Token 的 jti(唯一ID)存入 Redis,設(shè)置過(guò)期時(shí)間為 Token 剩余有效期 SET blacklist:{jti} 1 EX {remaining_ttl} 后臺(tái)強(qiáng)制下線 同上,或存儲(chǔ)用戶級(jí)標(biāo)記 SET user:{id}:force_logout 1
# 登出時(shí)加入黑名單
def logout(token_jti, exp_timestamp):
ttl = exp_timestamp - current_time()
redis.setex(f"blacklist:{token_jti}", ttl, "revoked")
# 驗(yàn)證時(shí)檢查
def is_token_valid(token_jti):
return not redis.exists(f"blacklist:{token_jti}")
多端登錄控制
限制同一賬號(hào)同時(shí)登錄設(shè)備數(shù)(如 QQ/微信的"已在其他設(shè)備登錄"):
# 登錄時(shí)記錄設(shè)備
redis.lpush(f"user:{user_id}:sessions", token_jti)
redis.ltrim(f"user:{user_id}:sessions", 0, 2) # 只保留最近3個(gè)
# 驗(yàn)證時(shí)檢查當(dāng)前 Token 是否在列表中
valid_tokens = redis.lrange(f"user:{user_id}:sessions", 0, -1)
if token_jti not in valid_tokens:
raise Exception("賬號(hào)已在其他設(shè)備登錄")
Refresh Token 存儲(chǔ)
Access Token 短期有效(15分鐘),Refresh Token 長(zhǎng)期有效(7天),但需可撤銷:
# 存儲(chǔ) Refresh Token 與用戶綁定
redis.setex(
f"refresh:{user_id}:{device_id}",
7*24*3600, # 7天過(guò)期
hash(refresh_token) # 存儲(chǔ)哈希值防泄露
)
# 刷新時(shí)驗(yàn)證
stored_hash = redis.get(f"refresh:{user_id}:{device_id}")
if stored_hash != hash(incoming_refresh_token):
raise Exception("Refresh Token 無(wú)效或已輪換")
速率限制與安全防護(hù)
# 登錄失敗計(jì)數(shù)(防暴力破解)
key = f"login_attempts:{ip}"
attempts = redis.incr(key)
if attempts == 1:
redis.expire(key, 3600) # 1小時(shí)窗口
if attempts > 5:
raise Exception("嘗試次數(shù)過(guò)多,請(qǐng)稍后再試")
# 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)請(qǐng)求超過(guò)100次,可能泄露,加入黑名單
redis.setex(f"blacklist:{jti}", 3600, "suspected_leak")
架構(gòu)對(duì)比
方案 優(yōu)點(diǎn) 缺點(diǎn) 適用場(chǎng)景 純 JWT 完全無(wú)狀態(tài),擴(kuò)展性強(qiáng) 無(wú)法強(qiáng)制失效,難以追蹤 內(nèi)部服務(wù)、短期令牌 JWT + Redis 黑名單 可撤銷,保留無(wú)狀態(tài)優(yōu)勢(shì) 每次驗(yàn)證需查 Redis 常規(guī) Web 應(yīng)用 純 Redis Session 完全可控,可實(shí)時(shí)強(qiáng)制下線 有狀態(tài),擴(kuò)展需共享 Session 高安全要求(金融)
關(guān)鍵設(shè)計(jì)原則
- 最小化存儲(chǔ):Redis 只存必要的狀態(tài)標(biāo)記(如黑名單),不存完整的用戶數(shù)據(jù)
- TTL 對(duì)齊:Redis 鍵的過(guò)期時(shí)間嚴(yán)格對(duì)齊 JWT 的
exp時(shí)間,避免永久堆積 - 異步清理:黑名單過(guò)期后自動(dòng)刪除,無(wú)需人工維護(hù)
本質(zhì):Redis 讓 JWT 從"完全不可控"變?yōu)?quot;可控的無(wú)狀態(tài)",在架構(gòu)簡(jiǎn)潔性和業(yè)務(wù)需求間取得平衡。
到此這篇關(guān)于Redis在jwt中作用小結(jié)的文章就介紹到這了,更多相關(guān)Redis jwt作用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Redis實(shí)現(xiàn)庫(kù)存扣減的示例代碼
在日常開(kāi)發(fā)中有很多地方都有類似扣減庫(kù)存的操作,本文主要介紹了Redis實(shí)現(xiàn)庫(kù)存扣減的示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下2023-07-07
Redisson分布式限流器RRateLimiter的使用及原理小結(jié)
本文主要介紹了Redisson分布式限流器RRateLimiter的使用及原理小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-06-06
Redis的五種基本類型和業(yè)務(wù)場(chǎng)景和使用方式
Redis是一種高性能的鍵值存儲(chǔ)數(shù)據(jù)庫(kù),支持多種數(shù)據(jù)結(jié)構(gòu)如字符串、列表、集合、哈希表和有序集合等,它提供豐富的API和持久化功能,適用于緩存、消息隊(duì)列、排行榜等多種場(chǎng)景,Redis能夠?qū)崿F(xiàn)高速讀寫操作,尤其適合需要快速響應(yīng)的應(yīng)用2024-10-10
Redis序列化存儲(chǔ)及日期格式的問(wèn)題處理
這篇文章主要介紹了Redis序列化存儲(chǔ)及其日期格式的問(wèn)題處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
Redis中主鍵失效的原理及實(shí)現(xiàn)機(jī)制剖析
這篇文章主要介紹了Redis中主鍵失效的原理及實(shí)現(xiàn)機(jī)制剖析,本文講解了失效時(shí)間的控制、失效的內(nèi)部實(shí)現(xiàn)、Memcached 刪除失效主鍵的方法與 Redis 有何異同、Redis 的主鍵失效機(jī)制會(huì)不會(huì)影響系統(tǒng)性能等內(nèi)容,需要的朋友可以參考下2015-06-06
通過(guò)Redisson監(jiān)聽(tīng)Redis集群的Key過(guò)期事件的實(shí)現(xiàn)指南
在分布式系統(tǒng)中,監(jiān)聽(tīng) Redis 鍵過(guò)期事件是實(shí)現(xiàn)緩存失效、訂單超時(shí)取消等功能的常用方案,本文將詳細(xì)介紹如何通過(guò) Redisson 高效監(jiān)聽(tīng) Redis 集群的 Key 過(guò)期事件,需要的朋友可以參考下2025-11-11
redis使用Lua腳本解決多線程下的超賣問(wèn)題及原因解析
這篇文章主要介紹了redis使用Lua腳本解決多線程下的超賣問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05

