跨源资源共享(CORS)了解一下

144 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第5天,点击查看活动详情

1.CORS

概念:跨源域资源共享(CORS)机制允许 Web 应用服务器进行跨源访问控制,从而使跨源数据传输得以安全进行。

跨源资源共享标准新增了一组 HTTP 首部字段,允许服务器声明哪些源站通过浏览器有权限访问哪些资源。

另外,规范要求,对那些可能对服务器数据产生副作用的 HTTP 请求方法(特别是 GET 以外的 HTTP 请求,或者搭配某些 MIME 类型 的 POST 请求),浏览器必须首先发起一个预检请求,从而获知服务端是否允许该跨源请求。

2.预检

概念:为了避免跨域请求对服务器的数据产生不可知的影响,浏览器会用 OPTIONS方法,先发送一个预检请求,待服务器确认可以访问后,再发送实际请求。

如下是一个需要执行预检请求的 HTTP 请求:

 

image.png

上面的代码使用 POST 请求发送一个 XML 文档,该请求包含了一个自定义的请求首部字段(X-PINGOTHER: pingpong)。另外,该请求的 Content-Type 为 application/xml。因此,该请求需要首先发起“预检请求”,可以在控制台的网络连接中查看具体连接和信息。

3.怎么用 CORS?

CORS主要工作在服务端,通过返回不同的Header来告知请求者是否可以访问,下面两个部分列出了 CORS 所有用到的 Header 及其含义。

客户端跨域请求首部字段:

1. Origin:表明预检请求或实际请求的源站。它不包含任何路径信息,只是服务器名称。

image.png

2. Access-Control-Request-Method:将实际请求所使用的 HTTP 方法告诉服务器,post、get等。

image.png

image.png 3. Access-Control-Request-Headers:首部字段用于预检请求。其作用是,将实际请求所携带的首部字段告诉服务器。

image.png

服务器响应跨域请求首部字段:

1.Access-Control-Allow-Origin:用于响应预检请求,表示允许该资源的外域 URI****

image.png

2. Access-Control-Expose-Headers:让服务器把允许浏览器访问的头放入白名单

image.png

3. Access-Control-Max-Age:指定了 preflight 请求的结果能够被缓存多久

image.png

4. Access-Control-Allow-Credentials:当跨域请求中设置了credentials=true但服务端响应中没有 Access-Control-Allow-Credentials: true,那么浏览器是不会把服务器返回的数据发回给请求者。

image.png

5. Access-Control-Allow-Methods:用于响应预检请求,指明实际请求所允许使用的 HTTP 方法

image.png

6. Access-Control-Allow-Headers:用于响应预检请求,指明实际请求中允许携带的 Header

image.png