我是 API 所有者,将解码作为授权 header 的一部分传递的 JWT 或访问 token ,以便使用我的服务。由于解码是一个成本高昂的过程,因此我计划将 token 保存在弱 HashMap 或 CacheBuilder 中
private Map cache = new WeakHashMap();
或
LoadingCache<Key, Graph> graphs = CacheBuilder.newBuilder()
.expireAfterWrite(10, TimeUnit.MINUTES)
首先,这是一个好的做法吗?
第二,如果不是,除了每次都验证之外我还有什么其他选择?
最佳答案
不,这不是一个好的做法(如果您特别谈论 JWT)。 JWT 的主要目标之一是使服务器免于查找任何其他位置( session 、本地存储、数据库)。通过这种方式,您可以获得真正的无状态 API,服务器可以以相同的方式处理请求,无论这是第一个客户端的请求还是第 100 个客户端的请求。拥有这种灵活性大大降低了分布式部署(即集群)的复杂性。每个节点只需要知道如何验证 JWT(如果已加密,则对其进行解密),通常只需为其提供共享 key 即可。没有 session 复制,没有数据库查找,没有节点间通信。
与数据库查找或 session 复制机制相比,检查 token (检查签名并在必要时解密)的成本可以忽略不计。仅在单个服务器节点的情况下,您对 HashMap 的争论才会产生更好的性能。然而现在,您希望编写一个可以轻松部署到集群的 API。
您需要决定是否加密 JWT(这可以节省一些处理时间)。通常加密根本没有必要,人们只是添加它,因为它听起来“更安全”。考虑一下您将放入代币中的数据,如果落入坏人之手,它是否会被滥用。
关于java - 在 Java 中保存解码和验证的 JWT/访问 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33425879/