【问题标题】:Saving decoded and validated JWT/access tokens in Java在 Java 中保存解码和验证的 JWT/访问令牌
【发布时间】:2016-01-30 06:46:31
【问题描述】:

我是 API 所有者,将解码作为授权标头的一部分传递的 JWT 或访问令牌,以使用我的服务。由于解码是一个代价高昂的过程,我打算将令牌保存在弱哈希映射或 CacheBuilder 中

private Map cache = new WeakHashMap();  

LoadingCache<Key, Graph> graphs = CacheBuilder.newBuilder()
   .expireAfterWrite(10, TimeUnit.MINUTES)

首先,这是一个好习惯吗?

其次,如果没有,除了每次都验证之外,我还有什么其他选择?

【问题讨论】:

    标签: java access-token jwt


    【解决方案1】:

    不,这不是一个好的做法(如果您特别谈论 JWT)。 JWT 的主要目标之一是让服务器免于查找任何其他位置(会话、本地存储、数据库)。通过这种方式,您可以获得真正无状态的 API,服务器可以以相同的方式处理请求,无论它是第一个客户端的请求还是第 100 个请求。具有这种灵活性大大降低了分布式部署(即集群)的复杂性。每个节点只需要知道如何验证 JWT(如果加密则解密),通常只需为其提供共享密钥即可。没有会话复制,没有数据库查找,没有节点间通信。

    与数据库查找或会话复制机制相比,检查令牌(检查签名并在必要时解密)的成本可以忽略不计。仅在单个服务器节点的情况下,您使用哈希映射的参数会产生更好的性能。然而现在,您想要编写一个非常容易部署到集群的 API。

    您需要决定是否加密 JWT(这可以节省一些处理时间)。通常加密根本没有必要,人们只是添加它,因为它听起来“更安全”。考虑一下您将放入令牌中的数据,如果它落入坏人之手,是否会被滥用。

    【讨论】:

    • 我使用的不是数据库,而是本地服务器缓存,不会跨节点复制。我只是想节省解码成本、验证签名并做更多的事情,就我而言,这需要网络调用(从 JWT 中的用户标识符获取用户详细信息)。我还查看了 Spring Security,他们似乎出于类似的原因使用 ehcache。
    • 不要过早优化。尝试看看在实践中实际解码和签名验证有多慢。然后将其与请求本身的执行(商务逻辑)进行比较。通过执行压力测试来正确测量它。我几乎可以肯定这将是微不足道的。对于这 1% 的减慢,您可以更轻松地部署到集群。不是很好的权衡吗?
    • 对不起,但我仍然不相信,因为除了我已经拥有的 maven pom 文件之外,我没有添加其他用于部署的组件。我也确信这是一个值得优化的情况。我只有这些问题 1. 这是一个好习惯吗(实例特定的缓存而不是分布式缓存或数据库,并且没有交换此信息的节点间调用。如果一个实例接收到一个已经被其他实例验证过的令牌,它仍然会验证它是因为它不知道缓存中有哪些其他实例)? 2.“除了每次都验证”我还有哪些选择?
    猜你喜欢
    • 2021-08-24
    • 2020-10-27
    • 2021-03-07
    • 2021-11-16
    • 2013-09-11
    • 2019-06-02
    • 2022-10-15
    • 1970-01-01
    • 2018-02-27
    相关资源
    最近更新 更多