同源策略
字数 1301 2025-11-13 14:40:28
同源策略
-
同源策略是浏览器实施的一种核心安全机制。它的根本目的是隔离不同源的文档,防止恶意网站窃取另一个网站的数据或与之进行未经授权的交互。
-
“源”由三个部分共同定义:协议、域名 和 端口。只有当两个资源的这三者完全相同时,它们才属于“同源”。例如:
https://www.example.com/page.html尝试访问https://www.example.com/other.html-> 同源(协议、域名、端口均相同)。https://www.example.com/page.html尝试访问http://www.example.com/other.html-> 不同源(协议不同,HTTPS vs HTTP)。https://www.example.com/page.html尝试访问https://api.example.com/data.json-> 不同源(域名不同,主域名 vs 子域名)。https://www.example.com/page.html尝试访问https://www.example.com:8080/service-> 不同源(端口不同,443 vs 8080)。
-
同源策略主要限制以下类别的跨源交互:
- DOM访问:一个源的脚本无法读取或修改另一个源页面的DOM元素、Cookie或LocalStorage等数据。
- 网络请求:通过
XMLHttpRequest或fetchAPI发起的请求通常会受到限制(尽管请求可以被发送,但浏览器默认会阻止脚本读取返回的响应)。 - 客户端存储:不同源的站点无法访问彼此存储在浏览器中的数据。
-
然而,互联网的运作离不开合理的跨源合作。因此,现代浏览器提供了一些受控的机制来安全地放宽同源策略:
- 跨源资源共享(CORS):这是最常用的标准方法。当浏览器检测到跨源请求时,它会向目标服务器发送一个
Origin头,标明请求来源。服务器如果同意合作,会在响应中包含如Access-Control-Allow-Origin: https://www.example.com这样的头部。浏览器见到这个允许的头部后,才会让脚本访问响应内容。 - 跨文档消息传递(postMessage):提供了一个安全的API,允许来自不同源的窗口/iframe之间进行双向通信。发送方使用
targetWindow.postMessage()发送数据,接收方通过监听message事件来安全地接收。 - JSONP(JSON with Padding):一种较老的变通方法,利用
<script>标签天然可跨源加载的特性来获取数据。由于其安全性较弱(无法处理错误,且完全信任服务器脚本),现已逐渐被CORS取代。
- 跨源资源共享(CORS):这是最常用的标准方法。当浏览器检测到跨源请求时,它会向目标服务器发送一个
-
理解同源策略是理解Web应用安全的基础。它构建了默认的“安全沙箱”,而CORS等机制则是在这堵墙上开设的、受监管的“门”。开发者必须正确配置这些机制,才能在实现功能的同时,不破坏Web应用的安全模型。