具有无状态服务器且无服务器端呈现的Cookie中的JWT身份验证

时间:2018-09-17 11:46:29

标签: node.js reactjs cookies jwt csrf

我正在尝试在cookie中实现jwt,以便在单页面应用程序前端响应auth,该前端与运行express的各种节点微服务进行通信。

我正在执行此操作,因为将jwt存储在sessionstorage中似乎使该应用容易受到XSS的攻击。<​​/ p>

但是,通过使用cookie,这些api现在容易受到csrf攻击。

传统上,通过创建csrf令牌,将其存储在服务器会话中,然后将其呈现在隐藏的表单字段中来缓解csrf攻击。 然后,在提交表单后,将对照服务器会话值检查csrf令牌的值以检查它们是否匹配。

我不能将这种方法用于: -服务器是无状态的 -没有服务器端渲染。

因此,我对于应该采用哪种csrf方法感到困惑。 我已经读过有关double Submit方法的信息,在该方法中,您在每个ajax请求中都提交了一个csrf令牌,并在cookie中存储了相同的值,然后服务器会检查两者是否匹配。

但是,由于没有服务器端渲染,我无法首先将初始csrf令牌放入html中。

在无服务器端呈现的无状态架构中,使用csrf保护在cookie中实现jwt的最佳实践是什么?

1 个答案:

答案 0 :(得分:0)

根本不将JWT令牌存储在cookie中

CSRF攻击之所以可能,是因为浏览器会发送带有HTTP请求的cookie,即使它们是由运行在第三方网站上的脚本启动的。因此,evilsite.com可能会向您的Web服务发送一个DELETE http://yoursite.com/items/1请求。该端点要求您登录,但是由于浏览器将发送为yoursite.com存储的所有cookie,因此,如果身份验证基于cookie,则evilsite.com可以使用您的身份验证方法并调用用户的已身份验证方法不想代表他们打电话。

但是,身份验证不必基于cookie。如果要创建客户端渲染的JavaScript应用,则很容易将身份验证令牌作为HTTP标头而不是在cookie中发送。如果这样做,evilsite.com将无法使用您的令牌(它们只能使用存储在cookie中的令牌),而且您一开始就不会遇到问题。