localStorage 中带有加密 sessionId 的 JWT

信息安全 Web应用程序 饼干 授权 jwt
2021-08-20 02:59:53

我想要的是:

  • 将 JWT 存储在 localStorage 中。JWT 包含有关授权的声明。
  • 防止 JWT 被攻击者窃取和使用(使用 XSS)
  • 避免 CSRF

将 JWT 存储在 localStorage 中是不好的,因为利用 XSS 会导致 JWT 被盗,攻击者可以将其用于授权。

将 JWT 存储在仅 http 的 cookie 中是不好的,因为它没有足够的空间用于声明。

一个可能的解决方案是:

  • 使用 sessionId 创建一个仅限 http 的 cookie
  • 将 JWT 存储在 localStorage 中,并在其中加密相同的 sessionId
  • 在服务器上,在使用声明之前验证 JWT 中的 sessionId 和 cookie 是否匹配。

这种方式可以窃取 JWT,但除非攻击者还拥有 cookie 中的 sessionId,否则无法使用。此外,CSRF 是不可能的,因为 cookie 不足以进行授权。

我的推理有什么缺陷吗?有没有更简单的方法来完成同样的事情?

1个回答

鉴于客户端 JS 无法读取它,因此仅 http 的 cookie 非常强大。您的解决方案似乎很合理。我唯一的建议是使用提供 XSS 保护的客户端框架,例如 ReactJS。或者清理所有 HTML 字符串输入。您还可以为您的 JWT 添加较短的过期时间长度。抱歉,我会对此发表评论,但没有足够的代表。