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

问题描述 投票:0回答:4

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

缓存已验证的 JWT 令牌以防止在同一用户的每个 API 调用上重复验证同一令牌是一个好主意吗?

java spring-boot spring-security oauth-2.0 backend
4个回答
12
投票

在内存中,JWT 访问令牌验证速度很快,您可以对每个 API 请求执行此操作。在其他情况下,可能有充分的理由缓存与令牌相关的结果,以便您避免使用特定访问令牌对每个请求重复昂贵的工作:

  • 有时,在验证令牌并识别用户之后,您可能需要对角色、业务权限等进行相当昂贵的查找 - 并且您不希望在每个 API 请求上都执行此操作。

  • API 网关解决方案通常使用缓存模式,例如缓存令牌自省结果。例如,AWS API Gateway 允许您缓存策略文档,下次收到相同令牌时可以快速查找该文档。

enter image description here

如果您缓存令牌结果,您可以使用令牌的 SHA256 哈希密钥 - 并将生存时间设置为不大于令牌的 exp 声明,如 Ankur 所示。


6
投票

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


2
投票

这不一定会增加安全问题,但您需要确保您的缓存仅在该令牌有效时存储经过验证的 JWT 数据。否则,您将在终止会话时遇到问题。此外,出于这个原因,我建议使用 LRU 缓存,这样您就不必存储此时未主动使用的令牌。

@Mehrdad HosseinNejad 声称缓存令牌增加了状态性。但是,我不会说在这种情况下这是一个关键问题,因为其他未在内存中缓存 JWT 的服务器仍然可以验证 JWT。扩展的问题是缓存可能会变得太大并且在每台服务器上消耗太多内存。再说一遍,如果 LRU 缓存使用适当的参数,我也不认为这是什么大问题。他的回答中最后的建议是使用Redis。虽然这可能是一个很好的建议,但考虑到额外的网络延迟,这可能有点矫枉过正。无论如何,内存缓存总是会更快。话虽如此,如果您想避免个别服务器重新进行验证(如果另一台服务器已经这样做了),Redis 是一个非常可行的解决方案。


0
投票

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

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


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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.