简体中文
  • token
  • oidc
  • refresh token
  • rotation
  • security

什么是刷新令牌轮换,为什么它很重要?

深入探讨为什么刷新令牌轮换是一种保护刷新令牌安全的有效方法。

Charles
Charles
Developer

什么是刷新令牌?

刷新令牌是一种特殊类型的令牌,用于在当前访问令牌过期时获取新的访问令牌。查看我们的上一篇文章 理解 OIDC 中的令牌 以了解更多信息。

在介绍中,我们还提到在 Logto 中,为了保护你的刷新令牌安全,我们默认实施了“刷新令牌轮换”机制。

但到底什么是“刷新令牌轮换”?它如何使我们的终端用户受益?让我们深入探讨吧!

什么是刷新令牌轮换?

刷新令牌轮换是一种机制,当使用刷新令牌获取新的访问令牌时,使之前的刷新令牌失效并颁发新的刷新令牌。这一机制确保刷新令牌在过期之前被更新。

为什么我们需要刷新令牌轮换?

刷新令牌的寿命较长,通常为几周甚至几个月。由于我们可以通过刷新令牌获得新的访问令牌,刷新令牌也成为攻击者的一个有吸引力的目标。因此,根据 OAuth 2.0 BCP,授权服务器必须采取以下措施之一来防止此类攻击。

  • 发放发送方约束的刷新令牌:客户端在刷新请求头中签名并提供一个签名 (Sec-Token-Binding),因此颁发的刷新令牌根据加密绑定到特定客户端。然而,目前只有一些本地客户端是发送方约束的,大多数现代 SPA 和移动客户端是公开的。
  • 刷新令牌轮换:授权服务器颁发一个新的刷新令牌(通常是在交换新的访问令牌时)并使前一个无效。这减轻了令牌泄露的风险。

实施刷新令牌轮换的最佳实践

在 Logto 中,当用户成功登录时,首先会在数据库中创建一个 Grant 对象,随后颁发的刷新令牌将具有引用 grantId 并指向第一个 Grant 对象。

每当发生刷新令牌轮换,之前的刷新令牌将被标记为已使用,Logto 授权服务器将用相同的 grantId 颁发一个新的刷新令牌。

假设之前的刷新令牌被泄露,那么合法客户端或攻击者都会用它来交换访问令牌。而无论是谁使用,泄露的刷新令牌都必须已经轮换并标记为已使用。其中一个人第二次使用已用的刷新令牌时,将通知授权服务器违规情况。授权服务器将撤销所有具有相同 grantId 的刷新令牌。

在上述情况下,在触发警报后,合法客户端只能通过重新登录流程再次进行身份验证以获取新的刷新令牌。而攻击者则会失去对系统的控制,并被阻挡在外。

刷新令牌轮换何时发生?

在 Logto 中,刷新令牌轮换的默认行为定义为:

  • 如果客户端是发送方约束或非公开的(例如,服务器端渲染的 web 应用程序),则刷新令牌轮换将在它达到其总生存时间 (TTL) 的 70% 时发生。
  • 如果客户端是公开客户端(例如,单页 web 应用程序),则刷新令牌每次用于交换访问令牌时都会发生轮换。令牌交换响应将返回新访问令牌和新的刷新令牌。

我如何在 Logto 中启用/禁用刷新令牌轮换?

在 Logto 管理控制台,前往 Admin Console > Applications 并选择你想切换刷新令牌轮换的应用。在应用详情页面,进入“高级设置”选项卡,滚动到底部,你会发现开关以及其他一些有用的设置。

应用详情

如果你关闭开关,你的刷新令牌将永远不会轮换,直到过期。因此,我们强烈建议始终启用刷新令牌轮换。

回顾:什么是刷新令牌轮换及其重要性?

刷新令牌轮换是一种确保应用程序中刷新令牌安全的最佳实践。当使用刷新令牌获取新的访问令牌时,它使之前的刷新令牌失效并颁发新的刷新令牌。这一机制减轻了令牌泄露的风险,确保了刷新令牌的安全。

Logto 遵循行业领先的最佳实践,并始终把用户安全放在首位。

希望这篇博客能够很好地解答你对刷新令牌轮换机制的疑问。如果还有不清楚的地方,请告诉我们。我们随时欢迎你的反馈和建议!

今天就试试 Logto,享受更安全的认证体验。