Web安全之CORS跨域资源共享详解
字数 1392 2025-11-16 08:59:36

Web安全之CORS跨域资源共享详解

知识点描述
CORS(跨域资源共享)是一种基于HTTP头的机制,允许服务器指示浏览器放松同源策略的限制,使不同源的Web应用能够安全地进行跨域通信。理解CORS需要掌握同源策略、简单请求与预检请求的区别、CORS头部字段及其工作原理。

同源策略基础

  1. 同源定义:协议、域名、端口完全相同
  2. 限制范围:Cookie/LocalStorage访问、DOM操作、AJAX请求等
  3. 跨域需求:现代Web应用需要集成多个域名的资源和服务

CORS工作原理详解

简单请求处理流程

  1. 请求条件:

    • 方法为GET、HEAD、POST之一
    • 仅含安全头部(Accept、Accept-Language等)
    • Content-Type为application/x-www-form-urlencoded、multipart/form-data或text/plain
  2. 浏览器行为:

    • 自动在请求头添加Origin字段,如:Origin: https://example.com
    • 服务器响应需包含Access-Control-Allow-Origin头部
  3. 服务器响应示例:

HTTP/1.1 200 OK
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Credentials: true

预检请求处理流程

  1. 触发条件(满足任一):

    • 非简单方法(PUT、DELETE等)
    • 自定义头部字段
    • Content-Type为application/json等非简单类型
  2. 预检请求阶段:

    • 浏览器先发送OPTIONS请求
    • 包含关键头部:
OPTIONS /resource HTTP/1.1
Origin: https://example.com
Access-Control-Request-Method: PUT
Access-Control-Request-Headers: X-Custom-Header
  1. 预检响应验证:
    • 服务器返回允许的策略:
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
  1. 实际请求阶段:
    • 预检通过后浏览器发送实际请求
    • 处理流程同简单请求

CORS关键头部字段解析

请求头部字段

  1. Origin:声明请求来源
  2. Access-Control-Request-Method:预检时声明实际请求方法
  3. Access-Control-Request-Headers:预检时声明自定义头部

响应头部字段

  1. Access-Control-Allow-Origin:指定允许的源(*或具体域名)
  2. Access-Control-Allow-Methods:允许的HTTP方法列表
  3. Access-Control-Allow-Headers:允许的自定义头部列表
  4. Access-Control-Allow-Credentials:是否允许发送Cookie
  5. Access-Control-Max-Age:预检结果缓存时间
  6. Access-Control-Expose-Headers:允许前端访问的响应头

带凭证的请求处理

  1. 客户端设置:
fetch(url, {
  credentials: 'include'
})
  1. 服务器配置:
    • Access-Control-Allow-Origin必须为具体域名
    • Access-Control-Allow-Credentials必须为true

CORS安全实践

服务器端配置最佳实践

  1. 严格限制允许的源域名,避免使用通配符*
  2. 根据需求精确配置允许的方法和头部
  3. 对敏感操作实施额外的身份验证
  4. 设置适当的Access-Control-Max-Age减少预检请求

常见问题与解决方案

  1. 预检请求失败:检查服务器OPTIONS方法处理
  2. 凭证发送失败:确认Allow-Origin为具体域名且Allow-Credentials为true
  3. 缓存问题:合理设置Max-Age或使用版本控制

通过深入理解CORS的每个环节,开发者能够正确配置跨域策略,在保障安全的前提下实现灵活的跨域资源共享。

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 头部 服务器响应示例: 预检请求处理流程 触发条件(满足任一): 非简单方法(PUT、DELETE等) 自定义头部字段 Content-Type为application/json等非简单类型 预检请求阶段: 浏览器先发送OPTIONS请求 包含关键头部: 预检响应验证: 服务器返回允许的策略: 实际请求阶段: 预检通过后浏览器发送实际请求 处理流程同简单请求 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:允许前端访问的响应头 带凭证的请求处理 客户端设置: 服务器配置: Access-Control-Allow-Origin必须为具体域名 Access-Control-Allow-Credentials必须为true CORS安全实践 服务器端配置最佳实践 严格限制允许的源域名,避免使用通配符* 根据需求精确配置允许的方法和头部 对敏感操作实施额外的身份验证 设置适当的Access-Control-Max-Age减少预检请求 常见问题与解决方案 预检请求失败:检查服务器OPTIONS方法处理 凭证发送失败:确认Allow-Origin为具体域名且Allow-Credentials为true 缓存问题:合理设置Max-Age或使用版本控制 通过深入理解CORS的每个环节,开发者能够正确配置跨域策略,在保障安全的前提下实现灵活的跨域资源共享。