【问题标题】:Can a JWT be stateful?JWT 可以是有状态的吗?
【发布时间】:2021-08-19 07:23:50
【问题描述】:

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

PS - 但是我在cookbook section on the featherjs 中看到了“撤销 JWT”这个词 框架。但看起来他们仍然使用 redis 作为查找,这反过来又使其继承了使用会话的缺点。

【问题讨论】:

  • JWT 可以在客户端解码,请确保不要在其中放入任何机密信息。
  • 我理解@ArjunVachhani,但我的问题是如何使其成为有状态的,以防您需要在令牌过期之前使其失效
  • 不要在 JWT 中存储关键信息,例如登录尝试失败次数等。您可能会存储一些信息,例如用户已完成第 5 步中的第 3 步,也可能存储一些不重要的信息。如果您将 JWT 存储在 cookie 中,则在状态更改时从 cookie 中删除/更新 JWT。如果您将 JWT 存储在表单字段中,则将其从表单字段中删除。
  • 同时验证 JWT 没有被客户端修改,一旦你从客户端取回它。

标签: authentication jwt stateful


【解决方案1】:

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

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

  • 您需要有一个数据库,其中包含有关哪些令牌被撤销的信息
  • 您必须确保每当您使用令牌时,您都使用数据库在线检查。

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

如果您确实需要撤销 JWT,则意味着您需要会话,并且您不应该为此使用 JWT。您可以查看this article 了解原因。如果您决定坚持使用 JWT,请查看我写的这篇 best practices 文章以了解要注意什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-08
    • 2016-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-19
    相关资源
    最近更新 更多