Cross-domain 预检请求中的 cookie

Cross-domain cookies in preflight requests

两个组件:

  1. https://react.mycompany.com
  2. 上的 React 单页应用程序
  3. https://apigee.proxy.com
  4. 上的 Apigee API 代理

登录时,Apigee 使用 Set-Cookie header:

设置 jwt cookie
Set-Cookie: jwt={jwtoken};secure;httponly;path=/;samesite=none

在客户端 Chrome 向我显示框架 https://react.mycompany.com:

的这个 cookie
name: jwt
value: XXX
domain: apigee.proxy.com
path: /
httpOnly: true
secure: true
sameSite: none

现在对 non-auth 请求,Apigee 在处理请求之前会检查是否存在 jwt cookie。

Cookie 未在 OPTIONS 预检请求中发送,因此所有调用均失败。

在客户端,我们使用 fetch() API 和 credentials: 'include'

我在这里错过了什么?

浏览器永远不会在预检 OPTIONS 请求中发送 cookie。所以问题描述的是预期的行为。浏览器不在预检中发送 cookie 的原因是因为 CORS 协议的规范要求浏览器在预检中排除 cookie 和所有其他标准凭证(例如,授权 header)。请参阅 https://fetch.spec.whatwg.org/#ref-for-credentials%E2%91%A5,其中指出:

a CORS-preflight request never includes credentials

…另请参阅答案 https://whosebug.com/a/50959576/441757

因此,预检发送到的服务器必须配置为允许未经身份验证的 OPTIONS 请求 - 并且必须以 200 OK 响应 OPTIONS 请求,即使请求不包含任何 cookie或其他凭证。这是 CORS 协议的基本要求。