# CORS 初步探究跨域资源分享

# 什么是同域, 同源政策

同域就是同协议同 hostname同端口 的 domain。同域政策 (SOP, Same Origin Policy) 规定只有同域之间才能互相进行资源访问。超出此范围都算跨域请求 (CORS, Cross-Origin Resource Sharing)。

同源政策 只存在于浏览器-服务器之间,curl,postman 等软件不会受其影响。

# 如何实现跨域请求

跨域分为两种: 简单请求和预检验请求。两者关系互斥, 不存在任何交集

# 简单请求(Simple Request)

只要不触发预检验的都是简单请求,以下是触发简单请求的条件:

  • 使用下列方法之一:
    • GET
    • HEAD
    • POST
  • Content-Type 仅限于以下几种:
    • text/plain
    • multipart/form-data
    • application/x-www-form-urlencoded
  • 除了规范里定义的 subset 之外没有任何header

# 预检验请求(Pre-flighted Request)

那么很明显,只要不符合简单请求的都能划分到预检验请求中。

在预检验中,浏览器会预先发送一个 OPTIONS 请求,作为预先检验,从而使服务器判定这个请求是否安全。如果你的 origin 在服务器的Access-Control-Allow-Origin 里,那么你就被允许跨域访问了。接下来就可以进行发送正式的 request 请求了。

预检验请求每次都会被重新加载,为了减少重载次数可以设置Access-Control-Max-Age 响应头,设置最大缓存时间。

# CORS 安全吗

安全。当初没有同源政策的限制时,只要 hacker 能获取你的 cookie 就能为所欲为。这就是同源政策存在的原因。有人会说既然 CORS 能够实现跨域访问,那么之前的问题不就又出现了吗?没错,It's back again。但CORS 没有在跨域请求里包含了 cookie, 这是和以前最大的区别。

当然,你想携带 cookie 也是允许的。但出于安全的考虑,需要在客户端和服务端设置验证功能,当Access-Control-Allow-Credentials 被设置为true时,也能进行跨域请求。问题也出在这儿,许多服务器会盲目地根据用户的 Origin Value 来把用户添加进Access-Control-Allow-Origin 里,这时只要用户稍作修改也是能够轻易攻破的,这也是一个安全问题。

# 引用链接

Do you really know CORS?