【问题标题】:JWT auth flow using access token and refresh token使用访问令牌和刷新令牌的 JWT 身份验证流程
【发布时间】:2021-09-17 02:23:47
【问题描述】:
我正在开发一个项目(没有生产级别,仅用于提升我的技能)并且我正在使用 JWT 来处理身份验证。
根据我的阅读,仅使用 JWT 作为访问令牌是非常不安全的,因此我们需要刷新令牌。因此,在登录时,服务器会返回一个访问令牌和一个刷新令牌(我将把它们存储在一个 httpOnly cookie 中)。访问令牌在短时间内到期,但刷新令牌用于在到期时获取新令牌。
我的问题是,我们什么时候使用刷新令牌来获取新的访问令牌?是当用户想要获得受保护的资源并发现访问令牌已过期(而刷新令牌尚未过期)时,还是我们每次用户想要获得受保护的资源时都发送新的访问令牌?我对刷新令牌何时何地发挥作用感到困惑。
(我在前端使用 React,在服务器使用 Nodejs)
【问题讨论】:
标签:
authentication
web
jwt
access-token
【解决方案1】:
可以随时使用刷新令牌来请求新的访问令牌。在他请求之前检查访问令牌的有效性是实现此目的的一种方法。另一种常见的做法是,如果访问令牌在当前令牌到期的特定时间范围内,则刷新它。在这种情况下,一个简单的 cronjob 可以工作。如果您假设访问令牌没有在多个地方使用(不应该),那么在创建新的访问令牌时,当前的访问令牌可能会失效。此外,为了获得最大的安全性,应将刷新令牌替换为访问令牌。这限制了长期存在的刷新令牌被泄露的安全风险。
【解决方案2】:
您正在使用一些安全令牌,因此这意味着您的系统有一些受保护的资源。只有在成功验证令牌后才能访问这些资源。当您使用 JWT 令牌(通常用于无状态身份验证)并且您的系统同时向客户端授予 access_token 和 refresh_token 时,因此在服务器端您可以使用一些身份验证拦截器来验证每个私有请求中的 access_token并在令牌到期时返回一些错误代码。在客户端,您还可以使用一些过滤器来捕获错误代码,并利用可用的 refresh_token 从服务器请求新的 access_token。如果 refresh_token 过期,您的系统应遵循新身份验证的路线。