在处理包含 Authorization 头的 HTTP 请求时,CORS(跨域资源共享)的处理会有所不同,主要是因为 Authorization 头属于“凭据”(credentials)的一部分。以下是对如何处理 CORS 以及与不包含 Authorization 头的请求的区别进行的详细说明。
1. CORS 基本概念
CORS 是一种安全机制,用于控制浏览器对跨域请求的处理。当浏览器发现一个请求是跨域请求时,它会根据 CORS 规则来决定是否允许这个请求。
2. 包含 Authorization 头的请求
当 HTTP 请求中包含 Authorization 头时,这个请求被视为“带凭据”的请求(即 credentials: include)。这种情况下,浏览器会在发送请求时包含 cookies 和其他凭据,并且会要求服务器在响应中包含特定的 CORS 头。
处理步骤:
-
预检请求(Preflight Request):
- 对于“带凭据”的请求,浏览器会发送一个 OPTIONS 预检请求,以确定服务器是否允许该跨域请求。
- 预检请求中会包含
Access-Control-Request-Headers: Authorization等头信息。
-
服务器响应:
- 服务器需要在响应中包含以下 CORS 头:
Access-Control-Allow-Origin: <origin>:指定允许的源,不能是*,必须是具体的域名。Access-Control-Allow-Methods: <methods>:允许的 HTTP 方法。Access-Control-Allow-Headers: Authorization:允许的请求头。Access-Control-Allow-Credentials: true:允许发送凭据(如 cookies、Authorization 头等)。
- 服务器需要在响应中包含以下 CORS 头:
-
实际请求:
- 如果预检请求通过,浏览器会发送实际的请求(如 GET、POST 等),并包含
Authorization头。
- 如果预检请求通过,浏览器会发送实际的请求(如 GET、POST 等),并包含
3. 不包含 Authorization 头的请求
对于不包含 Authorization 头的请求,CORS 的处理会有所不同,具体取决于请求的类型(简单请求或非简单请求)。
简单请求:
-
定义:
- 使用 GET、HEAD、POST 方法。
- 请求头仅包含允许的头(如
Content-Type,但不包含Authorization)。 Content-Type头的值为text/plain、multipart/form-data或application/x-www-form-urlencoded。
-
处理步骤:
- 浏览器直接发送请求,不需要预检请求。
- 服务器需要在响应中包含
Access-Control-Allow-Origin头,指定允许的源。
非简单请求:
-
定义:
- 使用其他 HTTP 方法(如 PUT、DELETE 等)。
- 包含自定义请求头(如
X-Custom-Header)。 Content-Type头的值不是简单类型。
-
处理步骤:
- 浏览器会发送预检请求(OPTIONS),服务器需要响应预检请求,并在响应中包含允许的方法、头等信息。
- 实际请求才会被发送。
4. 区别总结
-
凭据(Credentials):
- 包含
Authorization头的请求是带凭据的请求,需要服务器明确允许(Access-Control-Allow-Credentials: true)。 - 不包含
Authorization头的简单请求不带凭据,可以使用Access-Control-Allow-Origin: *。
- 包含
-
预检请求(Preflight):
- 包含
Authorization头的请求总是会触发预检请求。 - 不包含
Authorization头的简单请求不会触发预检请求,而非简单请求可能会触发预检请求。
- 包含
-
Access-Control-Allow-Origin的值:- 包含
Authorization头的请求不能使用Access-Control-Allow-Origin: *,必须指定具体的源。 - 不包含
Authorization头的简单请求可以使用Access-Control-Allow-Origin: *。
- 包含
5. 示例
服务器响应头(包含 Authorization 头的请求):
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Methods: GET, POST, PUT, DELETE
Access-Control-Allow-Headers: Authorization, Content-Type
Access-Control-Allow-Credentials: true
服务器响应头(不包含 Authorization 头的简单请求):
Access-Control-Allow-Origin: *
6. 安全考虑
-
不允许使用
*与Access-Control-Allow-Credentials: true同时使用:- 如果服务器设置
Access-Control-Allow-Origin: *并且Access-Control-Allow-Credentials: true,浏览器会拒绝响应,因为这会带来安全风险。
- 如果服务器设置
-
确保只允许可信的源:
- 在设置
Access-Control-Allow-Origin时,应该只允许可信的源,避免跨站攻击。
- 在设置
7. 总结
包含 Authorization 头的请求在处理 CORS 时需要更加严格的配置,因为它们涉及凭据的传输。服务器必须明确允许这些请求,并且不能使用通配符 * 来指定允许的源。而不包含 Authorization 头的请求则可以根据是否是简单请求来决定是否需要预检请求,并且可以更灵活地设置 Access-Control-Allow-Origin。