跨域资源共享(CORS)策略解析
跨域资源共享(CORS)是浏览器的一项重要安全机制,用于控制网页上的 JavaScript 代码是否可以访问跨源服务器的响应。当一个网页尝试向不同于自身源(协议、域名或端口)的服务器发送请求时,浏览器会根据服务器返回的 HTTP 响应标头来决定是否放行该请求。
在处理跨域访问时,浏览器主要通过以下两种场景进行评估:
- 实际响应:用于检查浏览器代码是否可以直接读取该响应。
- 预检响应:浏览器在发送某些跨域请求前,会先发送一个
OPTIONS请求进行预检,以确认服务器是否批准后续的请求方法和请求标头。
响应标头与请求源的匹配规则
在 CORS 策略中,Access-Control-Allow-Origin 是最核心的响应标头。它指定了哪些源有权访问该资源。
- 精确匹配:如果标头值与请求源完全一致,浏览器将允许访问。例如,当请求源为
https://app.example.com,且响应标头中包含Access-Control-Allow-Origin: https://app.example.com时,满足精确匹配条件。 - 通配符匹配:在不携带凭证的请求中,可以使用通配符
*来允许任何来源的访问。 - 多值失效:如果
Access-Control-Allow-Origin包含多个值或使用逗号分隔,则该标头将被视为无效。
预检请求中的方法与标头授权
对于非简单请求,浏览器必须通过预检响应来确认请求的安全合规性。
- 请求方法验证:预检响应中的
Access-Control-Allow-Methods标头必须包含请求所使用的方法。如果请求方法属于 CORS 安全列表方法(CORS-safelisted method),则不需要显式出现在该标头中。 - 请求标头验证:请求中携带的自定义标头必须获得
Access-Control-Allow-Headers的批准。 - 状态码要求:预检响应必须包含成功的 2xx HTTP 状态行。如果未提供状态行,预检状态将无法被确认。
凭证对 CORS 决策的影响
当请求中包含 Cookie 或 HTTP 身份验证等凭证时,CORS 的判定规则会变得更加严格:
- 禁止通配符:如果请求包含凭证,
Access-Control-Allow-Origin绝对不能使用通配符*,必须与请求源完全匹配。同时,允许的方法和标头中的通配符也会失去其通配符含义。 - 凭证允许标头:包含凭证的请求必须要求响应中显式包含
Access-Control-Allow-Credentials: true。如果缺失此标头,请求将被浏览器阻止。 - Authorization 标头的特殊性:即使响应中包含
Access-Control-Allow-Headers: *,Authorization标头也必须在Access-Control-Allow-Headers中明确列出,通配符对其无效。
隐私与本地处理说明
本工具在评估您的 CORS 配置时,所有的响应标头和请求信息均完全在您的浏览器本地进行解析与处理。任何数据都不会上传或保存到 BroBroGo 服务器,确保了处理过程的私密性。
本工具仅根据您输入的静态数据和浏览器 CORS 规则进行逻辑推理,不会实际连接目标服务器、读取外部 URL、设置 Cookie、检查 DNS/TLS 记录或修改任何服务器配置。
常见问题解答
我应该粘贴实际响应还是预检响应?
使用实际响应来检查浏览器代码是否可以读取一个响应。使用预检响应作为 OPTIONS 回复,批准稍后的方法及其请求的标头名称。
为什么通配符会因凭据而失败?
当包含 cookie 或 HTTP 身份验证时,允许的来源必须与请求的来源完全匹配。允许的方法和标头的通配符也会失去其通配符含义。
通过的结果是否证明实时请求有效?
否。此结果仅涵盖粘贴的响应和此处输入的请求详细信息。重定向、缓存响应、更改服务器规则、浏览器扩展和预检后的实际响应仍然可以改变结果。