构建安全 JWT 身份验证流程的指南?

And*_*zo1 5 security jwt reactjs redux

最近我需要构建一个简单的 REST API,我阅读了关于最佳实践的不同文章,以尽可能减少我的 Web 应用程序的漏洞。在网上搜索,我找到了关于如何实现 JWT 令牌的不同教程,每个教程在某些方面都不同,我找不到一种节流良好的“通用方法”。最后,我实现了对我来说似乎最合理的解决方案,但我想确认这是处理此类身份验证的最有效方法。

在开始之前:

  • 注意 CORS 策略已实施
  • 为了签署令牌,我使用了“标准”库
  • 客户端和服务器之间的通信是加密的 (HTTPS)

#STEP 1:认证后生成令牌:

  1. 我生成了一个短期访问令牌(15 分钟)和一个用 HS256 算法签名的“长期”刷新令牌(7 天)(使用的密钥长度:512 位)
  2. 此外,我将刷新令牌的 ID 存储在缓存中。
  3. 我在响应中发回访问令牌(在客户端我只将它保存在内存中 [Redux]),同时我在 HTTPOnly cookie 中设置刷新令牌以使 XSS 攻击更加困难(并非不可能,我知道:目标是避免/减少窃取 cookie 的可能性)

#STEP 2:授权请求

为了授权请求,我只使用在请求标头中的字段中发送的访问令牌。仅当令牌有效时才允许请求。

#STEP 3:刷新访问令牌

为了刷新令牌,我向服务器发送刷新请求。服务器:

  1. 检查刷新令牌签名是否有效
  2. 检查刷新令牌是否在缓存中(检查是否过期并针对伪造令牌设置另一层防御)
  3. 生成新的访问令牌和新的刷新令牌,同时撤销先前的刷新令牌(并相应地更新缓存)
  4. 发送回响应中的访问令牌和仅 HTTP cookie 中的刷新令牌

有关刷新过程的更多信息

刷新被称为:

  1. 在访问令牌到期之前
  2. 在用户打开/刷新 Web 应用程序的确切时刻。这样,如果刷新令牌仍然有效,用户就会自动通过身份验证并准备好使用应用程序。注意刷新令牌只能用于刷新访问令牌,不能执行其他请求(为了避免CSRF攻击,cookie不能用于对请求进行身份验证,但用户需要加载网站才能获得访问令牌)

进一步的预防措施:关键操作

刷新令牌有两个过期时间。第一个,对于非关键操作,每次发布新令牌时都会刷新。这样,如果用户继续使用该应用程序,他/她可能会永远保持登录状态。对于关键操作,第二个(持续 3 小时)是“绝对的”。这意味着,在每次刷新时,关键操作的“计时器”不会刷新。

//To make it simpler:
nextToken.criticalExpiration=previousToken.criticalExpiration
Run Code Online (Sandbox Code Playgroud)

在“关键”计时器到期后调用刷新请求时,生成的访问令牌有一个字段为 false,表示执行关键操作的选项。如果为 false,则不允许进行关键操作(因此用户必须重新进行身份验证才能执行这些请求)

概括:

我想了解此过程是否正确执行或是否会产生漏洞。我知道在应用程序的其他部分和/或外部库中总是可能存在漏洞,但是,我想尽量减少留下可以被利用的东西的可能性。

Ami*_*mir 1

您必须创建控制器、用于登录的中间件、生成 jwt 令牌以及刷新令牌。有关更多详细信息,请参阅:https://stackabuse.com/authentication-and-authorization-with-jwts-in-express-js/ 。