什么叫同源?

  • 协议相同
  • 域名相同
  • 端口相同(浏览器没有遵守这条规定,因此端口不同,浏览器也认为其同源)*

举例来说,http://www.example.com/dir/page.html这个网址,协议是http://,域名是www.example.com,端口是80(默认端口可以省略),它的同源情况如下。

  • http://www.example.com/dir2/other.html:同源
  • http://example.com/dir/other.html:不同源(域名不同)
  • http://v2.www.example.com/dir/other.html:不同源(域名不同)
  • http://www.example.com:81/dir/other.html:不同源(端口不同)
  • https://www.example.com/dir/page.html:不同源(协议不同)

目的

用于保护用户隐私,例如用户登陆到A网站,记录了用户的storage和cookie,如果用户又登陆了B网站,B网站可以随时查看其A网站的Cookie,有隐私安全的风险

限制范围

  • 数据读取限制: 阻止通过 XMLHttpRequestFetch 发起的跨域请求读取响应数据(这是最严格的限制)。
  • DOM 操作限制: 阻止跨域的脚本访问或操作另一个窗口或 iframe 中的 DOM 元素。
  • 存储访问限制: 阻止跨域访问 CookieslocalStorageIndexedDB 等浏览器存储数据。

例外

postMessage 没有严格的同源限制,它的设计目的恰恰是为了安全地打破同源限制,实现跨域通信。

postMessage 允许一个窗口安全地向另一个不同源的窗口发送消息。然而,为了确保安全,它内置了关键的安全机制

reference