java - JWT 的 REST 安全性

标签 java rest spring-mvc authentication jwt

我最近发现了用于 token 身份验证 + 授权的 JWT。 我认为将用户信息包装在 token 中非常有用,因此我尝试在 Java/Spring web 项目中使用它。

起初,我的印象是:如果我拥有 token 中的所有用户数据,我就不需要将其存储在应用程序数据库中,也不需要为每个服务请求检索用户 + session 信息。这太棒了,可以有效提高服务访问性能。

但现在我对我的用例的 JWT“限制”有一些疑问。例如:如果用户被服务管理员禁用并且最后生成的 token 尚未过期怎么办?即使实际上未授权,用户也可以访问该服务...

这是 JWT 的限制还是我遗漏了什么?你能澄清我的疑问吗?

最佳答案

JWT 是独立的。优点之一是它不需要服务器 session 存储,因为数字签名保护了内容。

在 JWT token 到期时间之前使其失效的原因有多种:帐户删除/阻止/暂停、密码更改、权限更改、用户被管理员注销。看看Invalidating JSON Web Tokens

这是一个普遍的需求,根据您的用例,可以应用或组合多种技术

  1. 删除客户端 token

  2. token 黑名单:存储在注销和过期时间之间的 token ,标记过期并在每个请求中检查它。您需要服务器存储。您可以仅包含 ID,或使用 issued_at 并检查用户配置文件的最后更新

  3. 缩短到期时间并轮换。每隔几个请求发出一个新的。问题是在没有请求(例如关闭浏览器)时保持用户登录

其他常用技巧:

  • 如果帐户被新用户和密码登录泄露,允许更改用户唯一 ID
  • 包括上次登录日期以删除旧 token
  • 要在用户更改密码时使 token 无效,请使用密码的哈希值对 token 进行签名。如果密码更改,任何先前的 token 将自动无法验证。将该机制扩展到其他感兴趣的领域来签名。缺点是它需要访问数据库

关于java - JWT 的 REST 安全性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38765466/

相关文章:

java - 如何在基于Spring Java的配置中正确使用@Inject注解?

java - 使用 Java Streams 获取不包含在同一列表中的结果列表

c# - 这段代码在 c# 中的等价物是什么

java - 服务器如何将 URI 模式绑定(bind)到特定的 Java 类?

java - Spring MVC/Spring Roo 自定义 Controller ,以 JSON 形式返回 JPA 查询数据

java - 如何调用jasper报表中的实体方法?

c# - WCF Restful 服务不向 Web 客户端发送响应

rest - 使用 Flutter 将图像发布到 Web 服务

rest - Grails - 从我的 POST 请求 HTTP 获取返回

java - Spring Restful支持json数据多语言