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



>我正在尝试在 cookie 中实现 jwt 以便在单页应用程序 react 前端上进行身份验证,该前端与运行 Express 的各种节点微服务进行通信。

我这样做是因为似乎将 jwt 存储在会话存储中会使应用程序容易受到 XSS 的攻击。

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

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

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

所以我对我应该采用哪种 csrf 方法感到困惑。 我读过关于双重提交方法的信息,其中您在每个 ajax 请求上提交一个 csrf 令牌,并将相同的值存储在 cookie 中,然后服务器检查两者是否匹配。

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

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

只是不要将 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中的令牌(,并且您从一开始就不会遇到问题。

最新更新