What is Cross-Origin Resource Sharing (CORS)? 什么是跨域资源共享(CORS)?

What is Cross-Origin Resource Sharing (CORS)? 什么是跨域资源共享(CORS)?
最新回答
一个蛋上三朵花

2023-11-13 03:39:41

跨域资源共享(CORS,Cross-Origin Resource Sharing)是一种浏览器安全机制,允许服务器绕过同源策略(SOP)的限制,明确指定哪些外部源可以访问其资源。 它通过在HTTP请求和响应中添加特定标头,实现跨域数据的安全交互。以下是详细说明:

核心背景:同源策略(SOP)
  • 定义:浏览器强制执行的默认安全策略,限制网页通过脚本访问与其协议、域名、端口不同的资源。例如,
    http://example.com
    的页面无法直接请求
    https://api.example.org
    的数据。
  • 目的:防止恶意脚本窃取用户数据或篡改其他网站内容。
CORS的作用

CORS通过服务器配置,允许特定外部源突破SOP限制,安全地共享资源(如API、字体、图片等)。例如:

  • 一个托管在
    http://www.exampleapp.com
    的Web应用,需访问
    http://api.example.com
    的API时,CORS可显式授权该请求。
CORS的工作流程
  1. 浏览器发起跨域请求

    浏览器自动在请求头中添加Origin字段,标明请求来源(如Origin:

    http://www.exampleapp.com
    )。

  2. 服务器响应检查

    服务器根据CORS策略验证Origin是否合法。若允许,则在响应头中添加:

    Access-Control-Allow-Origin:指定允许的源(如Access-Control-Allow-Origin:

    http://www.exampleapp.com
    ),或通配符*(允许所有源,但存在安全风险)。

    其他可选标头(如Access-Control-Allow-Methods、Access-Control-Allow-Headers)进一步限制请求方法或自定义头。

  3. 浏览器处理响应

    若响应头中的Origin与请求匹配,浏览器允许应用读取响应数据;否则拦截并报错(如CORS policy: No 'Access-Control-Allow-Origin')。

(图片来源:RapidAPI)常见CORS问题与解决方案问题原因
  • 服务器未正确配置CORS标头。
  • 请求携带了需要预检(Preflight)的复杂头(如Content-Type: application/json),但服务器未处理OPTIONS请求。
解决方案
  1. 后端配置CORS

    允许所有源(不推荐):Access-Control-Allow-Origin: *此配置会禁用SOP,增加安全风险,仅适用于公开API。

    指定可信源:Access-Control-Allow-Origin:

    https://somedomain.com
    仅允许特定域名访问,更安全。

    处理预检请求:对复杂请求,服务器需响应OPTIONS方法,并返回正确的CORS标头。

  2. 使用代理服务器

    部署中间层(如Nginx、Node.js代理),将客户端请求转发至目标服务器,并统一添加CORS标头。适用于无法修改目标服务器配置的场景。

关键CORS标头
  • 请求头

    Origin:标识请求来源。

    Access-Control-Request-Method(预检请求):声明后续实际请求的方法。

    Access-Control-Request-Headers(预检请求):声明后续请求携带的自定义头。

  • 响应头

    Access-Control-Allow-Origin:允许的源。

    Access-Control-Allow-Methods:允许的HTTP方法(如GET, POST)。

    Access-Control-Allow-Headers:允许的自定义头(如Authorization)。

    Access-Control-Max-Age:预检请求缓存时间(秒)。

安全注意事项
  • 避免使用Access-Control-Allow-Origin: *处理敏感数据。
  • 结合身份验证(如JWT)进一步限制访问权限。
  • 定期审计CORS配置,防止配置错误导致安全漏洞。

通过合理配置CORS,开发者可在保障安全的前提下,实现跨域资源的高效共享。