浅谈CORS

332 阅读2分钟

「这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战」。

什么是CORS ( Cross-Origin Resource Sharing )

跨域资源共享,是一套组合拳,由一系列HTTP头组成,这些HTTP头组合决定浏览器是否允许客户端JS获取跨域请求的响应数据,同时也给web服务器选择是否允许资源被跨域请求。

CORS headers

  • Access-Control-Allow-Origin: 域白名单,决定哪些域可以访问资源;

  • Access-Control-Allow-Credentials: 决定是否响应 withCredentials 为 true即带Cookies的请求;

  • Access-Control-Allow-Headers 预请求的响应头,决定哪些HTTP头可以用在真正的请求头中;

  • Access-Control-Allow-Methods 预请求的响应头,决定正式请求可以使用哪些方法(GET, POST, PUT ...);

  • Access-Control-Expose-Headers 哪些头可以作为响应头;

  • Access-Control-Max-Age 预请求的返回可以被缓存的时长;

  • Access-Control-Request-Headers 预请求的请求头,告知服务器正式请求中哪些请求头会被使用;

  • Origin 预请求的请求头,告知服务器请求的来源;

当真正一个跨域请求发起时,浏览器会决定这个请求是简单请求还是复杂请求,简单请求则直接发起,复杂请求则需要发起一个预请求来询问服务器是否允许发送该请求。

简单请求

满足如下几点要求则为简单请求

  • GET HEAD 或者 POST

  • 只自定义了Accept\Accept-Language\Content-Language\Content-Type这几种请求头

  • 其中Content-Type只满足如下三种格式

    • application/x-www-form-urlencoded

    • multipart/form-data

    • text/plain

  • 如果请求对象为XMLHTTPRequest类型,对象不能在upload事件上注册事件回调

  • 请求中没有ReadableStream对象

复杂请求

没有满足简单请求的条件外的即为复杂请求,复杂请求会触发预检机制,

客户端会先发送一个OPTIONS方法的请求得到Access-Control-Requeset-Method等响应头判断是否能够成功发起请求,否则放弃发送正式请求,由于OPTIONS方法的请求不会改变服务器资源,所以预请求被认定是安全的。

如果预检请求返回了重定向,多大数浏览器是不支持对预检请求的重定向的,可以先发送一个简单请求,获取到重定向的URL,然后再发送正式请求。

参考

CORS

Cross-Origin Resource Sharing (CORS)