一、跨域和跨站的区别
1.1 跨域
跨域指的是 浏览器同源策略 的一种安全机制,限制了从一个源加载的文档或脚本如何与来自另一个源的资源进行交互。这里的“源”指的是协议、域名和端口号的组合。
通俗点说,浏览器的跨域安全等级很高,限制条件很多:
-
端口不同,算跨域
hamm.cn:443 和 hamm.cn:80
-
域名不同,算跨域
hamm.cn 和 bbbug.com
-
协议不同,算跨域
https:// hamm.cn 和 http:// hamm.cn
那么在上面的限制条件中,如果没有明确通过 header 头告知允许跨域,否则浏览器都会进行请求拦截。
1.2 跨站
跨站一般在Cookie中使用。Cookie写出时可以携带 domain 参数,用来指定 Cookie 的作用域。为了避免 全站类超级Cookie 的出现,在严格模式下,为了避免 Cookie 被跨站读取和发送带来的安全问题,Cookie限制了禁止写出 Cookie 的作用域只能是当前域名以及子域名:
比如我在 hamm.cn 这个站写出 Cookie 的作用域只能是 hamm.cn 或者其子域名,如果作用域是 bbbug.com,那么写出 Cookie 将失败。
不过,a.github.io 和 b.github.io 虽然域名都是 .github.io,却也是属于跨站,无法互相读取或写出 Cookie 这又是为什么呢?
这难道不应该是一个站点吗?
二、最初的跨站条件设定
最初,浏览器端认为,不同的域名下就算跨站。
请注意,这里这里的域名指的是 二级域名,例如 com 是顶级域名,bbbug.com 是二级域名。
但因为 gTLD 和 ccTLD 经常会更新,例如增加一些新的后缀,或者是一些国家级注册机构将自己的顶级域名下的二级域名也当成国家级顶级域名(比如 .ac.cn,.gov.cn 等),各种SaaS 服务商也会用自己的域名来做不同主体下的站点服务(比如 .github.io 等),各大浏览器厂商开始头疼了,很难维护。
所以,Mozilla 基金会提出了新的跨站判定条件,重新维护了一个跨站的后缀判定列表,这就是 公共后缀 的由来。
三、公共后缀列表
其中,公共后缀列表包含了几乎所有的国际顶级域名后缀,例如 com cn 等,也可以自由提交自己的域名后缀,例如 ac.cn gov.cn github.io 等。
例如我们是一个略知名的 SaaS 服务提供商,我们的客户可以自由使用 hamm.cn 来创建自己的 三级域名站点,比如 zhangsan.hamm.cn lisi.hamm.cn 等。为了我们的客户之间的跨站安全,我们可以向 Mozilla 提交自己的域名后缀,这样 Mozilla 就可以维护一个公共后缀列表,然后浏览器就可以根据这个公共后缀列表来判定是否是跨站了。
当然,Molzilla 也会审核后缀,如果后缀符合规范,会加入到公共后缀列表中。
于是,这就解释了本文标题所说的 a.github.io 和 b.github.io 都算跨站的原因了。
四、参考资料
-
Mozilla 公共后缀官网 publicsuffix.org/
-
Mozilla 公共后缀列表 publicsuffix.org/list/public…