30

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

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

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

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

4

2 回答 2

30

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

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

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

或者,您可以存储 JWTlocalStorage并将其发送到Authorization标头中,然后您的站点受到 CSRF 保护,但它可能容易受到 XSS 攻击。始终考虑您选择的技术解决方案的安全考虑

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

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

攻击者可以注入 javascript 代码以从本地存储中读取令牌并将其发送到自己的服务器。但是,这种类型的攻击对于仅 http 的 cookie 是不可能的,因为它无法从 javascript 访问

于 2017-08-29T19:44:38.497 回答
4

您的所有问题都与一个 CSRF 令牌永远不会包含在 cookie 中并且 JWT 令牌可以在 cookie 中发送这一事实有关。

可以发送 JWT 令牌:

1-在饼干中

2-在另一种类型的标题中

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

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

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

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

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

于 2017-08-29T19:11:42.790 回答