刷新过期的 JWT 令牌是一个好策略吗?

信息安全 jwt
2021-08-15 06:33:06

如果我了解最佳实践,JWT 通常有一个短暂的到期日期(约 15 分钟)。因此,如果我不希望我的用户每 15 分钟登录一次,我应该每 15 分钟刷新一次我的令牌。

我需要保持 7 天的有效会话(从用户体验的角度来看),所以我有两种解决方案:

  • 使用长寿命的 json 网络令牌(1 周)——不好的做法?
  • 旧的 json Web 令牌过期后获取新的 json Web 令牌(JWT 15 分钟,1 周内允许刷新)

我强制使用 HTTPS。

JWT 标准没有谈到刷新令牌刷新过期令牌是一个好策略吗?

4个回答

刷新令牌以通过身份验证服务确认令牌持有者仍然具有访问权限。这是必需的,因为令牌的验证是通过加密方式进行的,无需联系身份验证服务。这使得对令牌的评估更加有效,但不可能在令牌的生命周期内收回访问权限。

如果不经常刷新,一旦授予令牌访问权限,就很难删除它们。如果您将令牌的生命周期设为一周,您可能需要实施另一种方法来处理,例如,删除用户帐户、更改密码(或其他需要重新登录的事件)以及更改访问权限为用户。

所以坚持频繁的刷新间隔。每 15 分钟一次应该不足以损害您的身份验证服务的性能。

编辑 2019 年 11 月 18 日:根据@Rishabh Poddar评论,您应该在每次使用旧的刷新令牌时生成一个新的刷新令牌。有关详细信息,请参阅此会话管理的深入讨论

您应该每 15 分钟刷新一次令牌,但您不需要让用户再次进行身份验证。

  • 认证后,分发一个有效期为 15 分钟的 JWT。
  • 让客户端在令牌过期时刷新令牌。如果在 7 天内完成,则无需重新认证即可获得新的 JWT。
  • 在会话处于非活动状态 7 天后,需要在分发新的 JWT 令牌之前进行身份验证。

例如,通过这种方式,您可以在用户更改密码后要求进行身份验证。

通常对于 JWT,您将拥有一个access有效期约为 15 分钟的refresh令牌,以及一个有效期更长(例如 24 小时)的令牌。

要访问 API 端点,浏览器只发送access令牌。如果它收到 401 HTTP 状态,然后通过将refresh令牌提交到指定的端点来刷新它的令牌,检索两个新令牌(刷新和访问)并继续。

这是美妙的事情。两个令牌都有到期日期,两个令牌都已签名——因此,在执行特定于令牌的验证之前,您应该始终使用相同的逻辑验证所有令牌(无论访问或刷新)。

当用户进行身份验证时,您可以获得配置为 7 天的访问令牌。然而,这并不是安全方面的最佳实践,因为如果需要,撤销访问会更加困难。当然,这取决于您的需求,但最佳做法是获取刷新令牌并使用它在每个周期刷新访问令牌。