文章目录
一、同源策略/SOP(Same origin policy)
1.1 源(origin)的定义
以下三个部分共同构成了一个源:
-
协议:如http、https、ftp等;
-
域名:如
www.baidu.com
、www.google.com
等; -
端口:如443、80等。
1.2 同源的含义
如果两个 URL 的源完全相同的话,则这两个 URL 是同源。
举例来说, http://store.company.com/dir/page.html
与下面的 URL 比较:
URL | 结果 | 原因 |
---|---|---|
http://store.company.com/dir2/other.html |
同源 | 只有路径不同 |
http://store.company.com/dir/inner/another.html |
同源 | 只有路径不同 |
https://store.company.com/secure.html |
失败 | 协议不同 |
http://store.company.com:81/dir/etc.html |
失败 | 端口不同 ( http:// 默认端口是80) |
http://news.company.com/dir/other.html |
失败 | 主机不同 |
1.3 同源策略
同源策略是一个重要的安全策略,它是浏览器最核心、最基本的安全功能。它用于限制非同源的站点之间如何进行数据交互,极大程度上防止了如CSRF、XSS等网络攻击。
具体的限制措施如下:
- 无法读取对方的 Cookie、LocalStorage 和 IndexDB。
- 无法获得对方的 DOM。
- 不能向对方发送 AJAX 请求。
二、CORS(跨源资源共享)
由于浏览器的同源策略,浏览器不能向不同源的URL发送AJAX请求,但有时候还就需要这样做。这个问题有几种解决方案,但最终极的解决方案是CORS。
CORS是一个W3C标准,全称是“跨源资源共享”(Cross-origin resource sharing)。它允许浏览器不同源的URL发出XMLHttpRequest
请求,从而克服了AJAX只能同源使用的限制。
CORS是基于HTTP头的,它新增了一组 HTTP 首部字段,允许服务器声明哪些源站可以通过浏览器访问哪些资源。
2.1 预检请求
对于某些请求,**浏览器必须首先使用 OPTIONS
方法发起一个预检请求,从而获知服务端是否允许该跨源请求。**服务器确认允许之后,才发起实际的 HTTP 请求。