每次请求都需要刷新令牌吗?

20

我在这里是因为我对谷歌上的内容不满意。

通常我正在构建SPA,所以对我来说过程很简单:成功登录后生成JWT并在客户端发出的每个请求中使用它。

有人告诉我应该刷新令牌并为我发出的每个请求发送一个新令牌。我这样做有意义吗?我的意思是,如果有人试图黑我,嗅探请求将给黑客提供与我收到的相同的令牌,那么问题在哪里?

我的意思是,如果我在另一个请求完成之前启动请求会怎样?理论上,我会两次发送相同的令牌,其中一个请求将被拒绝。

如何正确处理这种情况?我确信这不仅仅是我自己能想到的这些。


为什么会有一个请求被拒绝?两个令牌都可以保持有效直到过期,对吧?除非你实现了某种令牌交换机制。 - Aert
将客户端的IP地址放入访问令牌中。并检查请求是否来自同一IP地址。您无需担心被盗的访问令牌。同时设置一个过期日期。 - Erçin Dedeoğlu
1个回答

31

这是安全和方便之间的妥协。

不,您不需要在每个请求中刷新令牌。但您肯定希望您的JWT在某个时刻过期。这是为了保护您免受JWT盗窃攻击,其中恶意用户可以使用窃取的访问令牌无限期地访问目标资源。

以下是处理令牌过期的方法:

  1. 实现刷新令牌流程。在认证时,您将发放访问JWT和刷新JWT。一旦访问JWT过期,您将使用刷新JWT获取新的访问JWT。
  2. 实现滑动过期。在JWT有效期的一半到期后,您会发放一个新的JWT。其示例可在此处找到。我建议在令牌可以过期的截止时间之前包含一个截止日期。例如,初始令牌有效期为20分钟,截止日期为8小时。在滑动过期8小时后,您将停止发放新令牌。

12
  1. 我们可以假设刷新令牌也可能像访问令牌一样被盗吗?如果发生这种情况,我们该怎么办?
  2. 对于滑动过期,攻击者可以像合法用户一样获取新的访问令牌。这种情况下我们应该怎么做?
- nihartrivedi810
3
如果刷新令牌被盗,后端可以将其列入黑名单,这可以防止使用该令牌生成新的访问令牌,访问令牌的问题在于它们不会与任何数据库进行检查。 - Alex Catchpole
1
那么,这意味着我必须将与刷新令牌相关的信息存储在我的数据库中,而访问令牌则不会存储在数据库中?@AlexCatch - nihartrivedi810
1
@nihartrivedi810,是的,完全正确。您的刷新令牌是用于生成新访问令牌的,您的 API 可以验证而无需进行数据库调用。 - Alex Catchpole
2
这非常有帮助。但服务器应该在什么时候发出新的刷新令牌?或者如何知道是否需要将其列入黑名单? - chris
通常情况下,当用户更改凭据,请求注销所有设备或发生安全事件时,都会通过某种方式注册安全事件。 - Jacek Gorgoń

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接