CORS(跨域资源共享)是浏览器在同源策略基础上放行跨域请求的 Web 标准机制,服务器通过响应头声明允许哪些外部网站访问自己的接口资源,是前后端分离开发中最常遇到的跨域解决方案。

| 类型 | Web 安全机制 / HTTP 标准 |
| 全称 | Cross-Origin Resource Sharing |
| 标准组织 | W3C / WHATWG(Fetch 标准) |
| 作用层面 | 浏览器与 HTTP 响应头 |
| 相关概念 | 同源策略、预检请求、Origin |
CORS(Cross-Origin Resource Sharing,跨域资源共享)是一种基于 HTTP 头的浏览器安全机制,允许服务器声明哪些「外来源」的网页可以访问自己的资源,从而在保证安全的前提下有条件地绕过同源策略的限制。
浏览器默认执行「同源策略」:只有协议、域名、端口三者完全相同的两个地址才算同源,网页中的脚本默认只能读取同源服务器返回的数据。这一策略能防止恶意网站偷读用户在其他网站上的信息,但也把正常的跨站调用一并挡住了——比如前端页面部署在一个域名,而接口 API 部署在另一个域名,这在前后端分离架构中非常普遍。
CORS 就是为解决这个矛盾而设计的标准:浏览器发起跨域请求时会自动附带 Origin 请求头标明来源,服务器则通过 Access-Control-Allow-Origin 等响应头回答「是否允许这个来源访问」。浏览器收到响应后进行校验,允许则把数据交给页面脚本,不允许则拦截并在控制台报错。整个过程由浏览器自动完成,该机制现已并入 WHATWG 的 Fetch 标准,被主流浏览器普遍支持。
问:控制台出现 CORS 报错,应该由前端还是后端解决?答:根源在服务器端,需要后端(或网关、反向代理)配置允许的来源等响应头;前端在开发阶段也可用代理临时绕过,但上线仍要靠服务端配置。
问:CORS 报错时请求真的没发出去吗?答:不一定。很多情况下请求已到达服务器并被处理,只是浏览器拦截了响应、不把数据交给页面脚本,因此不能把 CORS 当作服务端的安全防线。
问:CORS 和 JSONP 有什么区别?答:JSONP 是早年利用 script 标签实现跨域的变通手段,只支持 GET 且有安全隐患;CORS 是官方标准,支持各类 HTTP 方法和精细的权限控制,是现在的首选方案。

| 类型 | Web 安全机制 / HTTP 标准 |
| 全称 | Cross-Origin Resource Sharing |
| 标准组织 | W3C / WHATWG(Fetch 标准) |
| 作用层面 | 浏览器与 HTTP 响应头 |
| 相关概念 | 同源策略、预检请求、Origin |
登录 后参与讨论
暂无讨论,来发表第一条评论吧