为什么使用刷新令牌

信息安全 验证 令牌 jwt
2021-08-15 05:11:03

阅读有关 JWT 的信息,我发现将刷新令牌与短期令牌一起包含在内是一种常见的做法。所以通常看起来你有一个短暂的令牌,持续时间很短,比如 15 分钟,还有一个刷新令牌,它在过期时更新这个令牌。据我了解,如果短期令牌已过期,应用程序必须检查以确保刷新令牌未被撤销(检查数据库)。如果没有,则发行一个新的短期令牌。我试图理解为什么不只拥有一个短暂的令牌。

假设 jwt 令牌包含使用该令牌的用户的用户名,并在 1 小时后过期。当它过期时,我的应用程序服务器不能验证这个令牌以确保它实际上已经过期并且它是由我发出的,如果是这样检查(在数据库内部)这个用户可以更新他们的令牌并更新它。这与拥有刷新令牌本质上是否不同,但它更简单一些,因为我用户只有 1 个令牌而不是 2 个?我看不到拥有刷新令牌的好处?

1个回答

我假设您正在使用一些专有的身份验证解决方案,它使用 JWT 和刷新令牌,但与 OpenID Connect 无关。

JWT 令牌是无状态的,刷新令牌通常是有状态的。

您应该查看有状态令牌与无状态令牌的优缺点:

  • 无需额外的 DB/Service 调用即可验证无状态令牌(因此它们更快/更容易验证),但无法撤销它们(没有可靠的注销)。
  • 有状态的令牌可能会被撤销(可靠的注销),但它们必须每次都通过 DB/Service 调用进行验证(因此它们更慢)。

长期存在的 JWT 代币会增加安全风险——如果代币被盗,攻击窗口会很长。

结合刷新令牌,您可以在中间的某个地方获得解决方案:验证速度快,注销更可靠。

根据使用哪个令牌(客户端与服务器),您可以实现自动刷新。但是,对于此类专有解决方案,如果出于性能原因需要,您确实可以使用带有验证缓存的单个令牌。