通过 JWT 对 Symfony 3 API REST 和 Angular webapp 使用 CSRF 令牌保护有用吗?

arn*_*d-k 4 rest symfony angular

我们正在构建一个基于 Symfony 3 REST API(使用 FosRestBundle)的 Angular 2 Web 应用程序。我们使用有状态 JWT 来对后端和前端之间的用户进行身份验证。

我们现在正在考虑 CSRF,我们想知道除了 JWT 之外还使用 CSRF 令牌是否正确。我们在FosRestBundle 文档中读到:

当构建一个应通过 HTML 表单和 REST API 处理表单的应用程序时,会遇到 CSRF 令牌验证问题。在大多数情况下,有必要为 HTML 表单启用它们,但将它们用于 REST API 是没有意义的。因此,有一个表单扩展可以为具有特定角色的用户禁用 CSRF 验证。这当然要求 REST API 用户验证自己的身份并获得分配的特殊角色。

我们还阅读了其他一些与此相关的 StackOverflow 问题(例如,请参见此处此处)。

我的问题很简单:为什么不建议将 CSRF 令牌与 REST API 一起使用?我们不明白 JWT 如何防范 CSRF 攻击。

谢谢 :-)

Bar*_*ada 5

首先,“有状态的 JWT”是一个矛盾的说法。引用JWT的介绍

每当用户想要访问受保护的路由或资源时,用户代理应该发送 JWT,通常使用承载模式在授权标头中发送。标头的内容应如下所示:

Authorization: Bearer <token>

这是一种无状态身份验证机制,因为用户状态永远不会保存在服务器内存中。服务器的受保护路由将检查授权标头中是否存在有效的 JWT,如果存在,则将允许用户访问受保护的资源。

使用 JWT 进行身份验证,如果正确完成,会使 CSRF 令牌过时。这是因为 CSRF 攻击依赖于浏览器存储您的 cookie,并将它们与每个请求一起发送到服务器。但是,当单击伪造表单中的按钮触发 POST 请求时,该请求将永远不会包含标Authorization头,因此服务器会将其视为未经授权。