【问题标题】:Is the Access-Control-Allow-Origin CORS header required when doing a preflight request?执行预检请求时是否需要 Access-Control-Allow-Origin CORS 标头?
【发布时间】:2015-02-06 15:05:59
【问题描述】:

我们在我们的网站上看到了众所周知的 CORS 错误:

XMLHttpRequest 无法加载 https://my-site.com/api。请求的资源上不存在“Access-Control-Allow-Origin”标头。 Origin 'https://my-other-site.com' 因此不允许访问。

问题是,Access-Control-Allow-Origin 在预检请求中设置正确...

OPTIONS https://my-site.com/api HTTP/1.1
Host: my-site.com
Access-Control-Request-Method: POST
Origin: https://my-other-site.com
Access-Control-Request-Headers: my-custom-header, accept, content-type
Accept: */*
Referer: https://my-other-site.com/
...other stuff...


HTTP/1.1 200 OK
Access-Control-Allow-Origin: https://my-other-site.com
Access-Control-Allow-Methods: POST
Access-Control-Allow-Headers: my-custom-header, accept, content-type
Access-Control-Expose-Headers: my-custom-header
...other stuff...

...但是,它没有在后续请求中设置。

POST https://my-site.com/api HTTP/1.1
Host: my-site.com
Accept: */*
My-Custom-Header: abcd123
Origin: https://my-other-site.com
Referer: https://my-other-site.com/
...other stuff...


HTTP/1.1 200 OK
My-Custom-Header: abcd123
...other stuff...

我不明白这个问题。根据我在网上阅读的一切,如果我们使用预检请求,我们不需要为实际请求添加 CORS 标头。但是,显然情况并非如此。

所有示例herehere 在实际响应中都包含Access-Control-Allow-Origin 标头,但不包含任何其他“必需” CORS 标头。当我们将那个标头添加到我们的实际响应中时,错误就消失了。


所以我的问题是,两个请求中实际上都需要 Access-Control-Allow-Origin 标头吗?这是在哪里说明的?为什么这是真的?

【问题讨论】:

    标签: javascript security web cors


    【解决方案1】:

    是的,看起来两个响应都应该包含必要的 CORS 标头。

    Simple Cross-Origin RequestCross-Origin Request with Preflight 中,“实际请求”遵循相同的行为,无论预检如何(分别为第 1 步和第 3 步)都检查 CORS 标头。

    1. [...] 应用make a request steps 并在发出请求时遵守以下请求规则

    给定资源的资源共享检查算法如下:

    1. 如果响应包含零个或多个Access-Control-Allow-Origin 标头值,则返回失败并终止此算法。

    2. [...]

    预检请求只会阻止“实际请求”的开始。

    【讨论】:

    • ““实际请求”遵循相同的行为,无论预检如何都检查 CORS 标头” - 但这似乎不是真的。实际请求在没有 Access-Control-Allow-MethodsAccess-Control-Allow-Headers 标头的情况下正常工作。然而(正如我现在刚刚发现的),似乎Access-Control-Expose-Headers 标头在预检和实际请求中都是 所必需的。 WTF!?
    猜你喜欢
    • 1970-01-01
    • 2021-12-19
    • 2018-09-19
    • 2019-06-19
    • 2017-01-28
    • 2020-02-27
    • 2019-02-07
    • 1970-01-01
    • 2021-08-12
    相关资源
    最近更新 更多