# 浏览器的同源策略

# 什么是同源策略

同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。

同源策略限制了从同一个源加载的文档或脚本如何与来自另一个源的资源进行交互,因为有可能同一个浏览器发出的请求,未必都是用户自愿发出的请求。

# 什么是同源

如果两个 URL 的protocolport (en-US)(如果有指定的话)和 host都相同的话,则这两个 URL 是同源。这个方案也被称为“协议/主机/端口元组”,或者直接是 “元组”。

  • 协议、主机、端口必须完全相同
  • 例如: http://store.company.com/dir/page.html检测以下是否同源
URL 结果 原因
http://store.company.com/dir2/other.html 成功 只有路径不同
http://store.company.com/dir/inner/another.html 成功 只有路径不同
https😕/store.company.com/secure.html 失败 不同协议( https和http )
http: //store.company.com:81/dir/etc.html 失败 不同端口( http:// 80是默认的)
http://news.company.com/dir/other.html 失败 不同域名( news和store )

# 安全性与可用性需要一个平衡点

可用性:HTML 的创作者决定跨域请求是否对本站点安全

  • 允许跨域写操作:例如表单提交或者重定向请求

    • CSRF安全性问题

安全性:浏览器需要防止站点A的脚本向站点B发起危险动作

  • Cookie、 LocalStorage和IndexDB无法读取
  • DOM无法获得(防止跨域脚本篡改DOM结构)
  • AJAX请求不能发送