Tìm hiểu "same-site" và "same-origin"

"same-site" và "same-origin" thường xuyên được trích dẫn nhưng thường gây hiểu nhầm. Ví dụ: chúng được đề cập 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.

Điểm gốc

Đ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ủ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.

"same-origin" và "cross-origin"

Những trang web có sự kết hợp cùng 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 Giải thích về việc Nguồn gốc A và B là "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 tên 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: cá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 same-origin: khớp chính xác
https://www.example.com same-origin: trùng khớp với số cổng ngầm (443)

Trang web

Trang web (TLD+1)

Các miền cấp cao nhất (TLD) như .com.org được liệt kê trong Cơ sở dữ liệu vùng gốc. Trong ví dụ trên, "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 các miền có chứa những nội dung như .co.jp hoặc .github.io, việc chỉ sử dụng .jp hoặc .io là chưa đủ chi tiết để 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ể bằng thuật toán. Đó là lý do tạo ra một danh sách hậu tố công khai được xác định trong Danh sách hậu tố công khai. Những hậu tố công khai này còn được gọi là TLD hiệu quả (eTLD). Danh sách eTLD được duy trì 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.

Trang web (eTLD+1)

"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 Giải thích về việc Nguồn gốc A và B là "cùng một 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 same-site: các miền con khác nhau không quan trọng
http://www.example.com:443 nhiều trang web: các lược đồ khác nhau
https://www.example.com:80 same-site: nhiều cổng không quan trọng
https://www.example.com:443 same-site: khớp chính xác
https://www.example.com same-site: cổng không quan trọng

"cùng trang web không có lược đồ"

cùng trang web không có lược đồ

Định nghĩa "same-site" được phát triển để coi lược đồ URL là 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.comhttps://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 đồ không được tính đến.

Nguồn gốc A Nguồn gốc B Giải thích về việc Nguồn gốc A và B có phải là "cùng một trang web không có lược đồ" hay không
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 không có lược đồ: các miền con khác nhau không quan trọng
http://www.example.com:443 cùng trang web không có lược đồ: các lược đồ khác nhau không quan trọng
https://www.example.com:80 cùng trang không lược đồ: các cổng khác nhau không quan trọng
https://www.example.com:443 cùng trang web không có lược đồ: đối sánh chính xác
https://www.example.com lược đồ cùng trang web: các 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 (Safari hỗ trợ chuẩn bị hạ cánh) đều gửi yêu cầu cùng với tiêu đề HTTP Sec-Fetch-Site. Tiêu đề có một trong những giá trị sau:

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

Bằng cách kiểm tra giá trị của Sec-Fetch-Site, bạn có thể xác định xem yêu cầu là "same-site", "same-origin" hay "cross-site".