Elon Musk (@elonmusk)
一句话总结:
OpenAI / Anthropic 的 REST API 本来就不是给浏览器直接调用的,所以它们不需要、也不应该在服务器端加 CORS 响应头。
1. 浏览器同源策略与 CORS 的背景
- 浏览器为了安全,默认禁止网页脚本去请求不同源(协议 + 域名 + 端口)的接口,除非目标服务器在响应里显式声明允许(
Access-Control-Allow-Origin
等 CORS 头)。
- 这条规则只约束浏览器里的前端代码(XHR / fetch / WebSocket)。
服务器→服务器、curl、Python 脚本、移动端 App 都不受 CORS 限制。
2. OpenAI / Anthropic 的 API 设计定位
- 官方 SDK 和示例全部是「后端调用」:
Python、Node、Go、curl……这些运行环境都不受浏览器同源策略限制,因此根本不需要 CORS。
- 密钥安全:
把 sk-xxx
这类私钥直接塞进前端代码,等于把钱包密码贴在脑门上。官方文档也明确写着「不要把密钥暴露给客户端」。
- 计费 & 滥用:
如果允许浏览器直接调用,任何人打开你的网页就能用你的额度刷请求,分分钟破产。
3. 如果确实想在浏览器里用
- 自建后端代理:
浏览器 → 你的服务器(带 CORS)→ OpenAI / Anthropic。
密钥只保存在你的服务器,前端拿不到。
- 官方 ChatGPT / Claude Web 版:
那是 OpenAI / Anthropic 自己的域名,属于同源,自然没有跨域问题。
- 第三方封装(如 LangChain、Vercel AI SDK):
它们通常提供可部署的 Next.js / Edge Function 模板,帮你把「后端代理」这一步自动化。
4. 小结
场景 |
是否需要 CORS |
浏览器直接 fetch api.openai.com |
❌ 需要,但官方不提供 |
服务器端 Python / Node 调用 |
❌ 不需要 |
自建代理,浏览器访问代理 |
✅ 代理需返回 CORS 头 |
所以不是 OpenAI / Anthropic「忘了」加 CORS,而是它们故意不加,以强制你把调用放在后端,保护密钥和计费安全。