首页 > 解决方案 > 这个 JWT 实现是否可以防止 XSS 和 CSRF 攻击,同时仍然允许我访问有效负载?

问题描述

我正在为我的 Web 应用程序实现 JWT 身份验证和授权,并且可以使用一些帮助来识别我的方法中的漏洞。我见过许多方法,它们只是简单地说将访问令牌设置为 httpOnly cookie,但是,我的访问令牌中有我的前端需要访问的声明。我想出了这种方法来解决这个问题。

登录时,用户提供用户名和密码以换取以下几项:

  1. CSRF 令牌
  2. JWT 访问令牌的标头和签名
  3. JWT 访问令牌的有效负载
  4. JWT 刷新令牌

在我的方法中,所有这些项目都设置为 cookie。JWT 刷新令牌以及 JWT 访问令牌的标头和签名都存储在 httpOnly 安全 cookie 中。JWT 访问令牌的有效负载只是存储为常规的旧 cookie,以便我的前端可以访问它(我没有在此令牌中存储任何个人/不安全信息)。

例如,如果我的 JWT 访问令牌是header.payload.signature,那么我将访问令牌拆分为header.signaturepayload。这些值存储在各自的 cookie 中。

是时候发出需要授权的请求了,我的后端会抓取所有 JWT 访问令牌 cookie,将它们重新组合在一起,然后检查签名。

这种方法是否可以缓解 XSS 和 CSRF 攻击,同时仍然提供对 JWT 有效负载的安全访问?

标签: jwt

解决方案


听起来这行不通。从根本上说,您的代码可以访问的任何内容,攻击者代码也可以访问。所以,你不想要任何“我的前端可以访问”的东西。正如我所见,唯一能提供最佳覆盖范围的组合:

  • HttpOnly+Secure+SameSite cookie(Mozilla 文档
  • 使用 CSRF 令牌保护 POST/PUT/DELETE
  • 防止注入脚本的内容安全策略

除此之外,越简单越好。试图推出一个聪明的解决方案是坏事的秘诀。


推荐阅读