← 中文资源

简体中文版本

CORS(跨源资源共享)

CORS 是浏览器执行的跨源读取授权机制,服务器通过响应头声明允许的源。它放宽同源策略,但不会保护服务器本身。

阅读英文原文

工作原理

浏览器执行同源策略,一个源的 JavaScript 默认不能读取另一个源的响应。CORS 通过响应头让服务器显式授权。简单请求直接发送,浏览器检查 Access-Control-Allow-Origin 后才把响应交给脚本;非简单方法、自定义请求头或 JSON 内容类型会先发送 OPTIONS 预检,等待 Access-Control-Allow-Methods 与 Access-Control-Allow-Headers。带凭证的请求必须返回具体源,不能使用通配符。

使用场景与权衡

当 https://app.example.com 调用 https://api.example.com,或本地开发服务器调用预发环境时需要 CORS。服务器到服务器调用、curl 和移动端原生 HTTP 客户端不受 CORS 约束。允许列表应尽量窄,不要反射任意 Origin。宽松的 * 配置简单,但与 Cookie 不兼容;预检增加一次往返,可用 Access-Control-Max-Age 缓存。CORS 不负责认证、限流,也不能阻止 CSRF。

示例与误区

app.use(cors({
  origin: ['https://app.example.com'],
  methods: ['GET', 'POST'],
  credentials: true,
}));

CORS 不是服务端防火墙:非浏览器客户端会忽略它,简单请求仍会到达服务器。* 不能与 credentials 同时使用。Cookie 认证的写操作仍需 CSRF 防护,CSP 则限制页面可加载的资源来源。