如果我了解最佳实践,JWT 通常有一个短暂的到期日期(约 15 分钟)。因此,如果我不希望我的用户每 15 分钟登录一次,我应该每 15 分钟刷新一次我的令牌。
我需要保持 7 天的有效会话(从用户体验的角度来看),所以我有两种解决方案:
- 使用长寿命的 json 网络令牌(1 周)——不好的做法?
- 旧的 json Web 令牌过期后获取新的 json Web 令牌(JWT 15 分钟,1 周内允许刷新)
我强制使用 HTTPS。
JWT 标准没有谈到刷新令牌。刷新过期令牌是一个好策略吗?
如果我了解最佳实践,JWT 通常有一个短暂的到期日期(约 15 分钟)。因此,如果我不希望我的用户每 15 分钟登录一次,我应该每 15 分钟刷新一次我的令牌。
我需要保持 7 天的有效会话(从用户体验的角度来看),所以我有两种解决方案:
我强制使用 HTTPS。
JWT 标准没有谈到刷新令牌。刷新过期令牌是一个好策略吗?
刷新令牌以通过身份验证服务确认令牌持有者仍然具有访问权限。这是必需的,因为令牌的验证是通过加密方式进行的,无需联系身份验证服务。这使得对令牌的评估更加有效,但不可能在令牌的生命周期内收回访问权限。
如果不经常刷新,一旦授予令牌访问权限,就很难删除它们。如果您将令牌的生命周期设为一周,您可能需要实施另一种方法来处理,例如,删除用户帐户、更改密码(或其他需要重新登录的事件)以及更改访问权限为用户。
所以坚持频繁的刷新间隔。每 15 分钟一次应该不足以损害您的身份验证服务的性能。
编辑 2019 年 11 月 18 日:根据@Rishabh Poddar
评论,您应该在每次使用旧的刷新令牌时生成一个新的刷新令牌。有关详细信息,请参阅此会话管理的深入讨论。
您应该每 15 分钟刷新一次令牌,但您不需要让用户再次进行身份验证。
例如,通过这种方式,您可以在用户更改密码后要求进行身份验证。
通常对于 JWT,您将拥有一个access
有效期约为 15 分钟的refresh
令牌,以及一个有效期更长(例如 24 小时)的令牌。
要访问 API 端点,浏览器只发送access
令牌。如果它收到 401 HTTP 状态,然后通过将refresh
令牌提交到指定的端点来刷新它的令牌,检索两个新令牌(刷新和访问)并继续。
这是美妙的事情。两个令牌都有到期日期,两个令牌都已签名——因此,在执行特定于令牌的验证之前,您应该始终使用相同的逻辑验证所有令牌(无论访问或刷新)。
当用户进行身份验证时,您可以获得配置为 7 天的访问令牌。然而,这并不是安全方面的最佳实践,因为如果需要,撤销访问会更加困难。当然,这取决于您的需求,但最佳做法是获取刷新令牌并使用它在每个周期刷新访问令牌。