Các cụm từ "cùng trang web" và "cùng nguồn gốc" thường được trích dẫn nhưng cũng thường gây hiểu nhầm. Ví dụ: chúng được sử dụng trong ngữ cảnh chuyển đổi trang, yêu cầu fetch()
, cookie, cửa sổ bật lên mở, tài nguyên được nhúng và iframe. Trang này giải thích khái niệm và sự khác biệt giữa hai chỉ số này.
Điểm gốc
"Nguồn gốc" là sự kết hợp của một lược đồ (còn gọi là giao thức, ví dụ: HTTP hoặc HTTPS), tên máy chủ và cổng (nếu được chỉ định). Ví dụ: với URL là https://www.example.com:443/foo
, "gốc" sẽ là https://www.example.com:443
.
"Cùng-origin" và "cross-origin"
Những trang web có cùng kiểu kết hợp lược đồ, tên máy chủ và cổng được coi là "cùng nguồn gốc". Mọi thứ khác được xem là "nhiều nguồn gốc".
Nguồn gốc A | Nguồn gốc B | "Cùng nguồn gốc" hay "nhiều nguồn gốc"? |
---|---|---|
https://www.example.com:443 | https://www.evil.com:443 | Nhiều nguồn gốc: các miền khác nhau |
https://example.com:443 | Nhiều nguồn gốc: các miền con khác nhau | |
https://login.example.com:443 | Nhiều nguồn gốc: các miền con khác nhau | |
http://www.example.com:443 | Nhiều nguồn gốc: lược đồ khác nhau | |
https://www.example.com:80 | Nhiều nguồn gốc: các cổng khác nhau | |
https://www.example.com:443 | Cùng gốc: khớp chính xác | |
https://www.example.com | Cùng gốc: số cổng ngầm (443) trùng khớp |
Trang web
Các miền cấp cao nhất (TLD) như .com
và .org
được liệt kê trong Cơ sở dữ liệu vùng gốc. Trong ví dụ
trước, "trang web" là sự kết hợp của lược đồ, TLD và một phần của miền ngay trước đó (Chúng tôi gọi là TLD+1). Ví dụ: với URL là https://www.example.com:443/foo
, "trang web" sẽ là https://example.com
.
Danh sách hậu tố công khai và eTLD
Đối với những miền có các phần tử như .co.jp
hoặc .github.io
, việc chỉ sử dụng .jp
hoặc .io
là chưa đủ cụ thể để xác định "trang web". Không có cách nào để xác định cấp độ miền có thể đăng ký cho một TLD cụ thể theo thuật toán.
Để giúp bạn làm việc này, Danh sách hậu tố công khai xác định một danh sách hậu tố công khai, còn gọi là TLD hiệu lực (eTLD). Danh sách eTLD hiện có tại publicsuffix.org/list.
Để xác định phần "trang web" của một miền có chứa eTLD, hãy áp dụng phương pháp tương tự như ví dụ với .com
. Lấy https://www.project.github.io:443/foo
làm ví dụ, giao thức là https
, eTLD là .github.io
và eTLD+1 là project.github.io
, vì vậy, https://project.github.io
được coi là "trang web" cho URL này.
"same-site" và "cross-site"
Các trang web có cùng lược đồ và cùng eTLD+1 được coi là "cùng trang web". Các trang web có một lược đồ khác hoặc một eTLD+1 khác là "nhiều trang web".
Nguồn gốc A | Nguồn gốc B | "Cùng trang web" hay "nhiều trang web"? |
---|---|---|
https://www.example.com:443 | https://www.evil.com:443 | Nhiều trang web: các tên miền khác nhau |
https://login.example.com:443 | Cùng trang web: các miền con khác nhau không quan trọng | |
http://www.example.com:443 | Trên nhiều trang web: các lược đồ khác nhau | |
https://www.example.com:80 | Cùng trang web: các cổng khác nhau không quan trọng | |
https://www.example.com:443 | Cùng trang web: khớp chính xác | |
https://www.example.com | Cùng trang web: cổng không quan trọng |
"Cùng trang web không lập trình"
Thay đổi định nghĩa về "same-site" để bao gồm lược đồ URL như một phần của trang web nhằm ngăn việc sử dụng HTTP như một kênh yếu.
Khái niệm cũ "cùng trang web" mà không có so sánh lược đồ hiện được gọi là "cùng trang web không có lược đồ". Ví dụ: http://www.example.com
và https://www.example.com
được coi là cùng một trang web không có lược đồ nhưng không phải là cùng một trang web, vì chỉ có phần eTLD+1 là quan trọng và lược đồ sẽ không được xem xét.
Nguồn gốc A | Nguồn gốc B | "Cùng trang web không lập trình" hay "nhiều trang web"? |
---|---|---|
https://www.example.com:443 | https://www.evil.com:443 | Nhiều trang web: các tên miền khác nhau |
https://login.example.com:443 | Cùng một trang web không lập trình: các miền con khác nhau không quan trọng | |
http://www.example.com:443 | Cùng một trang web không lập kế hoạch: các lược đồ khác nhau không quan trọng | |
https://www.example.com:80 | Cùng một trang web không lập trình: khác nhau cổng không quan trọng | |
https://www.example.com:443 | Cùng trang web không theo chương trình: khớp chính xác | |
https://www.example.com | Cùng trang web không lập trình: cổng không quan trọng |
Cách kiểm tra xem một yêu cầu là "same-site", "same-origin" hay "cross-site"
Tất cả các trình duyệt hiện đại đều gửi yêu cầu bằng một tiêu đề HTTP Sec-Fetch-Site
.
Tiêu đề có một trong những giá trị sau:
cross-site
same-site
(đề cập đến cùng trang web có giao thức)same-origin
none
Bạn có thể kiểm tra giá trị của Sec-Fetch-Site
để xác định xem yêu cầu là cùng trang web, cùng nguồn gốc hay trên nhiều trang web.
Bạn có thể tin tưởng một cách hợp lý vào giá trị của tiêu đề Sec-Fetch-Site
, vì:
- JavaScript không thể sửa đổi tiêu đề HTTP bắt đầu bằng
Sec-
- Trình duyệt luôn đặt các tiêu đề này.