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.com 和 api.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)结果的时间(秒) 600、86400

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

  • Allow-Origin :谁可以访问?
  • Allow-Methods :可以执行什么操作?
  • Allow-Credentials :访问时能不能携带身份凭据(Cookie、Session 等)?
  • Max-Age :这些规则浏览器可以缓存多久,避免重复发送预检请求。
相关推荐
酣大智5 分钟前
TightVNC Server 配置窗口
网络·vnc
隐擎fox7 分钟前
解密 BGP Anycast 边缘路由与跨国链路质量检测:多租户网络出口的低时延与防丢包架构实战
网络·python·网络协议·tcp/ip·网络安全·架构·tcpdump
Escalating_xu24 分钟前
【Linux 网络编程】Windows 客户端访问 Linux:用 Winsock 跑通 UDP 回显
linux·网络·windows
zhengqweasd36 分钟前
Linux 软中断原理:网卡报文是怎么抢占 CPU 的
linux·运维·网络
ESDWAN39 分钟前
为什么跨境网络白天正常、晚上卡顿?如何分析时段性?
linux·网络·php·网络运维
牧羊人.33343 分钟前
自然语言处理基础 03|门控循环单元 GRU
网络·人工智能·rnn·深度学习·自然语言处理·gru
M1582276905544 分钟前
IO-Link 三件套:主站网关与智能传感方案
网络·工业通信
天府云创1 小时前
SRE之DeepSeek 10月15日故障分析、旁推和思考
网络·数据库·人工智能·故障处理·deepseek·api恢复
对讲机数码科普1 小时前
业余无线电野外中继寒地故障排查|东北林区 VHF/UHF 台站四季射频环境适配方案
运维·网络
黄焖鸡能干四碗1 小时前
大数据平台安全防护策略方案(PPT)
大数据·运维·网络·安全·web安全·制造