在Java中保存已解码和验证的JWT /访问令牌

时间:2015-10-29 22:39:30

标签: java access-token jwt

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

private Map cache = new WeakHashMap();  

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

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

第二,如果没有,除了每次验证之外还有哪些其他选择?

1 个答案:

答案 0 :(得分:2)

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

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

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