使客户端JWT会话无效

wli*_*gke 12 authentication session session-state jwt

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

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

从技术上讲,您可以指示浏览器从客户端删除它,但您无法确定这实际发生了.令牌本身在技术上仍然有效,如果没有遵循删除说明,它仍然可以使用.

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

ped*_*ofb 15

有几个原因使JWT令牌在其到期时间之前失效:帐户已删除/阻止/暂停,密码已更改,权限已更改,用户已由管理员注销.所以你的问题是主题

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

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

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

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

3)到期时间短并旋转它们.每隔几个请求发出一个新的访问令牌.使用刷新令牌允许您的应用程序获取新的访问令牌,而无需重新进行身份验证和组合sliding-sessions

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

其他常用技巧

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

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

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

看看Invalidating JSON Web Tokens