什么是 跨域资源共享?
跨域资源共享是一种安全机制,允许 Web 浏览器向与提供网页的域不同的服务器发出请求。它使用 HTTP 头来告诉浏览器应该允许哪些跨源请求。
快速了解
| 创建时间 | 2004 年(初始提案),2014 年(W3C 推荐标准) |
|---|---|
| 规范文档 | 官方规范 |
工作原理
CORS 的开发是为了放宽同源策略,默认情况下同源策略会阻止网页向不同域发出请求。当浏览器发出跨源请求时,它首先发送预检 OPTIONS 请求以检查服务器是否允许实际请求。服务器响应 CORS 头,指示允许哪些源、方法和头。CORS 对于使用来自不同域的 API 的现代 Web 应用程序至关重要。配置错误的 CORS 可能导致安全漏洞或请求被阻止。
主要特点
- 放宽同源策略限制
- 使用 HTTP 头进行访问控制
- 预检请求检查权限
- 由服务器端配置控制
- 支持凭据(cookie、认证头)
- 可以指定允许的源、方法、头
常见用途
- 使用第三方 API
- 微服务架构
- CDN 资源加载
- 单页应用
- 跨域字体加载
示例
Loading code...常见问题
CORS 和同源策略有什么区别?
同源策略是浏览器的安全功能,限制网页向不同域发出请求。CORS 是一种放宽此限制的机制,允许服务器通过 HTTP 头指定哪些源可以访问其资源。
为什么在 Postman 中 API 正常工作,但在浏览器中却出现 CORS 错误?
Postman 不是浏览器,不会强制执行 CORS 限制。CORS 是浏览器强制执行的安全机制。当您从网页发出请求时,浏览器会检查 CORS 头。要解决此问题,请配置服务器发送适当的 Access-Control-Allow-Origin 头。
什么是预检请求,什么时候会发生?
预检请求是浏览器在某些跨源请求之前自动发送的 OPTIONS 请求,用于检查实际请求是否安全。当请求使用 GET、HEAD 或 POST 以外的方法,或包含自定义头,或 Content-Type 不是 application/x-www-form-urlencoded、multipart/form-data 或 text/plain 时会发生预检。
可以在带有凭据的请求中使用 Access-Control-Allow-Origin: * 吗?
不可以,当请求包含凭据(cookie 或 HTTP 认证)时,不能使用通配符(*)作为 Access-Control-Allow-Origin 的值。必须指定确切的源。这是一种安全措施,防止凭据泄露给非预期的源。
在本地开发时如何解决 CORS 问题?
在开发过程中,您可以:1)配置后端服务器允许您的本地源;2)使用代理服务器(如 webpack-dev-server 代理);3)使用禁用 CORS 的浏览器扩展(出于安全原因不推荐);4)运行本地代理如 cors-anywhere。在生产环境中,始终在服务器上配置正确的 CORS 头。