背景:我正在研究单页应用程序上 JWT 令牌的存储解决方案。
- 将 JWT 存储在本地存储中是不安全的,并且容易受到 XSS 攻击。
- 将 JWT 存储在安全/仅 HTTP cookie 中更安全,但容易受到 CSRF 攻击。
我正在研究以下场景:
身份验证后,刷新令牌存储在仅限 http 的安全 cookie 中。它只能用于获取访问令牌。
授权后,后端会使用 JWT 访问令牌进行响应。JWT 的标头和有效负载部分位于响应正文中。令牌签名不发送,并设置在仅 http 的安全 cookie 中(如果可能,相同站点严格,但我们假设不是这种情况)。标头 + 有效负载存储在内存中。
JWT 包含以下声明
- iat, nbf, exp(可猜测的 IMO)
- 与用户身份和权限相关的声明(如果用户身份已知,则可以猜测)
- jti,包含一个密码安全的随机数(在我的例子中是用 python secrets生成的)
发出请求时,标头 + 有效负载由 SPA 在 Authorization 标头中通过 XHR/fetch 发送。签名与 cookie 一起发送。后端连接两者并验证签名。
- 这种机制对 CSRF 攻击安全吗?jti 声明是否使授权令牌 + 签名 cookie 成为有效的 CSRF 缓解技术?
- 这种机制对 XSS 攻击确实比将 JWT 存储在本地存储中更安全吗?(使用 XSS 的攻击是否也很容易窃取签名,例如使用TRACE 漏洞)。
注意:我读过这个类似的问题,但过于宽泛,所以我发布这个以获得更准确的答案。