为什么要在JWT令牌中放置CSRF令牌?

gab*_*ssi 5 javascript cookies csrf owasp jwt

我想从Stormpath帖子中对JWT令牌和CSRF提出疑问,解释将JWT存储在localStorage或cookies中的优缺点.

[...]如果你使用JS从cookie中读取值,这意味着你不能在cookie上设置Httponly标志,所以现在你站点上的任何JS都可以读取它,从而使它完全相同的安全性 - 作为在localStorage中存储内容的级别.

我试图理解为什么他们建议将xsrfToken添加到JWT.是不是将JWT存储在cookie中然后将其解压出并将JWT放在HTTP头中并根据HTTP头验证请求与Angular的X-XSRF-TOKEN完成相同的操作?如果您根据标头中的JWT进行身份验证,则其他域无法代表用户发出请求,因为其他域无法从cookie中提取JWT.我不了解JWT中xsrfToken的目的 - 也许它只是一个额外的防御层 - 这意味着攻击者必须在您的站点上拥有受损的脚本,并且当时CSRF必须是用户.所以他们必须以两种方式击中你以便能够进行攻击.

帖子在这个答案中链接说:

最后一件事是确保您对每个HTTP请求都有CSRF保护,以确保启动对您站点的请求的外部域无法正常运行.

[...]然后,在每次进入服务器的请求中,确保您自己的JavaScript代码读取cookie值并将其设置在自定义标头中,例如X-CSRF-Token,并验证服务器中每个请求的值.外部域客户端无法为您的域的请求设置自定义标头,除非外部客户端通过HTTP选项请求获得授权,因此任何CSRF攻击尝试(例如在IFrame中,无论如何)都将失败.

即使他们可以设置自定义标头,他们也无法访问存储JWT令牌的cookie,因为只有在同一域上运行的JavaScript才能读取cookie.

唯一可行的方法是通过XSS,但如果存在XSS漏洞,JWT中的xsrfToken也会受到影响,因为在可信客户端域中运行的恶意脚本可以访问cookie中的JWT,并在请求中包含xsrfToken的标头.

所以等式应该是:

  • TLS + JWT存储在安全cookie + JWT请求标头中+没有XSS漏洞.

如果客户端和服务器在不同的域中运行,则服务器应发送JWT,客户端应使用JWT创建cookie.我认为这个等式对这种情况仍然有效.

更新: MvdD同意我的意见:

由于浏览器不会自动将标头添加到您的请求中,因此它不容易受到CSRF攻击

Tom*_*ott 9

我是Stormpath Blog Post的作者.在JWT中存储XSRF令牌并不是它在JWT中的存在,而是它在cookie中.cookie应该是httpOnly,因此您无法从Javascript中读取它.

现在,我认为引起一点混乱的一点是我谈论角度的地方.Angular设置它只是XSRF cookie(它不是httpOnly)在请求时将它放入标题(这只能通过同一域上的javascript完成).这些不是相同的cookie.

如果您考虑在应用程序中实现XSRF支持,那么已经完成了存储服务器端状态和存储XSRF的点.将它存储在httpOnly cookie中是关于使用XSRF进行无状态处理.在这里,您将验证JWT签名,从索赔中获取XSRF,并将其与标头进行比较.

您的问题的答案是,您不需要在您的服务器上存储状态.


Chi*_*edo 5

我的理解是:

  • 商店JWT是HTTPonly cookie。
  • 在该JWT中,存储XSRF令牌的哈希版本。
  • 在客户端登录时向其发送XSRF令牌,以便他们可以将其存储在本地存储中
  • 稍后,当客户端发送请求时,JWT将通过cookie自动与每个请求一起发送,然后您还通过标头或查询变量发送XSRF令牌,并在服务器端重新哈希以与服务器上JWT中的内容进行比较

您的JWT受到保护,防止其在XSS中被盗,并且免受XSRF的保护。XSS仍可以在您的浏览器上执行,但只能对该浏览器中的会话造成损害。最终,您不能阻止某人编写只在您的浏览器上运行的非常详细的脚本,因此Web开发人员仍然需要传统的安全措施来防止XSS。

  • 我仍然对此感到困惑。那么,这是一种安全的技术吗?另外,我不明白为什么我需要 csrf。因为如果我存储在本地 sotrage 然后是可见的。能不能指点一个方向的例子! (2认同)