了解“同网站”和“同源”

“同网站”和“同源”经常被提及,但经常被误解。例如,在网页转换、fetch() 请求、Cookie、打开弹出式窗口、嵌入式资源和 iframe 的上下文中会提及它们。

原点

原点

“源”是架构(也称为协议,例如 HTTPHTTPS)、主机名端口(如果已指定)的组合。例如,如果网址为 https://www.example.com:443/foo,则“origin”为 https://www.example.com:443

“same-origin”和“cross-origin”

使用相同方案、主机名和端口组合的网站会被视为“同源”网站。所有其他属性均被视为“跨源”。

出发地 A 源站 B 说明出发地 A 和 B 是“同源”还是“跨源”
https://www.example.com:443 https://www.evil.com:443 跨源:不同网域
https://example.comexample.com:443 跨源:不同的子网域
https://login.example.com:443 跨源:不同的子网域
http://www.example.com:443 跨源:不同架构
https://www.example.com:80 跨域:不同端口
https://www.example.com:443 same-origin:完全匹配
https://www.example.com same-origin:隐式端口号 (443) 匹配

网站

网站 (TLD+1)

根区域数据库中列出了顶级域名 (TLD),例如 .com.org。在上面的示例中,“site”是架构TLD 和该域名前面部分(我们称之为 TLD+1)的组合。例如,如果网址为 https://www.example.com:443/foo,则“网站”为 https://example.com

公共后缀列表和 eTLD

对于包含 .co.jp.github.io 等内容的网域,仅使用 .jp.io 并不足以识别“网站”。因此无法通过算法确定特定 TLD 的可注册域名级别。因此,我们创建了公共后缀列表中定义的公共后缀列表。这些公共后缀也称为有效 TLD (eTLD)。eTLD 列表在 publicsuffix.org/list 中维护。

如需标识包含 eTLD 的网域的“网站”部分,请采用与 .com 示例相同的做法。以 https://www.project.github.io:443/foo 为例,架构为 https,eTLD 为 .github.io,eTLD+1 为 project.github.io,因此 https://project.github.io 被视为此网址的“网站”。

网站 (eTLD+1)

“同网站”和“跨网站”

具有相同 scheme 和 eTLD+1 的网站会被视为“同一网站”。采用不同 scheme 或 eTLD+1 的网站属于“跨网站”网站。

出发地 A 源站 B 说明来源 A 和 B 是“同网站”还是“跨网站”
https://www.example.com:443 https://www.evil.com:443 跨网站:不同网域
https://login.example.com:443 同一网站:不同的子网域无关紧要
http://www.example.com:443 跨网站:不同方案
https://www.example.com:80 Same-site:不同的端口无关紧要
https://www.example.com:443 same-site:完全匹配
https://www.example.com same-site:端口无关紧要

“无协议同网站”

无协议同网站

为防止将 HTTP 用作安全系数低的通道,对“同网站”的定义不断演变,将网址架构视为网站的一部分。之前没有架构比较的“同网站”概念现在称为“无协议同网站”。例如,http://www.example.comhttps://www.example.com 被视为无协议同站点但不是同站点,因为只有 eTLD+1 部分很重要,而未考虑架构。

出发地 A 源站 B 说明源站 A 和源站 B 是否是“无协议同网站”
https://www.example.com:443 https://www.evil.com:443 跨网站:不同网域
https://login.example.com:443 无协议同网站:不同的子网域无关紧要
http://www.example.com:443 无协议同网站:不同方案无关紧要
https://www.example.com:80 无协议同站点:不同端口无关紧要
https://www.example.com:443 无协议同网站:完全匹配
https://www.example.com 无协议同网站:端口无关紧要

如何检查请求是“同网站”“同源”还是“跨网站”

所有新型浏览器(Safari 即将即将支持)发送请求以及 Sec-Fetch-Site HTTP 标头。标头具有以下某个值:

  • cross-site
  • same-site
  • same-origin
  • none

通过检查 Sec-Fetch-Site 的值,您可以确定请求是“same-site”“same-origin”还是“cross-site”。