Istilah "Same-site" dan "same-origin" sering disebut, tetapi sering disalahpahami. Misalnya, atribut ini digunakan dalam konteks transisi halaman, permintaan fetch()
, cookie, pop-up pembuka, resource tersemat, dan iframe. Halaman ini menjelaskan definisi dan perbedaannya
satu sama lain.
Origin
"Asal" adalah kombinasi dari
skema
(juga dikenal sebagai
protokol, misalnya
HTTP atau
HTTPS), nama host, dan
port
(jika ditentukan). Misalnya, dengan URL https://www.example.com:443/foo
, "origin" adalah https://www.example.com:443
.
"Same-origin" dan "cross-origin"
Situs yang memiliki kombinasi skema, nama host, dan port yang sama dianggap "origin yang sama". Lainnya dianggap "lintas asal".
Asal A | Asal B | "Same-origin" atau "cross-origin"? |
---|---|---|
https://www.example.com:443 | https://www.evil.com:443 | Lintas asal: domain berbeda |
https://example.com:443 | Lintas asal: subdomain berbeda | |
https://login.example.com:443 | Lintas asal: subdomain berbeda | |
http://www.example.com:443 | Lintas asal: skema berbeda | |
https://www.example.com:80 | Lintas asal: port berbeda | |
https://www.example.com:443 | Origin yang sama: pencocokan persis | |
https://www.example.com | Asal yang sama: kecocokan nomor port implisit (443) |
Situs
Domain level teratas (TLD) seperti .com
dan .org
tercantum dalam Database Zona Root. Pada contoh
sebelumnya, "situs" adalah kombinasi
skema,
TLD, dan bagian dari
domain tepat sebelum (Kita menyebutnya TLD+1). Misalnya, dengan URL
https://www.example.com:443/foo
, "situs" adalah https://example.com
.
Daftar Akhiran Publik dan eTLD
Untuk domain dengan elemen seperti .co.jp
atau .github.io
, hanya penggunaan .jp
atau
.io
tidak cukup spesifik untuk mengidentifikasi "situs". Tidak ada cara algoritma untuk menentukan tingkat domain yang dapat didaftarkan untuk TLD tertentu.
Untuk membantu melakukannya, Daftar Suffix Publik
menentukan daftar akhiran publik, yang juga disebut TLD yang efektif (eTLD). Daftar
eTLD dipertahankan di publicsuffix.org/list.
Untuk mengidentifikasi bagian "situs" dari domain yang menyertakan eTLD, terapkan praktik yang sama seperti contoh dengan .com
. Dengan mengambil
https://www.project.github.io:443/foo
sebagai contoh, skemanya adalah https
,
eTLD adalah .github.io
, dan eTLD+1 adalah project.github.io
, sehingga
https://project.github.io
dianggap sebagai "situs" untuk URL ini.
"situs yang sama" dan "lintas situs"
Situs yang memiliki skema dan eTLD+1 yang sama dianggap "situs yang sama". Situs yang memiliki skema berbeda atau eTLD+1 yang berbeda adalah "lintas situs".
Asal A | Asal B | "Situs yang sama" atau "lintas situs"? |
---|---|---|
https://www.example.com:443 | https://www.evil.com:443 | Lintas situs: domain berbeda |
https://login.example.com:443 | Situs yang sama: subdomain yang berbeda tidak berpengaruh | |
http://www.example.com:443 | Lintas situs: skema berbeda | |
https://www.example.com:80 | Situs yang sama: port yang berbeda tidak berpengaruh | |
https://www.example.com:443 | Situs yang sama: pencocokan persis | |
https://www.example.com | Situs yang sama: port tidak berpengaruh |
"Situs yang sama tanpa skema"
Definisi "situs yang sama" diubah untuk menyertakan skema URL sebagai bagian dari
situs untuk mencegah HTTP digunakan sebagai
saluran lemah.
Konsep lama "situs yang sama" tanpa perbandingan skema sekarang disebut "situs yang sama tanpa skema". Misalnya, http://www.example.com
dan https://www.example.com
dianggap sebagai situs yang sama tanpa skema, tetapi bukan situs yang sama, karena hanya bagian eTLD+1 yang penting dan skema tidak dipertimbangkan.
Asal A | Asal B | "Situs yang sama tanpa skema" atau "lintas situs"? |
---|---|---|
https://www.example.com:443 | https://www.evil.com:443 | Lintas situs: domain berbeda |
https://login.example.com:443 | Situs yang sama tanpa skema: subdomain yang berbeda tidak berpengaruh | |
http://www.example.com:443 | Situs yang sama tanpa skema: skema yang berbeda tidak berpengaruh | |
https://www.example.com:80 | Situs yang sama tanpa skema: port yang berbeda tidak berpengaruh | |
https://www.example.com:443 | Situs yang sama tanpa skema: pencocokan persis | |
https://www.example.com | Situs yang sama tanpa skema: port tidak berpengaruh |
Cara memeriksa apakah permintaan merupakan "situs yang sama", "origin yang sama", atau "lintas situs"
Semua browser modern mengirim permintaan dengan
header HTTP Sec-Fetch-Site
.
Header memiliki salah satu nilai berikut:
cross-site
same-site
(mengacu pada situs yang sama dengan skema)same-origin
none
Anda dapat memeriksa nilai Sec-Fetch-Site
untuk menentukan apakah permintaan tersebut memiliki situs yang sama, origin yang sama, atau lintas situs.
Anda dapat memercayai nilai header Sec-Fetch-Site
secara wajar, karena:
- Header HTTP yang dimulai dengan
Sec-
tidak dapat diubah oleh JavaScript - Browser selalu menetapkan judul ini.