是否可以缓存已验证的 JWT 令牌以防止在 spring-boot 应用程序中重复验证过程

arm*_*man 2 java backend spring-security oauth-2.0 spring-boot

我们有一个带有微服务架构的 spring-boot 应用程序。
我们有一个单独的身份验证服务,它提供使用 RS256 算法签名的 JWT 令牌。
此令牌在从客户端到我们的主应用程序服务器的每个请求中发送。我有用于验证签名的公钥。
现在这个 JWT 令牌在来自客户端的每个 API 请求中发送,因为我们的大多数 URL 都受到保护。

缓存已经验证的 JWT 令牌以防止在来自同一用户的每个 API 调用中重复验证相同的令牌是否是一个好主意?

小智 6

您可以缓存 JWT 令牌,但必须设置缓存超时,该超时应等于令牌超时。


Gar*_*her 5

缓存令牌验证结果可能有充分的理由。我只会在必要时这样做,因为内存验证很快。

有时,在验证令牌并识别用户之后,您可能想要对角色等进行相当昂贵的查找 - 而您不想在每个 API 请求上都执行此操作

如果缓存,则存储令牌的 SHA256 哈希值 - 并将生存时间设置为不超过令牌的 exp 声明,如 Ankur 所示。

我的帖子进一步探讨了这个话题。

API Gateway 解决方案经常使用这种模式。例如,AWS API Gateway 允许您缓存策略文档,以便在下次收到相同令​​牌时快速查找该文档。

在此处输入图片说明


Meh*_*ami 1

JWT 的主要目的是没有 服务器端状态

这意味着服务器不会存储任何信息,会话也不会。


  • 如果您缓存 JWT,那么您的服务器就有State

    • 当您以后想要扩展应用程序(具有多个实例)时,您可能会遇到麻烦,并且您还可能面临一些安全问题
  • 如果您坚持使用有状态服务器,那么最好使用像Redis这样的缓存服务器,并注意每行(每个JWT)的存在时间(生命周期)必须等于其到期日期。

按照标准,在服务器中缓存 JWT 不是一个好主意(使服务器有状态不是一个好主意)