ทำความเข้าใจ "เว็บไซต์เดียวกัน" และ "ต้นทางเดียวกัน"

มักกล่าวถึงคำว่า "เว็บไซต์เดียวกัน" และ "แหล่งเดียวกัน" แต่มักทำให้เข้าใจผิด เช่น มีการกล่าวถึงในบริบทของการเปลี่ยนหน้าเว็บ, คำขอ fetch(), คุกกี้, การเปิดป๊อปอัป, ทรัพยากรที่ฝัง และ iframe

Origin

Origin

"Origin" เป็นชุดค่าผสมของรูปแบบ (หรือที่เรียกว่าโปรโตคอล เช่น HTTP หรือ HTTPS), ชื่อโฮสต์ และพอร์ต (หากระบุ) ตัวอย่างเช่น ระบุ URL เป็น https://www.example.com:443/foo "ต้นทาง" คือ https://www.example.com:443

"ต้นทางเดียวกัน" และ "ข้ามต้นทาง"

เว็บไซต์ที่มีชุดรูปแบบ ชื่อโฮสต์ และพอร์ตเดียวกันจะถือว่ามีต้นทางเดียวกัน อื่นๆ ทั้งหมดจะถือว่าเป็นแบบ "ข้ามต้นทาง"

ต้นทาง A ต้นทาง B คำอธิบายว่าต้นทาง A และ B เป็น "ต้นทางเดียวกัน" หรือ "ข้ามต้นทาง"
https://www.example.com:443 https://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)

ไซต์

ไซต์ (TLD+1)

โดเมนระดับบนสุด (TLD) เช่น .com และ .org จะแสดงอยู่ในฐานข้อมูลโซนราก ในตัวอย่างด้านบน "site" เป็นการรวม scheme, TLD และส่วนของโดเมนที่อยู่ก่อนหน้า (เราเรียกว่า TLD+1) ตัวอย่างเช่น ใน URL คือ 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 จึงถือว่าเป็น "เว็บไซต์" สำหรับ URL นี้

เว็บไซต์ (eTLD+1)

แบบ "ไซต์เดียวกัน" และ "ข้ามเว็บไซต์"

เว็บไซต์ที่มีรูปแบบเดียวกันและ eTLD+1 เดียวกันถือเป็น "เว็บไซต์เดียวกัน" เว็บไซต์ที่มีรูปแบบแตกต่างกันหรือมี eTLD+1 ที่ต่างกันเป็นแบบ "ข้ามเว็บไซต์"

ต้นทาง A ต้นทาง B คำอธิบายว่าต้นทาง A และ B เป็น "เว็บไซต์เดียวกัน" หรือ "ข้ามเว็บไซต์"
https://www.example.com:443 https://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 เว็บไซต์เดียวกัน: พอร์ตไม่สำคัญ

"เว็บไซต์เดียวกันที่ไม่มีรูปแบบ"

เว็บไซต์เดียวกันที่ไม่มีรูปแบบ

คําจํากัดความของ "เว็บไซต์เดียวกัน" พัฒนาให้พิจารณารูปแบบ URL เป็นส่วนหนึ่งของเว็บไซต์เพื่อป้องกันไม่ให้มีการใช้ HTTP เป็นแชแนลที่ไม่รัดกุม แนวคิดเดิมของ "เว็บไซต์เดียวกัน" โดยไม่มีการเปรียบเทียบรูปแบบ ตอนนี้เรียกว่า "เว็บไซต์เดียวกันที่ไม่มีรูปแบบ" เช่น http://www.example.com และ https://www.example.com ถือเป็นเว็บไซต์เดียวกันที่ไม่มีรูปแบบ แต่ไม่ใช่เว็บไซต์เดียวกัน เพราะมีเพียงส่วน eTLD+1 เท่านั้นที่สำคัญ และไม่พิจารณารูปแบบดังกล่าว

ต้นทาง A ต้นทาง B คำอธิบายว่าต้นทาง A และ B เป็น "เว็บไซต์เดียวกันที่ไม่มีรูปแบบ" หรือไม่
https://www.example.com:443 https://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 เว็บไซต์เดียวกันไม่มีแผน: พอร์ตไม่สำคัญ

วิธีตรวจสอบว่าคําขอเป็นแบบ "เว็บไซต์เดียวกัน" "ต้นทางเดียวกัน" หรือ "ข้ามเว็บไซต์"

เบราว์เซอร์ที่ทันสมัยทั้งหมด (Safari รองรับ landing เร็วๆ นี้) จะส่งคำขอพร้อมส่วนหัว HTTP Sec-Fetch-Site ส่วนหัวมีค่าใดค่าหนึ่งต่อไปนี้

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

การตรวจสอบค่าของ Sec-Fetch-Site ช่วยให้คุณระบุได้ว่าคําขอเป็น "เว็บไซต์เดียวกัน" "ต้นทางเดียวกัน" หรือ "ข้ามเว็บไซต์"