我最近发现了用于 token 身份验证 + 授权的 JWT。 我认为将用户信息包装在 token 中非常有用,因此我尝试在 Java/Spring web 项目中使用它。
起初,我的印象是:如果我拥有 token 中的所有用户数据,我就不需要将其存储在应用程序数据库中,也不需要为每个服务请求检索用户 + session 信息。这太棒了,可以有效提高服务访问性能。
但现在我对我的用例的 JWT“限制”有一些疑问。例如:如果用户被服务管理员禁用并且最后生成的 token 尚未过期怎么办?即使实际上未授权,用户也可以访问该服务...
这是 JWT 的限制还是我遗漏了什么?你能澄清我的疑问吗?
最佳答案
JWT 是独立的。优点之一是它不需要服务器 session 存储,因为数字签名保护了内容。
在 JWT token 到期时间之前使其失效的原因有多种:帐户删除/阻止/暂停、密码更改、权限更改、用户被管理员注销。看看Invalidating JSON Web Tokens
这是一个普遍的需求,根据您的用例,可以应用或组合多种技术
删除客户端 token
token 黑名单:存储在注销和过期时间之间的 token ,标记过期并在每个请求中检查它。您需要服务器存储。您可以仅包含 ID,或使用
issued_at
并检查用户配置文件的最后更新缩短到期时间并轮换。每隔几个请求发出一个新的。问题是在没有请求(例如关闭浏览器)时保持用户登录
其他常用技巧:
- 如果帐户被新用户和密码登录泄露,允许更改用户唯一 ID
- 包括上次登录日期以删除旧 token
- 要在用户更改密码时使 token 无效,请使用密码的哈希值对 token 进行签名。如果密码更改,任何先前的 token 将自动无法验证。将该机制扩展到其他感兴趣的领域来签名。缺点是它需要访问数据库
关于java - JWT 的 REST 安全性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38765466/