JWT能有状态吗



我一直选择在会话上使用jwt,因为后端的开销较小(请记住,这完全取决于用例(,但我遇到的主要问题是令牌的无效,例如:如果用户被停用,相关的jwt在过期之前仍然有效。有没有办法以经济有效的方式克服这个问题?

PS-然而,我看到了术语";撤销JWT";在关于羽毛的食谱部分框架但看起来他们仍然使用redis作为查找,这反过来又使其继承了使用会话的缺点。

一旦发出JWT,它的有效期与exp索赔值一样长。你不能撤销JWT,这不是JWT的工作方式。

正如你所指出的,有很多方法可以模仿撤销行为,但你需要两件事:

  • 您需要有一个数据库,其中包含有关哪些令牌被吊销的信息
  • 您必须确保,无论何时使用令牌,都要与数据库联机检查

没有其他方法可以做到这一点。

如果你真的需要撤销JWT,那就意味着你需要会话,而你不应该为此使用JWT。你可以看看这篇文章来了解原因。如果你决定坚持JWT,看看我写的这篇最佳实践文章,知道该注意什么。

它可以!我的理解是JWT只是一个;标准";关于如何定义和创建令牌。它不是";"力";你可以有状态地或庄严地使用它。这可能看起来很奇怪,因为我们只看到开发人员和文章解释如何无状态地使用JWT,不幸的是,这是JWT如何帮助我们的有限方法。如果你仔细阅读这样的文章,你可以理解,它们更多的是反对无状态令牌,而不是反对有状态JWT。碰巧大多数人倾向于将JWT实现为无状态令牌,所以它看起来是使用它的唯一方法

有状态的非JWT令牌在不同的框架中没有标准实现。NodeJS的Express、Java的Apache Tomcat、Java的Spring Boot、PHP的Laravel、Python的Django,每一个都有不同的有状态令牌格式和签名/加密算法。代币的内容可能因框架而异,因此没有标准,这就是JWT标准化帮助我们的地方。

当你开始定义你有状态的JWT声明时,你可能会发现一些";默认";如果你计划将有状态的JWT存储在cookie中,JWT的";exp";claim(令牌过期日期(是无用的,因为您可以在cookie的Expires属性中设置过期时间,并且可以在数据库中设置,所以您根本不需要在JWT中设置它。在盲目接受有效的签名JWT之前,您的应用程序将始终检查数据库验证。你可以找到";sub";字段对您来说是不够的,您需要其他字段,如";设备Id";以及";userId";。您可以自由地以自己想要的方式创建任意数量的声明,使用带有默认签名算法的JSON可读格式,这就是它的全部内容。

我之前提到的框架上的有状态令牌生成实现通常由对称HMAC签名。使用JWT时,您可以轻松地在对称(HMAC(和非对称(RSA(之间切换。当你使用JWT时,这是一个加分项。

遗憾的是,没有多少人讨论这一点,有状态的JWT是可能的,我个人认为这是一种非常好的使用方式。

最新更新