java - 服务器签名声明 : REST Authentication without server side caching

标签 java rest authentication cryptography

我正在将我的 Java Web 应用程序从基于 session 的应用程序迁移到 RESTful 应用程序,以减少/消除 session 的内存占用。

为此提出的常见方法是让服务器在身份验证后生成 token 。客户端在本地存储此 token 并在后续的每个请求中发送它。服务器维护生成的 token 的查找表以验证它们。查找表通常缓存在内存中,因为每个请求都需要进行身份验证/授权。

在我看来,这种方式和使用Java内置的Session机制没有本质上的区别。它确实在负载平衡和存储查找表等方面为您提供了一些灵活性。但它并不能消除为服务器上每个经过身份验证的用户分配一定量内存(RAM 或存储)的需要。

所以我想到了这个:

  1. 用户将凭据发送到服务器。服务器验证它并返回 签名的有效负载 - 比如说包含以下信息的 JSON 对象 - 访问控制列表、 token 过期时间戳等
  2. 此 JSON 对象以及为该对象生成的服务器签名由客户端与每个请求一起发送到服务器。
  3. JSON 对象基本上是一个声明,声明“我是某某,我有权访问这些资源”。当服务器收到此声明时,它会为其生成一个签名,并将其与客户端随声明一起发送的签名进行比较。如果它们匹配,则意味着该声明未被客户端篡改,并且必须是由服务器本身生成的。
  4. 因此服务器基本上可以将声明视为真实并从那里继续。

这种方案的优点是服务器不必在内存中维护查找表,也不必为每个请求访问数据库进行身份验证/授权。

您对这种方法有何看法?这个方案有名字吗?有没有任何库或框架可以实现类似的功能?

我知道服务器私钥的保密性在该方案中变得极其重要。此外,在过期之前撤销授予的 token 是不可能的,但这些是单独的问题,具有相当简单的解决方法。

最佳答案

这种方法的主要问题是撤销。当您发出签名 token 时,您将需要一种机制来撤销该签名所赋予的权限(如果从某个设备注销,或者从某个登录检测到可疑 Activity )。这可能会让您返回到需要在每次访问时进行查找的情况。这可以通过将撤销分发到处理节点来优化性能,同时增加分发这些黑名单的复杂性。

您很可能还需要管理过期时间,这样,当黑名单过期时,黑名单也应该被垃圾收集。

过期后,就需要使服务器与挂钟保持同步,这肯定会带来更多麻烦。

关于java - 服务器签名声明 : REST Authentication without server side caching,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44613932/

相关文章:

android - 使用 CouchDB Android 的用户身份验证

java - 定期运行Java程序

java - 为什么我的组件超出了边界,请帮助我将其与必要的代码对齐

java - XMLRootElement 在 JAVA Jersey RESTful 中删除失败

java - Jersey @Path 注释在类级别是必需的

使用 bCrypt 哈希密码登录 PHP

java - SEAM FacesMessage 未显示

java - 如何避免 Base 64 的警告?

java - 使用 Jersey 进行基于用户的访问的 REST 设计

postgresql - Liquibase 无法使用 @ 和 ! 对用户进行身份验证在密码中