使用访问令牌和刷新令牌的 JWT 身份验证流程

JWT auth flow using access token and refresh token

我正在做一个项目(不是生产级别的,只是为了提高我的技能),我正在使用 JWT 来处理身份验证。 据我所知,仅将 JWT 用作访问令牌非常不安全,因此我们需要刷新令牌。因此,在登录时,服务器 returns 一个访问令牌和一个刷新令牌(我将其存储在一个 httpOnly cookie 中)。访问令牌会在短时间内过期,但刷新令牌会在到期时用于获取新令牌。

我的问题是,我们什么时候使用刷新令牌来获取新的访问令牌?是当用户想要获取一个受保护的资源,发现access token过期(而refresh token还没有),还是每次用户想要获取受保护的资源时,我们都发送一个新的access token?我对刷新令牌何时何地发挥作用感到困惑。

(我在前端使用 React,在服务器端使用 Nodejs)

随时可以使用刷新令牌来请求新的访问令牌。在他请求之前检查访问令牌的有效性是实现该目的的一种方法。另一种常见做法是,如果访问令牌在当前令牌过期的特定时间范围内,则刷新访问令牌。在这种情况下,一个简单的 cronjob 就可以工作。如果您假设访问令牌未在多个地方使用(不应该使用),则当前访问令牌可以在创建新访问令牌时失效。此外,为了获得最大的安全性,刷新令牌应替换为访问令牌。这限制了长期存在的刷新令牌受到威胁的安全风险。

您正在使用一些安全令牌,这意味着您的系统有一些受保护的资源。只有在成功验证令牌后才能访问这些资源。当您使用 JWT 令牌(通常用于无状态身份验证)并且您的系统将 access_tokenrefresh_token 授予客户端时,因此在服务器端您可以使用一些身份验证拦截器来验证 access_token 在每个私人请求和 return 一些关于令牌过期的错误代码。在客户端,您还可以使用一些过滤器来捕获错误代码,并通过利用可用的 refresh_token 它应该从服务器请求新的 access_token 。如果 refresh_token 过期,您的系统应该遵循新身份验证的路线。