Web安全之CORS跨域资源共享详解
字数 1392 2025-11-16 08:59:36
Web安全之CORS跨域资源共享详解
知识点描述
CORS(跨域资源共享)是一种基于HTTP头的机制,允许服务器指示浏览器放松同源策略的限制,使不同源的Web应用能够安全地进行跨域通信。理解CORS需要掌握同源策略、简单请求与预检请求的区别、CORS头部字段及其工作原理。
同源策略基础
- 同源定义:协议、域名、端口完全相同
- 限制范围:Cookie/LocalStorage访问、DOM操作、AJAX请求等
- 跨域需求:现代Web应用需要集成多个域名的资源和服务
CORS工作原理详解
简单请求处理流程
-
请求条件:
- 方法为GET、HEAD、POST之一
- 仅含安全头部(Accept、Accept-Language等)
- Content-Type为application/x-www-form-urlencoded、multipart/form-data或text/plain
-
浏览器行为:
- 自动在请求头添加Origin字段,如:
Origin: https://example.com - 服务器响应需包含
Access-Control-Allow-Origin头部
- 自动在请求头添加Origin字段,如:
-
服务器响应示例:
HTTP/1.1 200 OK
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Credentials: true
预检请求处理流程
-
触发条件(满足任一):
- 非简单方法(PUT、DELETE等)
- 自定义头部字段
- Content-Type为application/json等非简单类型
-
预检请求阶段:
- 浏览器先发送OPTIONS请求
- 包含关键头部:
OPTIONS /resource HTTP/1.1
Origin: https://example.com
Access-Control-Request-Method: PUT
Access-Control-Request-Headers: X-Custom-Header
- 预检响应验证:
- 服务器返回允许的策略:
HTTP/1.1 204 No Content
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Methods: PUT, DELETE
Access-Control-Allow-Headers: X-Custom-Header
Access-Control-Max-Age: 86400
- 实际请求阶段:
- 预检通过后浏览器发送实际请求
- 处理流程同简单请求
CORS关键头部字段解析
请求头部字段
- Origin:声明请求来源
- Access-Control-Request-Method:预检时声明实际请求方法
- Access-Control-Request-Headers:预检时声明自定义头部
响应头部字段
- Access-Control-Allow-Origin:指定允许的源(*或具体域名)
- Access-Control-Allow-Methods:允许的HTTP方法列表
- Access-Control-Allow-Headers:允许的自定义头部列表
- Access-Control-Allow-Credentials:是否允许发送Cookie
- Access-Control-Max-Age:预检结果缓存时间
- Access-Control-Expose-Headers:允许前端访问的响应头
带凭证的请求处理
- 客户端设置:
fetch(url, {
credentials: 'include'
})
- 服务器配置:
- Access-Control-Allow-Origin必须为具体域名
- Access-Control-Allow-Credentials必须为true
CORS安全实践
服务器端配置最佳实践
- 严格限制允许的源域名,避免使用通配符*
- 根据需求精确配置允许的方法和头部
- 对敏感操作实施额外的身份验证
- 设置适当的Access-Control-Max-Age减少预检请求
常见问题与解决方案
- 预检请求失败:检查服务器OPTIONS方法处理
- 凭证发送失败:确认Allow-Origin为具体域名且Allow-Credentials为true
- 缓存问题:合理设置Max-Age或使用版本控制
通过深入理解CORS的每个环节,开发者能够正确配置跨域策略,在保障安全的前提下实现灵活的跨域资源共享。