如何实现刷新令牌轮换?
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 个令牌,可以吗?这是人们通常做的事情吗?以上是关于如何实现刷新令牌轮换?的主要内容,如果未能解决你的问题,请参考以下文章