Skip to content
学习 衡量 博客 Case studies 关于
本页内容
  • 来源
    • “同源”和“跨源” {:#same-origin-and-cross-origin }
  • 站点
    • “同站”和“跨站”{:#same-site-cross-site }
    • “有方案同站”
  • 如何检查请求是“同站”、“同源”还是“跨站”

理解“同站”和“同源”

Apr 15, 2020 — 更新日期 Jun 10, 2020
Available in: Español, 日本語, 한국어, Português, Русский, English
Appears in: 安全且可靠
Eiji Kitamura
Eiji Kitamura
TwitterGitHubHomepage
本页内容
  • 来源
    • “同源”和“跨源” {:#same-origin-and-cross-origin }
  • 站点
    • “同站”和“跨站”{:#same-site-cross-site }
    • “有方案同站”
  • 如何检查请求是“同站”、“同源”还是“跨站”

“同站”和“同源”是两个常用但也常被误解的术语。例如,在页面转换、fetch() 请求、Cookie、打开弹出窗口、嵌入资源和 iframe 的上下文中都会使用这两个术语。

来源 #

Origin

“来源 (Origin)”就是方案(也称为协议,例如 HTTP 或 HTTPS)、主机名和端口(如果指定)的组合。例如,假设 URL 是 https://www.example.com:443/foo ,则“来源”为 https://www.example.com:443。

“同源”和“跨源” {:#same-origin-and-cross-origin } #

方案、主机名和端口均相同的组合的网站视为“同源”,否则视为“跨源”。

源 A源 B源 A 和源 B是否“同源”/“跨源”的解释
https://www.example.com:443https://www.evil.com:443跨源:域不同
https://example.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同源:隐式端口号 (443) 匹配

站点 #

Site

顶级域 (TLD),例如 .com 和 .org 列在根区数据库中。在上面的示例中,“站点”是 TLD 与它之前的域部分的组合。例如,假设 URL 是 https://www.example.com:443/foo ,则“站点”为 example.com。

但是,对于 .co.jp 或 .github.io 等域,仅使用 .jp 或 .io 的 TLD 不足以识别“站点”。同时,无法通过算法确定特定 TLD 的可注册域的级别。这就是创建“有效 TLD”(eTLD) 列表的原因。这些域在公共后缀列表中进行定义。eTLD 列表的维护网站是 publicsuffix.org/list。

完整站点名称为 eTLD+1。例如,假设 URL 为 https://my-project.github.io,则 eTLD 为 .github.io,而 eTLD+1 则为 my-project.github.io,这就是一个“站点”。换句话说,eTLD+1 是有效的 TLD 加上它前面的域部分。

eTLD+1

“同站”和“跨站”{:#same-site-cross-site } #

eTLD+1 相同的网站被视为“同站”。eTLD+1 不同的网站则被视为“跨站”。

源 A源 B源 A 和源 B 是否“同站”/“跨站”的解释
https://www.example.com:443https://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同站:端口无关紧要

“有方案同站” #

schemeful same-site

“同站”的定义正在演变为将 URL 方案视为站点的一部分,从而防止将 HTTP 用作弱通道。由于浏览器转变为这种解释,因此,当引述旧定义时,您可能会看到“无方案同站”之类的引用,而“有方案同站”则是更严格的定义。在这种情况下,http://www.example.com 和 https://www.example.com 被视为跨站,因为方案不匹配。

源 A源 B源 A 和源 B 是否是“有方案同站”的解释
https://www.example.com:443https://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有方案同站:端口无关紧要

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

Chrome 将请求与 Sec-Fetch-Site HTTP 标头一起发送。截至 2020 年 4 月,没有其他浏览器支持 Sec-Fetch-Site。这是更大的获取元数据请求标头 (Fetch Metadata Request Headers) 提案的一部分。该标头的值为以下之一:

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

通过检查 Sec-Fetch-Site 的值,您可以确定请求是“同站”、“同源”还是“跨站”(“有方案同站”不是在 Sec-Fetch-Site 中获取)。

安全
Last updated: Jun 10, 2020 — Improve article
Return to all articles
分享
订阅

Contribute

  • 提交错误
  • 查看源代码

相关内容

  • developer.chrome.com
  • Chrome 动态
  • 网站开发基础
  • 案例研究
  • 播客
  • 节目

连接

  • Twitter
  • YouTube
  • Google Developers
  • Chrome
  • Firebase
  • Google Cloud Platform
  • 所有产品
  • 条款和隐私权
  • 社区准则

Except as otherwise noted, the content of this page is licensed under the Creative Commons Attribution 4.0 License, and code samples are licensed under the Apache 2.0 License. For details, see the Google Developers Site Policies.