2017-02-15 55 views
3

我们正在构建基于Symfony 3 REST API(使用FosRestBundle)的Angular 2 Web应用程序。我们使用有状态的JWT在后端和前端之间验证用户身份。对于使用JWT的Symfony 3 API REST和Angular webapp使用CSRF令牌保护有用吗?

我们现在正在考虑CSRF,并且我们想知道除了JWT之外是否使用CSRF令牌是正确的。我们看到,在FosRestBundle documentation

当构建既要通过HTML形式,以及通过REST API处理形式单一的应用程序,一个运行与CSRF令牌验证的一个问题。在大多数情况下,需要为HTML表单启用它们,但将它们用于REST API是没有意义的。出于这个原因,有一个表单扩展来禁用具有特定角色的用户的CSRF验证。这当然要求REST API用户对自己进行身份验证并获得指定的特殊角色。

我们了解,其他一些StackOverflow的问题,太(见例如herehere)。

我的问题很简单:为什么不推荐使用带REST API的CSRF令牌?我们不了解JWT如何保护CSRF攻击。

感谢:-)

回答

2

首先, “状态智威汤逊” 是一个矛盾。引述the introduction to JWT

每当用户想要访问受保护的途径和资源,用户代理应该发送的智威汤逊,通常使用承载架构的授权头。标题的内容应该如下所示:

Authorization: Bearer <token>

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

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