JWT 的特性是「簽發後就是自給自足」——只要驗證簽章與過期時間,伺服器就信任它。
問題來了:如果我想強制某個使用者立即登出,要怎麼辦?
常見場景:
如果沒有黑名單,JWT 會在到期前一直有效,無法「主動撤銷」。
因此我們需要 黑名單(Blacklist) 機制。
Token 標識(jti)
在簽發 JWT 時,附加一個唯一的 jti
(JWT ID)。
這樣每張 Token 都能被唯一識別。
黑名單儲存
當使用者登出、或管理員撤銷權限時,把該 jti
加入黑名單。
檢查機制
jti
是否在黑名單。自動過期
黑名單項目不需要永久保存,只要設定 TTL = Token 的剩餘壽命,就能自動清除。
/logout
jti
,放進黑名單案例
小明在公司電腦登入系統,下班前忘了登出。
他回家後在手機點選「強制登出全部裝置」。
後端就把所有屬於小明的 Refresh Token jti
加進黑名單。
→ 結果:公司電腦的 Token 馬上失效。
jti
加入黑名單案例
客服人員離職,公司 IT 把他的帳號停用。
雖然這個人還握有一張有效的 Token,但因為黑名單檢查,API 都會回 401 Unauthorized
。
除了 Access Token,也要特別處理 Refresh Token。
案例
小華手機被盜,攻擊者偷到他的 Refresh Token。
後端偵測到可疑登入後,把這個 Refresh Token 加入黑名單,並封鎖其對應的所有 Access Token。
攻擊者就算嘗試 /refresh
也會被拒絕。
黑名單模式:
預設所有 Token 都有效,只有列入黑名單的才無效。
→ 優點:簡單;缺點:需要存黑名單。
白名單模式(Session Store):
每次登入簽發 Token 時,記錄在伺服器的「有效清單」中。
API 驗證時除了驗簽,也要查「這張 Token 是否仍在清單內」。
→ 優點:能更精細控管(例如角色改變即失效)。
→ 缺點:失去「完全無狀態」的好處。
實務上:
打了這麼多,我覺得知識量很豐富,但因此變得很冗長,有點枯燥。但這是學習資安很重要的一環,在今天,我們討論了 如何讓 JWT 支援強制登出,方法如下:
jti
這就是今天的內容了,感謝大家的收看,我們明天見!