CORS 保护的是什么
CORS 告诉浏览器某个跨源页面是否可以读取响应。它不能阻止服务器或命令行客户端调用 API,因此白名单必须与认证和授权配合使用。
const allowed = new Set(process.env.CORS_ORIGINS.split(','));
app.use((req, res, next) => {
const origin = req.headers.origin;
if (origin && allowed.has(origin)) {
res.set('Access-Control-Allow-Origin', origin);
res.set('Vary', 'Origin');
}
next();
});
步骤
- 在配置中维护精确来源列表(包含协议、主机和端口),不要写死在代码里。
- 仅当请求来源在白名单中时回显
Access-Control-Allow-Origin,并添加Vary: Origin,避免缓存混淆不同来源的响应。 - 在业务逻辑之前处理 OPTIONS 预检,返回 204 与允许的方法、请求头,并设置合理的
Access-Control-Max-Age。 - 用允许来源、禁止来源和带凭据的请求分别验证;确认没有盲目回显任意来源。
验证
- 允许的来源收到精确匹配的
Access-Control-Allow-Origin。 - 禁止的来源不会收到 CORS 头。
- 预检返回 204,包含所需的 methods 与 headers。
- 响应包含
Vary: Origin。 - 带凭据的请求只在精确来源与正确 Cookie 配置下成功。
常见错误
不回显检查就反射 Origin、允许 null、忘记 Vary、让预检走与正常请求相同的昂贵中间件。永远不要在 Access-Control-Allow-Credentials: true 时使用 *;浏览器会拒绝这种组合,而反射任意来源等同于关闭白名单。