CORS(Cross-Origin Resource Sharing)是一种用于实现跨域请求的机制,允许浏览器和服务器之间在不同源之间共享资源。CORS 通过在 HTTP 头部添加特定的字段来控制跨域访问。以下是 CORS 的工作原理及实现细节:
1. CORS 工作原理
1.1 浏览器发起跨域请求
当浏览器发起一个跨域请求时,它会先发送一个预检请求(preflight request),以检查服务器是否允许实际请求。这是通过发送一个 OPTIONS
请求来实现的,主要用于确认目标服务器是否允许跨域请求。
1.2 服务器响应
服务器需要在响应中包含适当的 CORS 头部,以指示是否允许跨域请求。主要的 CORS 头部包括:
Access-Control-Allow-Origin
:指定允许的源。可以是具体的域名,如https://example.com
,或通配符*
(允许所有源)。Access-Control-Allow-Methods
:指定允许的方法,如GET
,POST
,PUT
,DELETE
。Access-Control-Allow-Headers
:指定允许的请求头,如Content-Type
,Authorization
。Access-Control-Allow-Credentials
:指示是否允许发送带有凭据(如 Cookies)的请求。Access-Control-Max-Age
:指示预检请求的结果可以缓存的时间(以秒为单位)。
1.3 客户端处理响应
- 简单请求:如果请求满足 CORS 规则(如使用
GET
或POST
方法,且请求头仅包括简单头部),浏览器会直接发送实际请求并处理响应。 - 预检请求:对于复杂请求(如使用
PUT
方法或带有自定义头部),浏览器会先发送OPTIONS
请求,然后根据服务器的响应决定是否发送实际请求。
2. 请求类型
2.1 简单请求
满足以下条件的请求被认为是简单请求,不需要预检请求:
- 方法:
GET
,POST
,HEAD
- 请求头:
Accept
,Accept-Language
,Content-Language
,Content-Type
(值为application/x-www-form-urlencoded
,multipart/form-data
,text/plain
)
2.2 复杂请求
不符合简单请求条件的请求会被认为是复杂请求,需要先发送预检请求。复杂请求包括:
- 方法:
PUT
,DELETE
,OPTIONS
- 请求头:
Authorization
,Content-Type
(值为其他非简单值)
3. 服务器设置
3.1 响应 CORS 头部
服务器需要在响应中包含必要的 CORS 头部。例如:
HTTP/1.1 200 OK
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Methods: GET, POST, PUT
Access-Control-Allow-Headers: Content-Type, Authorization
3.2 处理预检请求
对于预检请求,服务器需要回应适当的 CORS 头部:
HTTP/1.1 204 No Content
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Methods: GET, POST, PUT
Access-Control-Allow-Headers: Content-Type, Authorization
Access-Control-Max-Age: 3600
4. CORS 的安全性
Access-Control-Allow-Origin
:避免使用通配符*
,特别是当使用Credentials
时,以确保跨域请求只被信任的源访问。Access-Control-Allow-Credentials
:当设置为true
时,Access-Control-Allow-Origin
不能为*
,必须为具体的源。Access-Control-Allow-Headers
和Access-Control-Allow-Methods
:应限制仅允许必要的头部和方法,以减少安全风险。