核心是精准控制跨域访问权限,而非简单放开CORS;需坚持白名单、凭证隔离与预检约束,禁用通配符,严格限定源、方法、头部,管理接口建议禁跨域或限内网,启用凭据时Origin不可为*,并叠加CORP/COEP增强隔离。

要限制跨域请求、防范非法接口调用和数据泄露,核心不是“放开 CORS”,而是**精准控制谁可以调用、以什么方式调用、能拿到什么数据**。关键在于拒绝默认放行,坚持白名单 + 凭证隔离 + 预检约束。
明确允许的源,禁用通配符 *
Access-Control-Allow-Origin 设为 * 在涉及 Cookie、Authorization 头或敏感接口时是严重风险。浏览器会直接拒绝带凭据的请求,而攻击者仍可读取响应体(若未设凭据但返回了敏感数据)。
- 生产环境必须使用具体域名,例如
https://app.yourcompany.com或https://admin.yourcompany.com - 多个前端需支持时,用白名单校验 Origin 请求头,动态回写匹配的源(不能拼接或反射任意 Origin)
- Spring Boot 示例中避免
.allowedOriginPatterns("*"),改用.allowedOrigins("https://a.com", "https://b.com")
严格限定方法与头部,缩小攻击面
允许所有方法(PUT, DELETE, OPTIONS)或所有头部(*)等于开放后门,尤其当接口支持用户数据修改或管理操作时。
- 只声明业务真正需要的 HTTP 方法,如仅读取数据就只开
GET和HEAD - 显式列出允许的请求头,例如
Content-Type, Authorization, X-Request-ID,禁用X-Forwarded-For等可能被伪造的头 - 对管理类接口(如
/admin/**),建议完全禁止跨域,或仅限内网 IP 反向代理访问
凭证控制与预检缓存策略
启用 allowCredentials = true 意味着浏览器会携带 Cookie、HTTP 认证等身份凭证——这极大提升便利性,也放大风险。
- 开启凭据时,
Access-Control-Allow-Origin必须为具体源,不可为*;否则浏览器直接拦截 - 设置合理的
maxAge(如 300–3600 秒),减少重复预检开销,但不宜过长(避免策略变更延迟生效) - 确保 OPTIONS 预检请求不触发业务逻辑(如不查库、不发消息),仅做头响应,避免被用于探测或 DoS
叠加 CORP/COEP 增强资源隔离
CORS 解决的是“谁可以读响应”,而 CORP(Cross-Origin Resource Policy)解决的是“谁可以加载该资源”。两者配合可阻断常见跨站数据窃取链路。
- 对静态资源(JS/CSS/图片)、API 接口响应统一添加:
Cross-Origin-Resource-Policy: same-site(仅同站加载)或same-origin(更严格) - 对主页面 HTML 响应添加:
Cross-Origin-Embedder-Policy: require-corp+Cross-Origin-Opener-Policy: same-origin,防止恶意页面通过 iframe 或 window.open 窃取上下文 - 这些头需由 Web 服务器(如 Nginx、Apache)或网关层统一注入,避免应用代码遗漏











