【发布时间】:2016-05-03 00:18:11
【问题描述】:
我想对 Stormpath post 中的 JWT 令牌和 CSRF 提出疑问,解释将 JWT 存储在 localStorage 或 cookie 中的优缺点。
[...] 如果您使用 JS 从 cookie 中读取值,这意味着您 无法在 cookie 上设置 Httponly 标志,所以现在您网站上的任何 JS 可以读取它,从而使其具有与存储完全相同的安全级别 localStorage 中的一些东西。
我试图了解他们为什么建议将 xsrfToken 添加到 智威汤逊。不将您的 JWT 存储在 cookie 中然后将其提取 并将 JWT 放在 HTTP 标头中并验证 基于 HTTP 标头的请求完成与 Angular 的 X-XSRF-TOKEN?没有其他域可以在 如果您基于标头中的 JWT 进行身份验证,则代表用户, 因为其他域无法从 cookie 中提取 JWT。我不 了解 JWT 中 xsrfToken 的用途——也许它只是 额外的防御层——这意味着攻击者必须 您的网站上有一个受损的脚本,并且当时有一个用户 CSRF。所以 他们必须以两种方式击中你才能发动攻击。
帖子链接在this answer,其中说:
最后一件事是确保您在每个节点上都有 CSRF 保护 HTTP请求确保外部域发起请求 您的网站无法运行。
[...] 然后,在每个请求进入您的服务器时,确保您自己的 JavaScript 代码读取 cookie 值并将其设置为自定义 标题,例如X-CSRF-Token 并在每个请求中验证该值 服务器。 外部域客户端无法为 除非外部客户端获得授权,否则向您的域发出请求 通过 HTTP 选项请求,因此任何 CSRF 攻击尝试(例如 一个 IFrame,无论如何)对他们来说会失败。
即使他们可以设置自定义标头,他们也无法访问存储 JWT 令牌的 cookie,因为只有在同一域上运行的 JavaScript 才能读取 cookie。
他们唯一的方法是通过 XSS,但如果存在 XSS 漏洞,JWT 中的 xsrfToken 也会受到损害,因为在受信任的客户端域中运行的恶意脚本可以访问 cookie 中的 JWT 并在请求中包含标头使用 xsrfToken。
所以方程应该是:
- TLS + 存储在安全 cookie 中的 JWT + 请求标头中的 JWT + 无 XSS 漏洞。
如果客户端和服务器在不同的域中运行,服务器应该发送 JWT,客户端应该使用 JWT 创建 cookie。 我认为这个等式在这种情况下仍然有效。
更新: MvdD agree with me:
由于浏览器不会自动将标头添加到您的请求中, 它不易受到 CSRF 攻击
【问题讨论】:
标签: javascript cookies csrf jwt owasp