JWT 和 CSRF 的区别

JWT and CSRF differences

我一直在阅读有关 JWT 的信息,据我了解,它是服务器在用户登录后发送的令牌。用户必须在以后的所有 HTTP 请求中发送该令牌。这为服务器创建了一种无状态的方式来验证用户的请求。

现在我不明白的是,如果 JWT 在 header 中发送并标记为仅 HTTP,为什么还需要 CSRF 令牌来防止 CSRF 攻击?我的理解是 JWT 和 CSRF 令牌都与用户相关联,并且 JWT 可以满足这两个目的。

我知道使用 CSRF 令牌是为了不接受来自其他站点的 HTTP 请求。 JWT 怎么不能做到这一点?是什么将 CSRF 令牌与 JWT 令牌分开,并允许它实现这种差异?

我一直在阅读有关 JWT 和 CSRF 令牌以及双重提交方法的文章,但有些东西我似乎无法理解或遗漏了。

您所有的问题都与这样一个事实有关,即 NEVER 中的 CSRF 令牌包含在 cookie 中,而 JWT 令牌 MAY 是在 cookie 中发送。

可以发送 JWT 令牌:

1- 在 cookie 中

2- 在另一种类型中 header

3- 在 header 之外,在某些 POST 属性中

4- 在 headers 之外,在一些 GET 参数中(不是很常见)

但是对于无状态身份验证,您必须使用 cookie(情况 1)。

因此,对于无状态身份验证,您很容易使用 JWT 令牌进行 CSRF。这就是为什么您需要添加一些 CSRF 缓解机制,基于一些未包含在 cookie 中的更多信息,或者 不仅 包含在 cookie 中。

如果您接受实施有状态身份验证,则所有这些都不适用。

基于存储在 cookie 中的令牌(JWT 或随机)的身份验证系统容易受到 CSRF 攻击,因为 cookie 在每个请求中自动发送到服务器,攻击者可以构建对您的网站有害 url link。

https://yoursite.com/delete?something=1

为了保护您的网站,需要使用您的应用程序必须在以下请求中发送的 CSRF 令牌(而不是在 cookie 中)。

或者您可以将 JWT 存储在 localStorage 中并在 Authorization header 中发送它,这样您的网站就可以免受 CSRF 攻击,但它可能容易受到 XSS 攻击。始终考虑您选择的技术解决方案的安全考虑

更新 ¿为什么将 JWT 存储在本地存储中容易受到 XSS 攻击?

查看在本地存储和 http-only cookie 中存储令牌之间的比较 https://academind.com/tutorials/localstorage-vs-cookies-xss

攻击者可以注入 javascript 代码以从本地存储读取令牌并将其发送到他自己的服务器。但是,使用 http-only cookie 不可能进行这种类型的攻击,因为无法从 javascript

访问它