带凭据的CORS请求处理指南

374 阅读3分钟

在处理包含 Authorization 头的 HTTP 请求时,CORS(跨域资源共享)的处理会有所不同,主要是因为 Authorization 头属于“凭据”(credentials)的一部分。以下是对如何处理 CORS 以及与不包含 Authorization 头的请求的区别进行的详细说明。

bPBHIkD058RlvobcxzgBl41sMLfwitkncwNT5mZDj1sO9BkP2O9NgRGAQhMYWgsre5Of2Yr2HV76fvcaUGidoL0QjH67KWuvvp_pd-zCWJBTOQv9m1VMG2Q2kedhEc2O4GHBMha2vzC7_sw3Zrf1TzE_RmRZ7G1Y4S0rc9FPtJRltiAYongsWzTrXcqByj4i3qLJ2-RyasaUGAZo_OFGQqBjpz-VskyA32.png

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 头等)。
  • 实际请求

    • 如果预检请求通过,浏览器会发送实际的请求(如 GET、POST 等),并包含 Authorization 头。

3. 不包含 Authorization 头的请求

对于不包含 Authorization 头的请求,CORS 的处理会有所不同,具体取决于请求的类型(简单请求或非简单请求)。

简单请求:

  • 定义

    • 使用 GET、HEAD、POST 方法。
    • 请求头仅包含允许的头(如 Content-Type,但不包含 Authorization)。
    • Content-Type 头的值为 text/plainmultipart/form-dataapplication/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