【问题标题】:REST Security with JWTJWT 的 REST 安全性
【发布时间】:2016-12-10 11:11:24
【问题描述】:

我最近发现了用于令牌认证 + 授权的 JWT。 我认为将用户信息包含在令牌中非常有用,因此我尝试在 Java/Spring Web 项目中使用它。

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

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

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

【问题讨论】:

    标签: java rest spring-mvc authentication jwt


    【解决方案1】:

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

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

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

    1. 删除客户端令牌

    2. 令牌黑名单:存储在注销和过期时间之间的令牌,标记过期并在每个请求中检查它。您需要服务器存储。您可以仅包含 ID,或使用 issued_at 并检查用户个人资料的上次更新

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

    其他常用技术:

    • 如果帐户被新用户和密码登录所破坏,则允许更改用户唯一 ID
    • 包括上次登录日期以删除旧令牌
    • 若要在用户更改密码时使令牌无效,请使用密码哈希对令牌进行签名。如果密码更改,任何以前的令牌都会自动验证失败。将此机制扩展到其他感兴趣的领域以进行签名。缺点是它需要访问数据库

    【讨论】:

    • 在我看来,每个需要访问 DB 的选项都使 JWT 的优势无效,所以我认为第三个选项可能是我用例的实际解决方案......谢谢
    • 我同意避免使用数据库。如果您不希望撤销太多令牌,您也可以使用内存中的黑名单。您只需要在更新用户和currentTime - maxExpiryTime <last_login_date 的关键数据后设置一个条目。当currentTime - maxExpiryTime> last_modified 时可以丢弃该条目(不再发送未过期的令牌)。
    【解决方案2】:

    首先你需要数据库来存储用户的令牌,这样你就可以手动使特定用户的令牌过期。

    你会在这个答案中找到更多:

    https://stackoverflow.com/a/31010380/5309525

    【讨论】:

      猜你喜欢
      • 2016-06-19
      • 2016-08-30
      • 2021-07-14
      • 2016-03-26
      • 2017-07-04
      • 2014-02-24
      • 2015-09-08
      • 2018-11-20
      • 2016-07-20
      相关资源
      最近更新 更多