<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>浏览器的同源策略 on Last Stand</title><link>https://amatsuzero.github.io/LastStand/tags/%E6%B5%8F%E8%A7%88%E5%99%A8%E7%9A%84%E5%90%8C%E6%BA%90%E7%AD%96%E7%95%A5/</link><description>Recent content in 浏览器的同源策略 on Last Stand</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Thu, 17 Jul 2025 00:00:00 +0800</lastBuildDate><atom:link href="https://amatsuzero.github.io/LastStand/tags/%E6%B5%8F%E8%A7%88%E5%99%A8%E7%9A%84%E5%90%8C%E6%BA%90%E7%AD%96%E7%95%A5/index.xml" rel="self" type="application/rss+xml"/><item><title>浏览器的同源策略</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/security/security-010/</link><pubDate>Tue, 17 Dec 2024 00:00:00 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/security/security-010/</guid><description>&lt;h2 id="概述"&gt;概述&lt;/h2&gt;
&lt;p&gt;本文从以下三个问题，循序渐进，一步步拆解，何为浏览器的同源策略和跨域问题：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;什么是同源策略和跨域问题？&lt;/li&gt;
&lt;li&gt;怎样才算同源？&lt;/li&gt;
&lt;li&gt;同源策略下会有什么限制？&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="什么是同源策略和跨域问题"&gt;什么是同源策略和跨域问题？&lt;/h2&gt;
&lt;p&gt;同源政策是 1995 年由 Netscape 公司（就是创造了 JS 的那家网景公司）引入浏览器的一种策略。&lt;/p&gt;
&lt;p&gt;想要理解同源策略的话，可以先假设如果没有同源策略会发生什么事情。接下来我们通过一则恐怖故事代入理解一下没有同源策略的世界：&lt;/p&gt;
&lt;p&gt;在某个深夜，小明独自一人在家浏览网页，无意间打开了一些特殊网站，而恰巧的是，小明之前刚好打开过某些重要支付平台的网站且还没关闭，这时特殊网站里面可能有一些特殊 JS 脚本，在偷偷获取小明支付平台上的信息，并且偷偷利用了这些信息再结合某些手段，成功把小明支付平台上的钱转走了，小明上完厕所回来后，突然收到支付平台转账成功的短信，然后然后然后瘫坐在地上，泣不成声，仰天长啸，大喊一声：“还我攒了半年的 9.99~”&lt;/p&gt;
&lt;p&gt;恐怖故事听完了，我们来先上个概念，什么是同源策略？&lt;/p&gt;
&lt;p&gt;&lt;a href="https://developer.mozilla.org/zh-CN/docs/Web/Security/Same-origin_policy"&gt;借用 MDN 上的描述&lt;/a&gt;：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;同源策略&lt;/strong&gt;是一个重要的安全策略，它用于限制一个origin的文档或者它加载的脚本如何能与另一个源的资源进行交互。它能帮助阻隔恶意文档，减少可能被攻击的媒介。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;怎么理解这个概念呢？举个栗子，随着汽车数量的上升，现在很多城市都有各种限行政策，就拿广州来说，如果不是 &lt;code&gt;粤A&lt;/code&gt; 的车牌进入城区的话会有开四停四的限行限制。&lt;/p&gt;
&lt;p&gt;同源策略跟汽车限行政策有一点点像，同源策略规定在“同源”下的脚本、文档等资源访问不受限（有点像 &lt;code&gt;粤A&lt;/code&gt; 牌的汽车在广州内行驶不会被限行），如果不是“同源”则无法互相访问脚本、文档等资源（非 &lt;code&gt;粤A&lt;/code&gt; 牌的汽车在广州市区内受开四停四政策限制）&lt;/p&gt;
&lt;p&gt;理解了同源策略后，对于跨域就很好理解了，同源策略是好，我们也需要同源策略，但有些时候我们确实需要不同源的两个网页互相读取信息，这是就产生了跨域问题。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;额外补充&lt;/strong&gt;，同源策略是浏览器的行为，是浏览器的行为，是浏览器的行为（对于这点的解析可以参考：&lt;a href="https://blog.csdn.net/l_z_jay/article/details/121431204"&gt;同源策略下，服务器会收到浏览器的请求吗？&lt;/a&gt;）&lt;/p&gt;
&lt;h2 id="怎样才算同源"&gt;怎样才算同源？&lt;/h2&gt;
&lt;p&gt;所谓“同源”，就是以下三者必须&lt;strong&gt;都相同&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;协议相同&lt;br&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;协议&lt;strong&gt;相同&lt;/strong&gt;的两个域名：（都是 &lt;code&gt;https&lt;/code&gt; 协议）&lt;br&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;https://juejin.cn&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;https://juejin.cn&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;协议&lt;strong&gt;不同&lt;/strong&gt;的两个域名：（一个是 &lt;code&gt;http&lt;/code&gt; 协议，一个是 &lt;code&gt;https&lt;/code&gt; 协议）&lt;br&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;http://juejin.cn&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;https://juejin.cn&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start="2"&gt;
&lt;li&gt;域名相同&lt;br&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;域名&lt;strong&gt;相同&lt;/strong&gt;的两个域名：&lt;br&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;https://juejin.cn&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;https://juejin.cn&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;域名&lt;strong&gt;不同&lt;/strong&gt;的两个域名：（一个是&lt;a href="https://help.aliyun.com/document_detail/155782.html#h2-u4EC0u4E48u53EBu5B50u57DFu540D1"&gt;二级域名&lt;/a&gt;，一个是&lt;a href="https://help.aliyun.com/document_detail/155782.html#h2-u4EC0u4E48u53EBu5B50u57DFu540D1"&gt;三级域名&lt;/a&gt;）（可能这个是最容易记错的）&lt;br&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;https://juejin.cn&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;https://www.juejin.cn&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start="3"&gt;
&lt;li&gt;端口相同&lt;br&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;端口&lt;strong&gt;相同&lt;/strong&gt;的两个域名：&lt;br&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;https://juejin.cn&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;https://juejin.cn&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;端口&lt;strong&gt;不同&lt;/strong&gt;的两个域名：&lt;br&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;https://juejin.cn&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;https://juejin.cn:8081&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;再重复一遍，&lt;/p&gt;
&lt;p&gt;同协议、同域名、同端口，才算同源&lt;/p&gt;
&lt;p&gt;同协议、同域名、同端口，才算同源&lt;/p&gt;
&lt;p&gt;同协议、同域名、同端口，才算同源&lt;/p&gt;
&lt;h2 id="同源策略下会有什么限制"&gt;同源策略下会有什么限制？&lt;/h2&gt;
&lt;p&gt;在同源策略下，如果&lt;strong&gt;非同源&lt;/strong&gt;，会有以下三个方面的行为受到限制：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;DOM&lt;br&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;如果非同源，其 JS 脚本，不能互相对 DOM 进行读写操作&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start="2"&gt;
&lt;li&gt;数据&lt;br&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;如果非同源，不能互相读写 Cookies、LocalStorage、SessionStorage 和 IndexedDB&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start="3"&gt;
&lt;li&gt;网络请求&lt;br&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;如果非同源，不能通过 AJAX 的方式互相发送、接收数据&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;为了方便理解，接下来我们展开说说这三条规则 ↓↓↓&lt;/p&gt;</description></item></channel></rss>