常常引用「同網站」和「相同來源」,但經常會誤解條款。舉例來說,這些參數會用於頁面轉換、fetch()
要求、Cookie、開啟彈出式視窗、內嵌資源和 iframe 的情境。本頁將說明這些樣式及其不同之處。
來源
「Origin」結合了配置 (也稱為通訊協定,例如 HTTP 或 HTTPS)、主機名稱,以及通訊埠 (如有指定)。例如,假設網址是 https://www.example.com:443/foo
,則「origin」是 https://www.example.com:443
。
「Same-origin」和「cross-origin」
使用相同配置、主機名稱和通訊埠組合的網站會被視為「相同來源」。其他所有項目都會視為「跨來源」。
來源 A | 來源 B | 「同源」或「跨來源」? |
---|---|---|
https://www.example.com:443 | https://www.evil.com:443 | 跨來源:不同網域 |
https://example.com:443 | 跨來源:不同子網域 | |
https://登入.example.com:443 | 跨來源:不同子網域 | |
http://www.example.com:443 | 跨來源:不同配置 | |
https://www.example.com:80 | 跨來源:不同通訊埠 | |
https://www.example.com:443 | 相同來源:完全比對 | |
https://www.example.com | 同源:隱含通訊埠號碼 (443) 比對 |
網站
.com
和 .org
等頂層網域 (TLD) 會列在根區域資料庫中。在上述
範例中,「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
視為這個網址的「site」。
「相同網站」和「跨網站」
系統會將採用相同架構和 eTLD+1 的網站視為「相同網站」。而配置不同或 eTLD+1 的網站屬於「跨網站」。
來源 A | 來源 B | 「同網站」或「跨網站」? |
---|---|---|
https://www.example.com:443 | https://www.evil.com:443 | 跨網站:不同網域 |
https://登入.example.com:443 | 相同網站:不同的子網域沒有影響 | |
http://www.example.com:443 | 跨網站:不同配置 | |
https://www.example.com:80 | 相同網站:不同的通訊埠沒有影響 | |
https://www.example.com:443 | 相同網站:完全比對 | |
https://www.example.com | 同網站:通訊埠沒有影響 |
「不配置相同網站」
「相同網站」的定義已變更為網站的一部分納入網址配置,以免使用 HTTP 做為弱管道。沒有配置比較的「相同網站」這個舊概念現已改稱「無配置的相同網站」。舉例來說,系統會將 http://www.example.com
和 https://www.example.com
視為無配置的相同網站,但並非同網站,因為只有 eTLD+1 部分很重要,系統不會考量通訊協定。
來源 A | 來源 B | 「無配置的相同網站」或「跨網站」? |
---|---|---|
https://www.example.com:443 | https://www.evil.com:443 | 跨網站:不同網域 |
https://登入.example.com:443 | 配置一致網站:不同子網域沒有影響 | |
http://www.example.com:443 | 配置一致網站:不同配置沒有影響 | |
https://www.example.com:80 | 配置一致網站:不同通訊埠沒有影響 | |
https://www.example.com:443 | 不同形式的相同網站:完全比對 | |
https://www.example.com | 不設定相同網站:通訊埠不重要 |
如何確認要求是「相同網站」、「相同來源」還是「跨網站」
所有新式瀏覽器都會傳送含有 Sec-Fetch-Site
HTTP 標頭的要求。標頭具有下列其中一個值:
cross-site
same-site
(參照配置相同的相同網站)same-origin
none
您可以檢查 Sec-Fetch-Site
的值,判斷要求屬於相同網站、相同來源還是跨網站要求。
您可以合理信任 Sec-Fetch-Site
標頭的值,原因如下:
- JavaScript 無法修改開頭為
Sec-
的 HTTP 標頭 - 瀏覽器一律會設定這些標題。