如何实现 Refresh Token 轮换

How to implement Refresh Token rotation

我是这个访问令牌和刷新令牌的新手,如果有任何错误,请指正。据我所知,刷新令牌轮换意味着每次用户请求 AT(具有有效 RT)时,都会提供新的 AT1 和 RT1 对。所以下次用户应该使用新的RT1来更新AT,并且会得到一对新的AT2和RT2。

我的问题是:

  1. 要实现 RT Rotation,我们需要将 RT 存储在数据库中。那么我们需要在数据库中存储哪个 RT 是旧的还是新发布的 RT。根据 ,我们需要存储所有过期的 RT,并且需要为每个 AT 更新请求检查 DB,如果它在 DB 中,那么我们需要立即使刷新令牌系列无效。但是如果我们这样做,我们可能需要在数据库中为单个用户存储更多数量的 RT,当考虑系统中的所有用户时,这将是巨大的。这是实施 RT 旋转的正确方法吗?如果不是,什么是实施 RT 旋转的正确方法?

  2. 在此Documentation中关于RT轮换(在自动重用检测第4点下),他们提到这样立即使刷新令牌系列无效。那么这是否意味着从初始身份验证发出的每个 RT 都将具有任何相同的特征以将它们标识为一个令牌系列(因为它被称为刷新令牌系列)

  3. 当用户从系统注销时,我们如何使 RT 无效?。我不认为简单地从 cookie 中删除 RT 不是正确的方法,因为例如,如果 RT 的过期时间是一天并且用户在其过期时间之前注销,RT 仍然可用 (除非我们将以前的 RT 存储在 DB 中并检查 AT 的下一次更新)直到达到其到期时间。那么如何解决呢。

广告 1。您可以采用任何一种方式 - 将当前 RT 存储在数据库中并检查它是否存在,或者存储所有使用过的 RT 并检查当前 RT 是否不存在。两者都会起作用。使用后一个选项,您可以获得额外的好处,即如果您看到有人试图重复使用 RT,则可以撤销所有 RT。另一方面,正如您所指出的,这可能意味着数据库将变得非常大。这就是您在设计系统时必须做出的决定:我想提供更好的 RT 安全性,但我需要在更大的数据库上花费更多的钱。

当然,您不必无限期地保留所有令牌。检查是否有人重复使用了两年前的令牌没有任何附加价值。

广告。 2. 不同的系统可以有不同的方式来决定什么是“刷新令牌系列”,但我会说这些是为给定用户和客户端发布的令牌。也许在某些情况下,您可以将其限制为给定的受众。在某些身份服务器中,您将保存某种同意对象以及与此同意对象相关的令牌。这也可以很好地识别您需要撤销的所有令牌。

广告。 3. 访问和刷新令牌并不意味着用作会话机制。令牌刚刚过期,没有用户注销的概念。如果你真的想要这种功能,你将不得不在数据库中保存关于令牌的信息以及用户是否主动注销的信息。如果是这样,那么您可以拒绝这些令牌。不过,这是一种解决方法,通常在这种情况下使用会话会更直接。