如何实现刷新令牌轮换?

Posted

技术标签:

【中文标题】如何实现刷新令牌轮换?【英文标题】:How do I implement Refresh Token Rotation? 【发布时间】:2021-11-17 17:09:09 【问题描述】:

如果我理解刷新令牌轮换的权利,这意味着每次我们请求一个新的访问令牌时,我们也会得到一个新的刷新令牌。如果多次使用刷新令牌 - 我们会使某个用户之前使用的所有刷新令牌无效,并且用户必须再次通过身份验证过程。

    这是否意味着我们需要将所有刷新令牌(所有旧令牌)存储在数据库中?

    我们不能简单地存储最后一个刷新令牌,只存储一个(尚未使用),并且每次请求获取新的访问令牌时,我们都会检查请求中发送的刷新令牌是否在数据库中,如果是这样,我们将创建一个新的访问和刷新令牌并覆盖数据库中旧的刷新令牌,这样旧的刷新令牌就不能用于获取新令牌?

    这样的刷新令牌应该存在多久?

【问题讨论】:

【参考方案1】:

    是的,但所有通常意味着“在给定的时间范围内”。时间范围将取决于您的需求 - 您希望能够识别任何潜在的刷新令牌泄漏多长时间。

    可以,但是没有比不使用令牌轮换更好的安全性。这是因为您永远不知道谁首先使用了当前令牌 - 合法用户或恶意用户窃取了您的令牌。如果是后者,那么她现在可以访问工作访问/刷新令牌对。合法用户将得到一个无效的令牌。

    这取决于您的要求、功能、安全性等。您通常会发现刷新令牌应该在几个小时内有效(通常最多 8 小时),但我设置的刷新令牌有效期为几天或甚至几个月。

【讨论】:

说到第二个答案:合法用户有凭据(登录)获取新的刷新令牌,所以即使一些恶意的人以某种方式窃取刷新令牌并使用它,一旦真正的用户登录- 恶意人员的令牌将在数据库中被覆盖(它会失效),他们将无法再获得新的访问令牌。有意义吗? 当然,但是如果合法用户一个月没有登录,那么攻击者有 30 天的时间来处理被盗的帐户,为所欲为。您不应该假设用户会以足够快的速度再次登录以阻止攻击。 我明白了,但刷新令牌轮换不一样吗?如果攻击者窃取了 RT,然后合法用户关闭了应用程序,攻击者将能够永远生成新的 RT 和 AT? 是的,这是真的。刷新令牌轮换可加强您的安全性,但不会让您的应用 100% 抵抗被盗令牌。 感谢您的回答,我还有最后一个问题。如果我们使用轮换功能,并且我们每 10 分钟请求一个新的 AT+RT,这意味着我们还必须将旧的 RT 保存在我们的 DB 中。假设我们的 RT exp 时间是一周,因此每个 RT 将在 DB 中停留大约 10070 分钟(一周减去 10 分钟)。如果我们存储在那段时间内生成的每个 RT,每个用户大约 1007 个令牌,可以吗?这是人们通常做的事情吗?

以上是关于如何实现刷新令牌轮换?的主要内容,如果未能解决你的问题,请参考以下文章

访问令牌和刷新令牌最佳实践?如何实现访问和刷新令牌

如何基于使用 Oauth2 协议的身份验证改进 JWT 访问令牌和刷新令牌?

何时应该实现刷新令牌以及如何保持无状态?

Webapi 2.0如何在访问令牌过期时实现刷新JWT令牌

OWIN 安全 - 如何实现 OAuth2 刷新令牌

如何以一定的安全性实现刷新令牌?