Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中保存解码和验证的JWT/access令牌_Java_Access Token_Jwt - Fatal编程技术网

在Java中保存解码和验证的JWT/access令牌

在Java中保存解码和验证的JWT/access令牌,java,access-token,jwt,Java,Access Token,Jwt,我是API所有者,将解码作为授权头的一部分传递的JWT或访问令牌,以使用我的服务。因为解码是一个代价高昂的过程,所以我计划将令牌保存在弱哈希映射或CacheBuilder中 private Map cache = new WeakHashMap(); 或 LoadingCache-graphs=CacheBuilder.newBuilder() .expireAfterWrite(10,时间单位:分钟) 首先,这是一种好的做法吗 第二,如果不是,除了每次验证之外,我还有什么其他选择呢?不

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

private Map cache = new WeakHashMap();  

LoadingCache-graphs=CacheBuilder.newBuilder()
.expireAfterWrite(10,时间单位:分钟)
首先,这是一种好的做法吗


第二,如果不是,除了每次验证之外,我还有什么其他选择呢?

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

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


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

我使用的不是数据库,而是不会跨节点复制的本地服务器缓存。我只是想节省解码、验证签名的成本,并做更多的事情,在我的例子中,这需要一个网络调用(从JWT中的用户标识符获取用户详细信息)。我还研究了SpringSecurity,他们似乎出于类似的原因正在使用ehcache。不要过早地进行优化。试着看看实际解码和签名验证的速度有多慢。然后将其与请求本身的执行(业务逻辑)进行比较。通过执行压力测试来正确测量它。我几乎可以肯定这将是微不足道的。对于1%的降低速度,您可以更轻松地部署到集群。这是一个很好的折衷办法,不是吗?抱歉,但我仍然不相信,因为除了我已经拥有的maven pom文件之外,我没有为部署添加其他组件。而且我相信这是一个值得优化的情况。我只有这些问题1。这是一个好的做法吗(实例特定的缓存而不是分布式缓存或DB,并且没有节点间交换此信息的调用。如果一个实例接收到一个已由其他实例验证的令牌,它仍然会验证它,因为它不知道其他实例在其缓存中有什么)?2.除了每次验证之外,我还有什么其他选择?
LoadingCache<Key, Graph> graphs = CacheBuilder.newBuilder()
   .expireAfterWrite(10, TimeUnit.MINUTES)