在客户端应用程序上刷新 JWT 和保护会话

Posted

技术标签:

【中文标题】在客户端应用程序上刷新 JWT 和保护会话【英文标题】:Refreshing JWT and securing sessions on client side app 【发布时间】:2019-09-22 22:16:10 【问题描述】:

我有一个带有 node/express 后端的 react 应用程序。我目前正在使用 JWT 在后端调用受保护的路由。这一切都很好。但我想让用户保持登录状态超过 30 分钟左右。

在客户端应用程序上处理会话安全或在访问令牌过期时刷新访问令牌的最佳方法是什么?

我的解决方案:

-一个:

创建刷新和访问令牌。访问令牌是短暂的。并使用数据库中提供给用户的唯一 ID 对刷新令牌进行签名。然后检查使用此 id 验证令牌。然后当访问令牌过期时发回 401,然后从本地存储中获取刷新令牌以创建新令牌,然后再次尝试调用。

这个问题:有很多来回进行,似乎很慢。

-二

在每次调用时都发送刷新令牌和访问令牌,如果访问令牌已过期,请使用刷新令牌创建新令牌,然后继续。

这个问题:我不明白为什么我需要发送 2 个令牌,我可以发送一个并完成工作。但是,如果一个或两个令牌遭到破坏,它们可能会永远重新生成。

-三

将访问令牌过期发送到前端,如果令牌过期,则发送刷新令牌并使用数据库中的唯一标识符对其进行验证。然后生成新令牌并继续。

这个问题:不确定这有多安全。但就目前而言,这似乎是最好的解决方案。

所以我想知道在访问令牌过期时刷新访问令牌以便用户继续使用平台的最佳方法是什么?

【问题讨论】:

【参考方案1】:

我是根据经验而不是来源,而是 JWT 的整个想法,即它是无会话的。还有另一种处理会话的解决方案。 使用 jwt,您无需将其保存在数据库中,因为您使用密钥对 JWT 进行签名,您只需验证 JWT 是否已使用您的密钥颁发。您可以发出该 JWT 的有效期超过 30 分钟。完全没问题。我自己已将其设置为 180 天。而且因为时间太长,这个时候会有用户重新登录,所以不用担心过期。但如果你也想处理它,你可以在前端解析它并检查它的过期时间戳,并在它过期之前获取另一个 JWT。

【讨论】:

那么你如何处理诸如用户权限之类的事情,比如告诉用户是否在管理员中?您只是将其添加到令牌中吗?您是否认为我应该只发行一个令牌并在每次用户第一次进入网站时重新发行一个令牌,或者只是不担心它。如果您的令牌寿命如此之长,您如何防止有人获得令牌访问权限这一不太可能发生的事件。

以上是关于在客户端应用程序上刷新 JWT 和保护会话的主要内容,如果未能解决你的问题,请参考以下文章

为命令存储访问和刷新令牌

如何保护刷新令牌?

哪种 JWT 刷新策略更安全?

JWT 令牌登录和注销

使用jwt身份验证保护react应用程序

使用 jwt 身份验证保护反应应用程序