JWT 身份验证方案中的刷新令牌是否应使用与访问令牌不同的秘密进行签名?

Should Refresh Tokens in JWT Authentication Schemes be Signed with a Different Secret than the Access Token?

我有一个非常简单的问题,基本上如标题所述。

在实施包含 short-lived 访问令牌和长期刷新令牌的 JWT 身份验证方案时,这两种令牌类型是否应该使用不同的秘密进行签名?

我最近一直在学习更多关于这个身份验证方案的知识,在我的阅读中,我没有遇到这个问题的强烈意见或结论性答案。一些简短的谷歌搜索和搜索 Stack Overflow 也没有产生任何有意义的答案。

感谢您的宝贵时间!

答:

为什么?

我们所说的 2 个代币是

  1. 访问令牌
  2. 刷新令牌

据我所知,对于 HMAC、RSA 或 ECDSA,在密码学上没有密钥使用的上限。因此,使用相同的密钥签名是完全合理的,可以防止 existential forgery.

但是,如果您的访问令牌和刷新令牌颁发端点位于不同的服务器上,从密钥管理安全的角度来看,您可能希望使用不同的秘密进行签名以包含两个秘密之一的妥协。

我的直觉告诉我将两个令牌的秘密分开。但不是出于安全原因。我的意思是,如果其中一个秘密泄露,那么你就完蛋了。如果有一个或两个秘密,攻击面是恕我直言。

我保密的原因是可用性和错误预防。开发人员有时倾向于做一些愚蠢的事情,比如混合东西。有一天,开发人员将尝试发送一个刷新令牌来代替访问令牌。如果秘密不同 - 令牌将被简单地拒绝。如果秘密是相同的——接下来发生的事情超出了我的想象(所以我想避免这种情况)。

从密码学的角度来看,我同意接受的答案。

但要考虑的一件事是,如果您使用相同的密钥,则应该注意如何验证刷新令牌。如果您只是检查 JWT 是否有效,可以发送一个访问令牌作为刷新令牌,并从先前的有效访问令牌中获取一个新的访问令牌。

因此,您应该使用不同的秘密,或者注意在 JWT 正文中指定并验证一个标志,指示这是访问令牌还是刷新令牌。