🌐 每个后端开发者必须了解的 CORS 策略
Source: Dev.to

什么是 CORS?
CORS 是一种浏览器安全机制,用于控制来自一个来源(域)的资源如何被另一个来源访问。
重要提示: CORS 由浏览器强制执行,但由后端进行配置。
最常见的 CORS 错误
Access-Control-Allow-Origin: *
此响应头允许任何网站调用你的 API。如果你的 API 使用 cookie、令牌或会话,这将是一个严重的安全风险。
安全的 CORS 配置最佳实践
1️⃣ 使用受信任来源的白名单
只允许已知域名:
const allowedOrigins = [
'https://app.example.com',
'https://admin.example.com'
];
2️⃣ 切勿在使用凭证时使用通配符
当你使用 cookie、JWT(放在请求头中)或会话时,必须指定精确的来源:
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://app.example.com
当 Access-Control-Allow-Credentials 为 true 时,* 不被允许。
3️⃣ 限制允许的 HTTP 方法
仅允许 API 实际需要的方法:
Access-Control-Allow-Methods: GET, POST, PUT, DELETE
避免不必要地暴露未使用的 PATCH 或 OPTIONS 等方法。
4️⃣ 限制允许的请求头
明确声明哪些请求头是被允许的:
Access-Control-Allow-Headers: Content-Type, Authorization
5️⃣ 正确处理预检(OPTIONS)请求
浏览器在某些 API 调用前会发送 OPTIONS 请求。
最佳实践:
- 快速响应(例如
204 No Content)。 - 不要对预检响应要求身份验证。
- 返回相应的 CORS 头部。
6️⃣ 基于环境的 CORS 规则
| 环境 | 策略 |
|---|---|
| 开发 | 允许 localhost |
| 预发布 | 允许测试域名 |
| 生产 | 严格的白名单 |
这种方式在保持开发便利的同时,确保生产环境的安全。
7️⃣ 不要把 CORS 当作安全机制
CORS 不能替代:
- 身份验证
- 授权
- 限流
- 输入校验
攻击者仍然可以使用 Postman、curl 等工具直接调用你的 API。
示例:安全的 Node.js CORS 配置
const cors = require('cors');
const express = require('express');
const app = express();
app.use(cors({
origin: ['https://app.example.com'],
methods: ['GET', 'POST', 'PUT', 'DELETE'],
allowedHeaders: ['Content-Type', 'Authorization'],
credentials: true,
maxAge: 86400 // seconds
}));
面试技巧
问: CORS 是前端还是后端的安全特性?
答: CORS 由浏览器强制执行,但由后端控制。
最后思考
优秀的后端开发者:
- 使用最小权限的 CORS 设置。
- 在生产环境中避免使用通配符。
- 将不同环境的配置分离。
- 明白 CORS 并不是实际安全控制的替代品。
正确的 CORS 配置展示了专业的后端成熟度。