Node.js 具有无状态服务器且无服务器端呈现的cookie中的JWT身份验证

Node.js 具有无状态服务器且无服务器端呈现的cookie中的JWT身份验证,node.js,reactjs,cookies,jwt,csrf,Node.js,Reactjs,Cookies,Jwt,Csrf,我正在尝试在一个单页应用程序前端的cookies for auth中实现jwt,该应用程序前端与运行express的各种节点微服务进行通信 我这样做是因为将jwt存储在sessionstorage中会使应用程序易受XSS攻击 但是,通过使用cookie,API现在容易受到csrf攻击 传统上,通过创建csrf令牌,将其存储在服务器会话中,然后将其呈现在隐藏表单字段中,可以减轻csrf攻击。 然后,在提交表单时,将对照服务器会话值检查csrf令牌的值,以检查它们是否匹配 我不能使用这种方法,因为:

我正在尝试在一个单页应用程序前端的cookies for auth中实现jwt,该应用程序前端与运行express的各种节点微服务进行通信

我这样做是因为将jwt存储在sessionstorage中会使应用程序易受XSS攻击

但是,通过使用cookie,API现在容易受到csrf攻击

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

我不能使用这种方法,因为: -服务器是无状态的 -没有服务器端渲染

因此,我不知道我应该采用哪种csrf方法。 我已经读过关于double submit方法的文章,在这种方法中,您在每个ajax请求上提交一个csrf令牌,并在cookie中存储相同的值,然后服务器检查两者是否匹配

但是,我无法首先将初始csrf令牌放入html中,因为没有服务器端呈现


在无服务器端呈现的无状态体系结构中,在具有csrf保护的cookie中实现jwt的最佳实践是什么?

只是不要将jwt令牌存储在cookie中

CSRF攻击是可能的,因为浏览器会发送带有HTTP请求的cookie,即使它们是由第三方站点上运行的脚本启动的。因此,
evilsite.com
可能会发送一个
DELETEhttp://yoursite.com/items/1
请求您的web服务。此端点要求您登录,但由于浏览器将发送为
yoursite.com
存储的任何cookie,如果身份验证是基于cookie的,则
evilsite.com
可以借助您的身份验证方法,调用您的用户不打算代表他们调用的身份验证方法


但是,身份验证不必基于cookie。如果您正在创建客户端呈现的JavaScript应用程序,那么将身份验证令牌作为HTTP头而不是cookie发送是很简单的。如果您这样做,
evilsite.com
就不可能使用您的代币(他们只能使用存储在cookies中的代币),您从一开始就不会遇到问题。

您如何设置cookies?假设您的一个微服务有一个身份验证端点,允许用户登录?使用auth0,用户在其站点上托管的登录页面上登录,有一个回调url,他们通过url参数中的令牌重定向到该url,该url目前存储在localstorage中。我不确定如何让它与cookie一起工作,我考虑过使用令牌将请求发送到服务器端点,然后返回httponly cookie,但这对我来说似乎有点不安全。所以你是说不要将jwt存储在cookie中,而是存储在localstorage中。那么它不容易受到XSS攻击吗?我只是想澄清一下,目前我在每个请求的头中发送jwt,但我必须将jwt存储在某个地方,它当前在localstorage中,易受XSS攻击,这就是为什么我要寻找基于cookie的解决方案。我相信cookie只有在服务器设置的仅HTTP cookie的情况下才能防止XSS攻击。在您的情况下,客户端已经可以访问令牌(通过URL),因此您没有该选项。你只需要格外小心,不要让任何恶意脚本在你的网站上执行。请参阅:@MrF FYI:如果攻击者成功使用XSS,他就可以绕过您添加的所有CSRF保护。我宁愿使用
localStorage
,防止CSRF,只担心XSS:这是一个小得多的攻击面。