繁體中文(台灣)
  • token
  • oidc
  • refresh token
  • rotation
  • security

什麼是刷新令牌輪替及其重要性?

深入探索為何刷新令牌輪替是一種有效保護刷新令牌安全的方法。

Charles
Charles
Developer

什麼是刷新令牌?

刷新令牌是一種特殊類型的令牌,用於在當前訪問令牌到期時獲取新的訪問令牌。查看我們之前的文章理解 OIDC 中的令牌來了解更多。

在介紹過程中,我們也提到,在 Logto 中,為了保護你的刷新令牌安全,我們已經默認執行了“刷新令牌輪替”機制。

但究竟什麼是“刷新令牌輪替”?它如何使我們的最終用戶受益?讓我們深入探討!

什麼是刷新令牌輪替?

刷新令牌輪替是一種機制,當使用刷新令牌獲取新的訪問令牌時,無效舊的刷新令牌並發行新的刷新令牌。此機制確保刷新令牌在到期之前更新。

為什麼我們需要刷新令牌輪替?

刷新令牌的壽命較長,通常以週或月計算。由於我們可以通過刷新令牌獲取新的訪問令牌,刷新令牌對攻擊者來說也成為一個有吸引力的目標。因此,根據 OAuth 2.0 BCP,授權伺服器必須採取以下措施之一來防止此類攻擊。

  • 發行發件人約束的刷新令牌:客戶端在刷新請求標頭中簽署並提供簽名(Sec-Token-Binding),使發行的刷新令牌在密碼學上與特定客戶端綁定。然而,目前只有部分原生客戶端是發件人約束的,而大多數現代單頁應用和移動客戶端是公開的。
  • 刷新令牌輪替:授權伺服器發行新的刷新令牌(通常在兌換新的訪問令牌時)並使舊的刷新令牌無效。這降低了令牌洩露的風險。

實施刷新令牌輪替的最佳實踐

在 Logto 中,當用戶成功登錄時,會首先在數據庫中創建一個 Grant 對象,隨後發行的刷新令牌將有一個引用 grantId,並指向最初的 Grant 對象。

每當發生刷新令牌輪替時,之前的刷新令牌將標記為已使用,Logto 授權伺服器將使用相同的 grantId 發行一個新的刷新令牌。

假設之前的刷新令牌洩露,那麼不論是合法客戶端還是攻擊者都將用它來兌換訪問令牌。不論是誰這樣做了,洩露的刷新令牌都必須已經被輪替並標記為已使用。使用已用刷新令牌的其中之一將通知授權伺服器洩露狀況。授權伺服器將撤銷所有相同 grantId 的刷新令牌。

在上面的情況中,在觸發警報後,合法的客戶端只能通過重新登錄流程獲取新的刷新令牌。而攻擊者則會失去對系統的控制並被阻擋在外。

什麼時候發生刷新令牌輪替?

在 Logto 中,刷新令牌輪替的預設行為定義如下:

  • 如果客戶端是發件人約束的或非公開的(例如,服務器端渲染的 web 應用),則在達到其總生存時間 (TTL) 的 70% 時進行刷新令牌輪替。
  • 如果客戶端是公開的(例如,單頁 web 應用),則每次用於兌換訪問令牌時發生刷新令牌輪替。令牌交換響應將返回一個新的訪問令牌和一個新的刷新令牌。

如何在 Logto 中啟用/禁用刷新令牌輪替?

在 Logto 管理控制台中,導航到 Admin Console > Applications 並選擇你想要切換刷新令牌輪替的應用。在應用詳情頁,轉到“高級設置”標籤,滾動到最底部,你會找到一個開關以及其他一些有用的設置。

應用詳情

如果關閉開關,你的刷新令牌將永遠不會被輪替直到過期。因此,我們強烈建議始終啟用刷新令牌輪替。

總結:什麼是刷新令牌輪替及其重要性?

刷新令牌輪替是一種確保你的應用中刷新令牌安全的最佳實踐。當使用刷新令牌獲取新的訪問令牌時,它使舊的刷新令牌失效並發行新令牌。此機制降低了令牌洩露的風險,確保你的刷新令牌安全。

Logto 遵循行業領先的最佳實踐,始終將用戶安全放在首位。

希望這篇博客能夠很好地解釋你對刷新令牌輪替機制的疑問。如果仍有不清楚的地方,請告訴我們。我們歡迎你的反饋和建議!

今天就試用 Logto,擁抱更安全的身份驗證體驗。