Session 使客户端JWT会话无效

Session 使客户端JWT会话无效,session,authentication,jwt,session-state,Session,Authentication,Jwt,Session State,我读了很多关于JWT的书,以及如何通过JWT创建“无状态”会话。我理解的要点是,由于签名和过期,您基本上可以发送整个会话供客户端保存,而服务器不必维护db来记住会话 我不明白的是,如果您的用户需要注销,或者您需要在会话到期前使会话无效,会发生什么情况? 从技术上讲,您可以指示浏览器从客户端将其删除,但无法确定是否确实发生了这种情况。令牌本身在技术上仍然有效,如果没有遵循您的删除说明,它仍然可以使用 这种理解正确吗?如果是这样的话,这不是客户端会话管理的一个巨大缺陷吗?除了让服务器存储会话或缩短过

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

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

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


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

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

在JWT令牌到期之前,有几个原因使其无效:帐户已删除/被阻止/被挂起、密码已更改、权限已更改、用户已由管理员注销。所以你的问题是关于主题的

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

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

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

它是服务器存储所必需的。如果您不希望撤销太多的令牌,还可以使用内存中的黑名单。您只需在更新用户和
currentTime-maxExpiryTime​. 当
currentTime-maxExpiryTime>lastModified
(不再发送未过期的令牌)时,可以丢弃该条目。在这种情况下,不需要存储整个令牌。只是
sub
iat
,可能还有
jti

3)缩短到期时间并轮换。每隔几次请求发出一个新的访问令牌。用于允许您的应用程序获得新的访问令牌,而无需重新验证并与
滑动会话结合使用

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

其他常用技术
  • 如果帐户被新用户和密码登录泄露,允许更改用户唯一ID

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

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

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

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

  • 令牌日志。我会记录在我的项目中发布的每个令牌,包括ID、声明、过期时间,并在每个请求中验证它。如果令牌过期,它将从此日志移动到存档。性能下降并不可怕

  • 除了用户名之外,我还向声明中添加了一个用户秘密散列(类似于自动生成的隐藏令牌或密码),在下一步从dbo加载用户时授权该散列。这并没有显著的性能下降,因为对用户的查询仍然在执行。缺点是,您可能不会使具体的令牌无效,只会使所有用户的会话无效


  • 据我所知,我们应该给每个JWT一个id,并检查它是否在黑名单中被撤销。但由于黑名单不是无状态的,这可能是不正确的。我对这个话题很感兴趣,谢谢你的提问。用用户密码签署JWT使整个身份验证有点。。那是有状态的,不是吗?我的意思是,JWT的主要好处是,任何请求都可以由服务器进行身份验证,而不需要查询dbo,这是巨大的性能增益。在这种情况下,服务器需要在验证JWT时查询用户的密码。这与黑名单大致相同。@Luke1988我不会将其限定为“有状态”,因为密码不是会话的一部分,但正如您所指出的,它将直接影响性能。假设撤销代币是一种不常见的行为,那么黑名单可能会更有效率