Angular 和 PHP JWT 和 CSRF (XSRF) Cookie

Angular and PHP JWT and CSRF (XSRF) Cookies

我有一个 Angular 应用向 PHP 服务器发出 $http 请求。一旦向服务器提交了有效的登录请求,PHP 就会创建一个 JWT 并 使用 PHP 的 setcookie() 函数设置令牌 cookie,并将 httponly 标志设置为 true。此标志仅允许服务器读取 cookie。在每个后续 Angular $http 请求中,cookie 由 PHP 使用 $_COOKIE 验证。

我的问题是,将 PHP 中的 cookie 设置为仅供服务器从 CSRF 读取是否足够安全,或者我是否需要 Angular 创建一个额外的 XSRF 令牌以在每个服务器上发送也要求评估?

我阅读了以下内容 Stormpath article,但对他为什么要在 JWT 负载中设置 xsrfToken 有点迷惑。我的猜测是 Angular 创建一个 XSRF 令牌来匹配。

感谢任何advice/input。

CSRF 攻击的工作原理是,您的身份验证 cookie 由浏览器随每个请求自动发送到服务器。通常,JWT 不会使用 cookie 传递到服务器,而是通过您的 http 请求的身份验证 header 传递(它可能存储在客户端的 cookie 中,但 cookie 不用于将 JWT 传递给服务器)。由于您需要为每个请求设置身份验证 header,因此 CSRF 攻击无法对其恶意请求进行身份验证,因为浏览器不会自动为每个请求发送身份验证 cookie。这就是 JWT 有助于防止 CSRF 攻击的原因。

也就是说,如果您将 JWT 存储在 cookie 中并来回传输 cookie,提取令牌以检查授权策略,那么您与标准 cookie 身份验证一样容易受到 CSRF 攻击。在这种情况下,您可以向您的请求添加 anti-forgery 令牌,以确保您的服务器收到的任何 HTTP 请求都直接来自您的网站。