Skip to content

参考

基于 HTTP 现代标准 · 核于 2026-06

速查

  • 同源 = 协议 + 域名 + 端口全等;SOP 拦读取不拦发送
  • 跨域(origin)比跨站(site = 协议 + eTLD+1)更严格;同源⊆同站
  • CORS = 服务器响应头授权浏览器放行跨源读取
  • 简单请求:方法 GET/HEAD/POST + CORS 安全头 + Content-Type 三种值
  • application/json → 触发预检 OPTIONS
  • 凭证 credentials:'include' + Allow-Credentials:true;此时 Allow-Origin 不能用 *
  • 回显具体源时必带 Vary: Origin(缓存正确性)
  • CORS 报错 = 浏览器拦截,请求已达服务器
  • JSONP 靠 <script>、只 GET、有安全风险、已被 CORS 取代
  • 反向代理绕 SOP(浏览器只与同源代理通信);Vite/webpack 开发 proxy、nginx 生产
  • SameSite:Lax(默认)/ Strict / None(须 Secure);缓解 CSRF
  • COOP + COEP → crossOriginIsolated 解锁 SharedArrayBuffer

同源判定

对比 URL(基准 https://a.com/p结果原因
https://a.com/other同源仅路径不同
http://a.com跨源协议不同
https://a.com:8443跨源端口不同
https://x.a.com跨源(同站)子域不同
https://b.com跨源(跨站)域名不同

SOP 限制:跨源 DOM / AJAX 响应 / Cookie·storage 读取。不受限:<img>/<script>/<link>/<video>/表单提交/跳转。

CORS 简单请求 vs 预检

简单请求预检请求
触发条件方法 GET/HEAD/POST + 仅 CORS 安全头 + Content-Type∈三种其他(PUT/DELETE、自定义头、application/json 等)
流程直接发 + Origin先 OPTIONS 预检,通过再发真实请求
失败副作用请求已达服务器(副作用可能已发生)预检失败则真实请求不发出

Content-Type 简单三值:application/x-www-form-urlencoded / multipart/form-data / text/plain

Access-Control-* 响应头全谱

响应头作用
Access-Control-Allow-Origin允许的源(带凭证时不能用 *,须回显具体源)
Access-Control-Allow-Methods预检:允许的方法
Access-Control-Allow-Headers预检:允许的自定义请求头
Access-Control-Allow-Credentialstrue 允许带凭证(唯一合法值,否则省略)
Access-Control-Expose-Headers允许 JS 读取的额外响应头(默认仅 7 个安全头)
Access-Control-Max-Age预检结果缓存秒数(浏览器有上限:Chrome 7200 / Firefox 86400)
Vary: Origin回显具体源时必带,防缓存跨源污染

跨域方案对比

方案原理限制现状
CORS服务器响应头授权需服务端配合标准方案
JSONP<script> 跨域 + callback只 GET、有安全风险已淘汰
反向代理浏览器只与同源代理通信需部署代理常用(开发 Vite proxy / 生产 nginx)

SameSite 与跨源隔离

要点
SameSite=Lax(默认)仅顶级导航 + 安全方法(GET/HEAD)放行跨站 Cookie
SameSite=Strict完全禁止跨站携带 Cookie
SameSite=None允许跨站,必须配 Secure
CORPCross-Origin-Resource-Policy:声明谁能跨源引用本资源
COOPCross-Origin-Opener-Policy:隔离 window.opener
COEPCross-Origin-Embedder-Policy: require-corp
crossOriginIsolatedCOOP same-origin + COEP require-corp → 解锁 SharedArrayBuffer、高精度计时器

权威链接

相关页