【问题标题】:Invalidating client side JWT session使客户端 JWT 会话无效
【发布时间】:2018-04-27 20:43:54
【问题描述】:

我已经阅读了很多关于 JWT 以及如何通过 JWT 创建“无状态”会话的内容。我理解的要点是,由于签名和过期,您基本上可以将整个会话发送给客户端保存,而服务器不必维护数据库来记住会话。

我不明白,如果您的用户需要注销,或者您需要在到期前使​​会话无效,会发生什么?

从技术上讲,您可以指示浏览器从客户端将其删除,但您不能确定这是否真的发生了。令牌本身在技术上仍然有效,如果不遵循您的删除说明,它仍然可以使用。

这种理解正确吗?如果是这样,这不是客户端会话管理的一个巨大错误吗?除了让服务器存储会话或缩短过期时间之外,还有什么方法可以克服这个问题?

【问题讨论】:

  • 据我了解,我们应该给每个 JWT 一个 id 并检查它是否在黑名单中被撤销。但由于黑名单不是无国籍的,这可能是不正确的。我对这个话题很感兴趣,谢谢你的提问。

标签: session authentication jwt session-state


【解决方案1】:

我做了一些功课,似乎实施撤销的更好方法是使用 jti(Jtw 上的 id)和撤销 id 的黑名单(令牌过期时将被清除)。这使得 JTW 对于唯一的黑名单部分是有状态的。

【讨论】:

    【解决方案2】:

    在到期时间之前使 JWT 令牌无效的原因有多种:帐户已删除/阻止/暂停、密码更改、权限更改、用户被管理员注销。所以你的问题是关于主题的

    根据您的用例,可以应用或组合多种技术

    1) 从本地存储中删除客户端令牌

    2) 令牌黑名单: 存储在注销和过期时间之间的令牌,标记过期并在每个请求中检查它。使用唯一标识符 jti 或包含上次登录日期并在 iat 发布以删除旧令牌

    需要服务器存储。如果您不希望撤销太多令牌,您也可以使用内存中的黑名单。您只需要在更新用户和currentTime - maxExpiryTime < lastLoginDate (iat)‌的关键数据后设置一个条目。当currentTime - maxExpiryTime > lastModified 时可以丢弃该条目(不再发送未过期的令牌)。在这种情况下不需要存储整个令牌。只是subiat,也许还有jti

    3) 缩短到期时间并轮换它们。每隔几个请求发出一个新的访问令牌。使用 refresh tokens 允许您的应用程序获得新的访问令牌,而无需重新验证并与 sliding-sessions 结合使用

    滑动会话是在一段时间不活动后过期的会话。当用户执行操作时,会发出一个新的访问令牌。如果用户使用过期的访问令牌,则认为会话处于非活动状态,需要新的访问令牌。可以使用刷新令牌或需要凭据来获取此新令牌

    其他常用技术

    • 如果帐户被新用户和密码登录所破坏,则允许更改用户唯一 ID

    • 若要在用户更改密码时使令牌无效,请使用密码哈希对令牌进行签名。如果密码更改,任何以前的令牌都会自动验证失败。将此机制扩展到其他感兴趣的领域以进行签名。缺点是需要访问数据库

    • 在重大安全问题中更改签名算法以撤销所有当前令牌

    看看Invalidating JSON Web Tokens

    【讨论】:

    • 用用户密码签署 JWT 使得整个身份验证有点......那么有状态,不是吗?我的意思是,JWT 的主要好处是任何请求都可以通过服务器进行身份验证,而无需查询 dbo,这是巨大的性能提升。在这种情况下,服务器在验证 JWT 时需要查询用户的密码。这和黑名单差不多。
    • @Luke1988 我不会将其限定为“有状态”,因为密码不是会话的一部分,但正如您所指出的那样,它会对性能产生直接影响。假设撤销令牌是一种不常见的操作,那么黑名单可能会更有效
    【解决方案3】:

    黑名单 JWT 无状态违规。您可以使用许多身份验证方案。 JWT 基于无状态,所以应该这样使用。另一方面,它是非常常见的身份验证方案,如果您必须实现它,并且如果您希望您的应用程序 (API) 真正安全,则必须允许进行一些自定义。

    我个人在我的项目中使用这两种方法(单独或组合,取决于性能需求):

    1. 令牌日志。我确实记录了我的项目中发布的每个令牌,包括 ID、声明、到期时间,并且我会在每个请求上对其进行验证。如果令牌过期,它将从此日志移至存档。性能下降并不是那么可怕。

    2. 除了用户名之外,我还在声明中添加了用户秘密的哈希(类似于自动生成的隐藏令牌或密码),在从 dbo 加载用户时在下一步中授权。这没有显着的性能下降,因为无论如何都会执行对用户的查询。缺点是您可能不会使具体令牌无效,只会使所有用户的会话无效。

    【讨论】:

      猜你喜欢
      • 2017-10-04
      • 2012-06-15
      • 2011-06-14
      • 2017-04-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-19
      • 2017-12-03
      相关资源
      最近更新 更多