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

tom*_*ing 5 security authentication token jwt

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

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

我最近一直在更多地了解这个身份验证方案,在我的阅读中,我没有对这个问题提出强烈的意见或结论性的答案。一些简短的谷歌搜索和搜索 Stack Overflow 也没有产生任何有意义的答案。

感谢您的时间!

Joe*_*Kir 13

答案:没有

为什么?

我们所说的 2 个代币是

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

据我所知,从密码学角度来看,HMAC、RSA 或 ECDSA 的密钥使用没有上限。因此,使用相同的密钥进行签名对于防止存在伪造是完全合理的。

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

  • 我接受这个答案是因为我觉得它最直接地解决了眼前的问题,但鼓励将来看到这个答案的人也看看 Marek Puchalski 的答案,因为它提出了另一个重要的观点和一个很好的观点。谢谢两位的回答! (2认同)

0xT*_*3X0 8

从密码学方面来看,我可以同意已接受的答案。

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

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


Mar*_*ski 5

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

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