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 攻击。
谢谢 :-)
首先,“有状态的 JWT”是一个矛盾的说法。引用JWT的介绍:
每当用户想要访问受保护的路由或资源时,用户代理应该发送 JWT,通常使用承载模式在授权标头中发送。标头的内容应如下所示:
Authorization: Bearer <token>这是一种无状态身份验证机制,因为用户状态永远不会保存在服务器内存中。服务器的受保护路由将检查授权标头中是否存在有效的 JWT,如果存在,则将允许用户访问受保护的资源。
使用 JWT 进行身份验证,如果正确完成,会使 CSRF 令牌过时。这是因为 CSRF 攻击依赖于浏览器存储您的 cookie,并将它们与每个请求一起发送到服务器。但是,当单击伪造表单中的按钮触发 POST 请求时,该请求将永远不会包含标Authorization头,因此服务器会将其视为未经授权。