JWT:让令牌在一段时间不活动后过期的解决方案?

信息安全 jwt
2021-09-07 00:07:52

我有一个使用 JWT 令牌的无状态 web 应用程序。最终它会过期 - 这没关系,但我不希望它在用户工作时过期相反,我希望令牌在一段时间不活动后过期。

假设我的令牌有效期为 60 分钟,可以在每个请求上发送一个新的 JWT 吗?这样,只要用户在工作,他的令牌就会被更新(只要他每小时发出一个请求),但是在一个多小时不活动后,令牌就会过期。

我不想使用有状态的刷新令牌。客户端的计时器最终会在令牌过期后立即删除。

我错过了这种方法的主要缺陷吗?(除了由于更频繁的数据库访问而导致的明显性能影响)

2个回答

JWT 是自我描述的完整性检查令牌。它们不是为您描述的用例而设计的。JWT 不能按需过期,也不能延长其有效期。

就像您描述的那样,您可以使用这些令牌执行新令牌。这不会使旧的无效。您最终将生成大量自行过期的令牌。

我错过了这种方法的一个主要缺陷吗?

JWT 不是为全面的会话管理而设计的。它们带有各种权衡。其中之一是无法按需更新它们或使它们过期。您描述的解决方法非常有效。我写了一篇关于会话管理的短文,它应该可以帮助您决定是否进行权衡。

在我看来,您可能应该转向“经典”会话管理模型。它支持空闲超时,你也不会得到很多“会话”(令牌)。

如果令牌过期,则仅当过期时间与当前时间之间的差异小于非活动时间(会话空闲时间)时才重新生成新令牌。

如果差异超过非活动期,则要求登录并验证用户并生成令牌。

如果差异小于非活动期,则使用有效负载和标头应用​​签名,以便生成新令牌。