https://developer.mozilla.org/zh-CN/docs/Web/HTTP/CORS

跨源资源共享
(CORS)(或通俗地译为跨域资源共享)是一种基于 HTTP 头的机制,该机制通过允许服务器标示除了它自己以外的其它 origin(域,协议和端口),使得浏览器允许这些 origin 访问加载自己的资源。跨源资源共享还通过一种机制来检查服务器是否会允许要发送的真实请求,该机制通过浏览器发起一个到服务器托管的跨源资源的"预检"请求。在预检中,浏览器发送的头中标示有 HTTP 方法和真实请求中会用到的头。

跨源 HTTP 请求的一个例子:运行在

https://domain-a.com
的 JavaScript 代码使用
XMLHttpRequest
来发起一个到
https://domain-b.com/data.json
的请求。

出于安全性,浏览器限制脚本内发起的跨源 HTTP 请求。 例如,

XMLHttpRequest
Fetch API 遵循同源策略。这意味着使用这些 API 的 Web 应用程序只能从加载应用程序的同一个域请求 HTTP 资源,除非响应报文包含了正确 CORS 响应头。

跨源域资源共享(CORS)机制允许 Web 应用服务器进行跨源访问控制,从而使跨源数据传输得以安全进行。现代浏览器支持在 API 容器中(例如

XMLHttpRequest
Fetch)使用 CORS,以降低跨源 HTTP 请求所带来的风险。

客户端和服务器之间使用 CORS 首部字段来处理权限:

以下是浏览器发送给服务器的请求报文:

GET /resources/public-data/ HTTP/1.1
Host: bar.other
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:71.0) Gecko/20100101 Firefox/71.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Connection: keep-alive
Origin: https://foo.example

请求首部字段 Origin 表明该请求来源于 http://foo.example

HTTP/1.1 200 OK
Date: Mon, 01 Dec 2008 00:23:53 GMT
Server: Apache/2
Access-Control-Allow-Origin: *
Keep-Alive: timeout=2, max=100
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: application/xml
[XML Data]

本例中,服务端返回的

Access-Control-Allow-Origin: *
表明,该资源可以被 任意 外域访问。

Access-Control-Allow-Origin: *

使用

Origin
Access-Control-Allow-Origin
就能完成最简单的访问控制。如果服务端仅允许来自
https://foo.example
的访问,该首部字段的内容如下:

Access-Control-Allow-Origin: https://foo.example