繁體中文(香港)
什麼是刷新令牌輪換及為什麼它很重要?
深入了解並討論為什麼刷新令牌輪換是一種有效保護刷新令牌安全的方法。
什麼是刷新令牌?
刷新令牌是用於在當前訪問令牌過期時獲取新訪問令牌的一種特殊類型的令牌。查看我們之前的文章 了解 OIDC 中的令牌 以了解更多資訊。
在介紹過程中,我們還提到在 Logto,為了保護你的刷新令牌安全,我們默認啟用了“刷新令牌輪換”機制。
但究竟什麼是“刷新令牌輪換”?它如何造福我們的最終用戶?讓我們深入了解!
什麼是刷新令牌輪換?
刷新令牌輪換是一種機制,當刷新令牌被用來獲得新訪問令牌時,使以前的刷新令牌失效並發行新的。此機制確保刷新令牌在過期前得到更新。
為什麼我們需要刷新令牌輪換?
刷新令牌的生命週期較長,通常是以週或甚至月計算。由於我們可以通過刷新令牌獲得新訪問令牌,刷新令牌因此成為攻擊者的誘人目標。因此,根據 OAuth 2.0 BCP,授權服務器必須採取以下措施之一來防止此類攻擊。
- 發行發送者約束的刷新令牌:客戶端在刷新請求標頭中簽署並提供一個簽名 (
Sec-Token-Binding
),因此發行的刷新令牌在加密上綁定到特定客戶端。然而,現今只有一些本地客戶端是發送者約束的,大多數現代 SPA 和移動客戶端是公共的。 - 刷新令牌輪換:授權服務器發行新刷新令牌(通常在兌換新訪問令牌時)並使以前的失效。這降低了令牌洩漏的風險。
實施刷新令牌輪換的最佳實踐
在 Logto 中,當用戶成功登入時,會首先在資料庫中創建一個 Grant
對象,隨後發行的刷新令牌將有一個引用 grantId
,並指向最初的 Grant 對象。
每當發生刷新令牌輪換時,先前的刷新令牌將被標記為已使用,Logto 授權服務器將發行具有相同 grantId
的新刷新令牌。
假設之前的刷新令牌洩露,那麼不管合法客戶端還是攻擊者都會使用它來兌換訪問令牌。無論是誰,洩漏的刷新令牌一定已經被輪換並標記為已使用。使用過的消耗令牌的其中之一會通知授權服務器出現了違規。授權服務器將撤銷所有具有相同 grantId
的刷新令牌。
在上述情況下,觸發警報後,合法客戶端只能通過重新登入流動再次獲取新刷新令牌。而攻擊者則會失去對系統的控制並被阻止在外。
什麼時候發生刷新令牌輪換?
在 Logto 中,刷新令牌輪換的默認行為定義為:
- 如果客戶端是發送者約束的或非公共的(例如,服務器端渲染網絡應用程序),則刷新令牌輪換會發生在其總生存時間(TTL)的 70% 時到達。
- 如果客戶端是公共客戶端(例如,單頁網絡應用),刷新令牌輪換每次被用於兌換訪問令牌時都會發生。令牌交換的響應會返回一個新的訪問令牌和一個新的刷新令牌。