HTTP Response中的CORS Headers

  • Access-Control-Allow-Credentials
  • Access-Control-Allow-Methods
  • Access-Control-Allow-Origin
  • Access-Control-Max-Age

这四个都是 CORS(Cross-Origin Resource Sharing,跨域资源共享) 机制中的 HTTP Response Header,用来告诉浏览器是否允许来自其他域名的网页访问当前服务器资源

假设有这样一个场景:

复制代码
前端(浏览器)
https://app.example.com
        │
        │ AJAX / fetch()
        ▼
后端 API
https://api.example.com

由于域名不同(app.example.comapi.example.com),浏览器会认为这是跨域请求 ,这时候服务器需要返回一些 Access-Control-* 响应头。


1. Access-Control-Allow-Origin

这是最重要的 CORS Header。

它告诉浏览器:

哪些网站可以访问我的资源?

例如:

复制代码
Access-Control-Allow-Origin: https://app.example.com

表示:

只有

复制代码
https://app.example.com

这个网站可以访问 API。

例如:

复制代码
GET https://api.example.com/user

浏览器收到 Response:

复制代码
HTTP/1.1 200 OK

Access-Control-Allow-Origin: https://app.example.com

浏览器发现:

自己的 Origin 是

复制代码
https://app.example.com

和 Response 一致。

于是:

✅ 允许 JavaScript 读取 Response。


如果服务器返回

复制代码
Access-Control-Allow-Origin: *

表示:

任何网站都可以访问。

例如:

复制代码
https://google.com
https://facebook.com
https://abc.com

都可以调用。


如果没有这个 Header:

复制代码
(no Access-Control-Allow-Origin)

浏览器会直接报:

复制代码
Access to fetch at ...
has been blocked by CORS policy

2. Access-Control-Allow-Methods

这个 Header 告诉浏览器:

允许哪些 HTTP Method。

例如:

复制代码
Access-Control-Allow-Methods:
GET, POST, PUT, DELETE

表示:

允许:

复制代码
GET
POST
PUT
DELETE

不允许:

复制代码
PATCH
OPTIONS
TRACE

例如:

浏览器想发送:

复制代码
DELETE /user/123

浏览器先会问服务器:

复制代码
OPTIONS /user/123

服务器回答:

复制代码
Access-Control-Allow-Methods:
GET, POST

浏览器发现:

DELETE 不在里面。

于是:

❌ 不允许发送 DELETE。


3. Access-Control-Allow-Credentials

这是很多人容易搞混的 Header。

它表示:

是否允许浏览器携带身份信息(Credentials)。

Credentials 包括:

  • Cookie
  • Session
  • TLS Client Certificate
  • HTTP Authentication

例如:

浏览器:

复制代码
fetch(url, {
    credentials: "include"
})

浏览器会带上:

复制代码
Cookie:
SESSIONID=abc123

但是服务器必须回答:

复制代码
Access-Control-Allow-Credentials: true

浏览器才允许:

✅ 带 Cookie。


如果服务器返回:

复制代码
Access-Control-Allow-Credentials: false

或者没有:

复制代码
Access-Control-Allow-Credentials

浏览器会:

❌ 不发送 Cookie。


注意:

这个 Header 不能和

复制代码
Access-Control-Allow-Origin: *

一起使用。

例如:

复制代码
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true

浏览器会认为:

复制代码
非法!

因为:

不可能允许所有网站都携带你的 Cookie。

所以:

如果允许 Credentials,

必须明确写:

复制代码
Access-Control-Allow-Origin:
https://app.example.com

不能写:

复制代码
*

4. Access-Control-Max-Age

这个 Header 表示:

浏览器可以缓存 Preflight(OPTIONS)请求多久。

例如:

第一次:

浏览器:

复制代码
OPTIONS /api/user

服务器:

复制代码
Access-Control-Allow-Origin:
https://app.example.com

Access-Control-Allow-Methods:
GET, POST

Access-Control-Max-Age:
600

表示:

复制代码
600 秒

也就是:

10 分钟。

浏览器会记住:

复制代码
GET
POST
允许

以后:

10 分钟内再发:

复制代码
GET
POST

浏览器:

不会再发 OPTIONS。

直接发:

复制代码
GET

节省一次网络请求。


如果:

复制代码
Access-Control-Max-Age: 86400

表示:

复制代码
24 小时

浏览器一天内不会再问。


四个 Header 的关系

浏览器发起跨域请求时,大致流程如下:

复制代码
Browser
    │
    │ OPTIONS(Preflight)
    ▼
Server

服务器返回:

复制代码
Access-Control-Allow-Origin:
https://app.example.com

Access-Control-Allow-Methods:
GET, POST

Access-Control-Allow-Credentials:
true

Access-Control-Max-Age:
600

浏览器逐项检查:

复制代码
Origin 是否允许?
        │
        ▼
Method 是否允许?
        │
        ▼
是否允许 Cookie?
        │
        ▼
缓存多久?

全部通过后:

复制代码
真正发送 GET / POST 请求

总结

Header 作用 示例
Access-Control-Allow-Origin 指定哪些源(Origin)可以访问资源 https://app.example.com*
Access-Control-Allow-Methods 指定允许的 HTTP 方法 GET, POST, PUT, DELETE
Access-Control-Allow-Credentials 是否允许浏览器携带 Cookie、Session 等身份凭据 true
Access-Control-Max-Age 浏览器缓存预检(Preflight)结果的时间(秒) 60086400

可以把这四个响应头理解成一组权限控制:

  • Allow-Origin可以访问?
  • Allow-Methods :可以执行什么操作
  • Allow-Credentials :访问时能不能携带身份凭据(Cookie、Session 等)?
  • Max-Age :这些规则浏览器可以缓存多久,避免重复发送预检请求。
相关推荐
Yuiiii__1 分钟前
一次“在家连不上公司内网服务”的排障实战记录
网络·智能路由器
普马萨特1 小时前
5G小基站对室内定位的影响
网络·5g
专业工业电源打工人1 小时前
F0505S-2WR3 适配优选 钡特电源 DF2-05S05LS|2W 隔离 DC-DC 模块电源5V转5V硬件选型参数规格解析
大数据·网络·人工智能
he39123771 小时前
ogg命令
运维·网络
其实防守也摸鱼1 小时前
Kimi K3深度测评:长文本之外的真实力
运维·开发语言·网络·人工智能·python·学习·安全
caimouse2 小时前
TCP/IP 协议驱动 (tcpip.sys) 分析
网络协议·tcp/ip·reactos
便利店10242 小时前
快递选「挂号」还是「平邮」?传输层一次讲清
网络·网络协议·tcp/ip·传输层
夜雪一千2 小时前
UDP 协议简介
网络·网络协议·udp
封狼居胥廖3 小时前
网络编程3
网络
三言老师3 小时前
mv移动文件、重命名文件实战案例
linux·服务器·网络·centos