其中 jsonwebtoken 存储在服务器 nodejs 中。用户注销后如何使 JWT 过期

Posted

技术标签:

【中文标题】其中 jsonwebtoken 存储在服务器 nodejs 中。用户注销后如何使 JWT 过期【英文标题】:Where jsonwebtoken stored in server nodejs . How to expire JWT once user gets logout 【发布时间】:2018-06-28 06:41:13 【问题描述】:

我将令牌存储在客户端的会话/本地存储中。我面临的问题是,一旦用户复制该令牌并将其用于其他登录会话服务,它就可以工作,但它应该在 JWT 上返回无效令牌。验证。

一旦用户退出,有没有办法Blacklist/Delete/Expire当前使用的令牌?

【问题讨论】:

【参考方案1】:

有几种方法可以为此目的设置黑名单:

1) (数据库中的黑名单用户) 为用户添加一个数据库列 isTokenExpired 并在成功登录时将其设置为 false,当您想要使令牌过期时(例如当用户更改密码、注销或时间已过)。

上面的方法可以达到你的目的,但我觉得这是对编程的侮辱。我假设您正在使用 JWT,这样用户就不必每次都登录,并且您只有 1 台服务器正在执行身份验证和所有其他服务器功能。尽管 JWT 不是为“会话”而设计的,但为此目的使用 JWT 可以减轻数据库的负载。但是,如果您随后在每个用户操作上设置并检查另一个数据库标志,那么您将再次添加该负载,并且您仍然拥有与 JWT 等相关的所有负载,因此您不妨对每个用户操作重新进行身份验证。

2) (将用户/服务器 RAM 中的令牌列入黑名单) 当我自己研究这个问题(如何使单个令牌无效)时,我发现了一些解决方案,服务器维护白名单或RAM 中的黑名单,因此无需添加数据库或文件加载。这可能是一个更好的解决方案,但我不记得任何促进这一点的库的名称。也许其他人可以提及其中的一些。

3) 将令牌设置为非常短的到期时间(例如 60 秒或 5 分钟),并将客户端设置为每隔(~55 秒或~4 分钟 50)自动请求一个新令牌秒)。然后,服务器将以我假设您现在正在执行的相同方式检查和验证令牌,而无需访问数据库,然后将为所有其他字段生成具有相同值的新令牌,但具有新的“到期时间” " 值,然后将该令牌发送回客户端,客户端将用这个新的 JWT 替换其 JWT,并重新启动其 5 分钟计时器。这是其他选择之间的一个很好的平衡,并保持了使用 JWT 的一些好处,但确实增加了一些小成本。我认为这对于许多应用程序来说是一个相当不错的解决方案,但它肯定取决于具体的应用程序,但它有点 hacky 并且绝对不是“正确的方法”。

4) 使用 JWT + Sessions 这是做到这一点的“正确方法”。经过很久以前的所有研究,我意识到JWT 并非旨在用于维护会话:JWT 只是表示声明的一种安全方式。想象一下拥有一个拥有数千万用户的大型系统,并且您需要遍布全球的许多服务器。您可能有 3 个身份验证服务器(位于美国、澳大利亚、英国)。然后,用户将其用户名和密码发送到身份验证服务器,其中将在数据库中检查详细信息,如果有效,则会向其发送 JWT。然后,您可能还会有 10 多个常规服务器来处理您的 API。然后,客户端将使用其 JWT 向 API 服务器发出每个请求。 API 服务器将拥有身份验证服务器用于生成 JWT 的密钥的副本,并将验证您的声明。您的声明是“我已通过身份验证”。然后,此 API 服务器将生成一个会话,并且客户端将“登录”。 JWT 可以设置为在 5 分钟后过期。如果用户在这 5 分钟内没有登录,他们将无法登录。如果他们这样做了,他们将一直登录,直到 API 服务器将他们踢出。每当发生会导致您想要踢出用户的事情时,API 服务器可以关闭会话。即使对于单服务器应用程序,这仍然是正确的方法。 JWT 不适用于会话,您(和我一样)开始注意到这些看似无法解决的问题,因为您将 JWT 用于会话。

无论如何,我推荐 3 或 4,这两个选项对许多应用程序都有净正值。

1 和 2 似乎带来的问题多于它们提供的好处。

当然,它始终取决于应用程序。如果你只是在 Fiverr 上以 5 美元的价格制作网站,那么随便你,你明白我的意思吗?

如果有更好的解决方案,我也很想知道!请记住,JWT 代表声明,并准确考虑您的客户所代表的声明。

【讨论】:

【参考方案2】:

回答您的第一个问题(JWT 存储在服务器 Node.js 中的什么位置)

JWT 令牌不存储在服务器端。它是一个基于签名(通过密钥,RFC 7519)的身份验证系统。

所以服务器只是验证令牌,如果它被验证,那么它就可以访问用户,因此任何拥有你的令牌的用户都可以充当你。

例如 - 您可以复制已登录 facebook 用户的 cookie/存储,然后转到另一个浏览器并设置这些 cookie/存储。您将以该用户身份登录一段时间。

仅供参考@safebookverified 第三种方式主要使用。谢谢。

【讨论】:

以上是关于其中 jsonwebtoken 存储在服务器 nodejs 中。用户注销后如何使 JWT 过期的主要内容,如果未能解决你的问题,请参考以下文章

将 jsonwebtoken 与 angular-cli 应用程序一起使用时出错

如何在 node.js 中更改 jsonwebtoken 的标头

jsonwebtoken.sign() 失败并设置了 expiresIn 选项

JsonWebToken

JsonWebToken

本地存储和 cookie 哪个更安全?