Cross-domain 预检请求中的 cookie
Cross-domain cookies in preflight requests
两个组件:
- https://react.mycompany.com
上的 React 单页应用程序
- https://apigee.proxy.com
上的 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 协议的基本要求。
两个组件:
- https://react.mycompany.com 上的 React 单页应用程序
- https://apigee.proxy.com 上的 Apigee API 代理
登录时,Apigee 使用 Set-Cookie
header:
jwt
cookie
Set-Cookie: jwt={jwtoken};secure;httponly;path=/;samesite=none
在客户端 Chrome 向我显示框架 https://react.mycompany.com
:
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 协议的基本要求。