JWT和每个用户一个(!)会话/无并发会话

Ben*_*n M 9 session single-sign-on jwt single-page-application

我们当前的应用程序使用HTTP会话,我们希望将其替换为JWT。

该设置仅允许每个用户一次会话。这意味着:

  1. 用户在设备1上登录
    • 用户已在设备1上登录(创建了新会话)
  2. 用户在设备2上登录
    • 用户已在设备2上登录(创建了新会话)
    • 用户在设备1上登录(会话已被破坏)

之所以有效,是因为会话ID和用户ID之间存在服务器端关系。


我可以想象使用JWT在用户数据库中有一些计数器,每次登录时计数器都会增加,即:

  1. 用户在设备1上登录
    • JWT令牌签名包含计数器+1(并将新计数器保存到数据库)
  2. 用户在设备2上登录
    • JWT的签名包含counter + 1,它会增加并保存到db。

现在,对于每个请求,我都必须检查传入的签名对于当前计数器值是否正确。

这使它有状态:(

但是…… JWT的好处之一是,无需访问任何数据库或会话存储来验证令牌。


还有其他一些防止并发登录的解决方案吗?也许某些无需数据库访问就可以正常工作并使它保持无状态的东西吗?

The*_*aan 11

您非常接近解决方案。

为此,您需要执行以下操作:
1.在令牌中包含iat(颁发令牌的时间)
2.在某个地方存储用户上次登录的时间,例如在用户的配置文件中。

现在,在验证令牌时,请进行额外的检查:iat(发布时间)必须在上次登录时间或更晚。这将使较旧的令牌隐式无效。

  • 该解决方案使令牌验证有状态。 (2认同)
  • 但是,如果您使用任何类型的微服务架构或集群、自动缩放等,那么在服务器中跟踪这一点将需要额外的复杂性,以防新的登录请求负载平衡到不同的服务器实例。 (2认同)