同源策略:为什么XMLHttpRequest不能跨域请求资源?

浏览器安全:
  • Web页面安全
  • 浏览器网络安全
  • 浏览器系统安全

在没有安全保障的Web世界中,我们是没有隐私的。因此需要安全策略来保障我们的隐私和数据的安全。

最基础、最核心的安全策略:同源策略

什么是同源策略?其主要表现在哪些方面?

如果两个 URL 的协议、域名和端口都相同,我们就称这两个 URL 同源。主要表现在:

  • DOM: 同源策略限制了来自不同源的JavaScript脚本对当前DOM对象读和写的操作。
  • Web数据: 同源策略限制了不同源的站点读取当前站点的Cookie、IndexDB、LocalStorage等数据。
  • 网络: 同源策略限制了通过XMLHttpRequest等方式将站点的数据发送给不同源的站点。
安全和便利性的权衡

同源策略会隔离不同源的DOM、页面数据和网络通信,实现Web页面的完全安全。但要绝对的安全就要牺牲掉便利性,这也会使得 Web 项目难以开发和使用,为了找到中间的平衡点,就得出让一些安全性来满足灵活性,也就是目前的页面安全策略原型。

  • 页面可以引入第三方资源,不过这也暴露了很多诸如 XSS 的安全问题(比如通过各种途径往 HTML 文件中插入恶意脚本;将 Cookie、IndexDB、LoacalStorage 等敏感数据通过 XSS 的手段发送给服务器),因此又在这种开放的基础之上引入了 CSP(内容安全策略) 来限制其*程度。
  • 使用 XMLHttpRequest 和 Fetch 都是无法直接进行跨域请求的,因此浏览器又在这种严格策略的基础之上引入了跨域资源共享策略(CORS),让其可以安全地进行跨域操作。
  • 两个不同源的 DOM 是不能相互操纵的,因此,浏览器中又实现了跨文档消息机制(window.postMessage 的 JavaScript 接口),让其可以比较安全地通信。
内容安全策略(CSP)的核心是什么?

CSP 的核心思想是让服务器决定浏览器能够加载哪些资源,让服务器决定浏览器是否能够执行内联 JavaScript 代码

总结:

如果页面中没有安全策略进行保障,那么Web世界中将无任何隐私和数据安全可言,因此有了同源策略。

【同源策略】是Web在DOM、Web 数据和网络三个层面上提供的安全策略,保证我们在Web使用中的隐私和数据安全。

但过于严格的安全策略,将导致Web项目难以开发和维护,所以我们必须出让一部分安全性来达到安全和灵活的平衡。

Web在出让安全性方面主要是允许嵌入第三方资源、跨域资源共享。为解决允许嵌入第三方资源的风险,最典型的就是XSS攻击,浏览器引入了内容安全策略,由服务器来决定浏览器能够加载哪些资源。为解决跨域资源共享,浏览器又引入了跨域资源共享策略。