使客户端JWT会话无效

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

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

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

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

在过期时间之前有几个理由使JWT令牌无效:帐户被删除/阻止/暂停,密码被更改,权限被更改,用户由pipe理员注销。 所以你的问题是关于主题

根据您的使用情况,有几种应用或组合的技术

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

2)令牌黑名单:存储退出和到期时间之间的令牌,标志过期并在每个请求中检查。 使用唯一标识符jti或包含上次logindate并在iat发出以删除旧的令牌

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

3)到期时间缩短并旋转它们。 每隔几个请求就发出一个新的访问令牌 。 使用刷新令牌可以让您的应用程序获得新的访问令牌,而无需重新进行身份validation并与sliding-sessions

滑动会话是在一段时间不活动后过期的会话 。 当用户执行操作时,会发出一个新的访问令牌。 如果用户使用过期的访问令牌,则会话被认为是不活动的,并且需要新的访问令牌。 这个新的令牌可以通过刷新令牌或需要凭证来获得

其他常用技术

  • 如果帐号被新用户和密码login入侵,允许更改用户唯一ID

  • 要在用户更改密码时使令牌失效,请使用密码的散列对令牌进行签名。 如果密码更改,则以前的任何令牌都将自动无法validation。 扩展这个机制与其他感兴趣的领域签署。 缺点是它需要访问数据库

  • 更改签名algorithm以撤消主要安全问题中的所有当前令牌

看看失效的JSON Web令牌

我已经做了一些家庭作业,似乎更好的方法来实现撤销是使用jti(id在Jtw)和一个撤销的id黑名单(当令牌过期时将被清除)。 这使得JTW成为唯一的黑名单部分的状态。