הבנה של "same-site" ו-"same-origin"

המונחים "same-site" ו-"same-origin" מצוטטים לעיתים קרובות, אבל הם לא מובנים כראוי. לדוגמה, הם מוזכרים בהקשר של מעברים בין דפים, בקשות fetch(), קובצי cookie, חלונות קופצים נפתחים, משאבים מוטמעים ומסגרות iframe.

מקור

מקור

"Origin" הוא שילוב של סכמה (נקרא גם פרוטוקול, לדוגמה HTTP או HTTPS), שם מארח ויציאה (אם צוין). לדוגמה, בהינתן כתובת ה-URL https://www.example.com:443/foo, הערך "origin" הוא https://www.example.com:443.

'same-origin' ו-'cross-origin'

אתרים שיש בהם שילוב של אותה סכימה, שם מארח ויציאה נחשבים ל-'same-origin'. כל השאר נחשב כ-'cross-origin'.

מקור א' מקור ב' הסבר האם מקורות A ו-B הם "same-origin" או "cross-origin"
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 same-origin: התאמה מדויקת
https://www.example.com same-origin: התאמות של מספר יציאה משתמע (443)

אתר

אתר (TLD+1)

דומיינים ברמה עליונה (TLD), כמו .com ו-.org, רשומים במסד הנתונים של Root Zone. בדוגמה שלמעלה, "site" הוא השילוב של הסכימה, ה-TLD והחלק של הדומיין שלפניו (אנחנו קוראים לו TLD+1). לדוגמה, אם נותנים את כתובת ה-URL https://www.example.com:443/foo , הערך בשדה 'אתר' הוא https://example.com.

רשימת סיומות ציבוריות ו-eTLD

בדומיינים שכוללים דברים כמו .co.jp או .github.io, השימוש רק ב-.jp או ב-.io לא מפורט מספיק כדי לזהות את ה "אתר". אין דרך לקבוע באופן אלגוריתמי את רמת הדומיינים שניתן לרשום לדומיין ספציפי ברמה העליונה. לכן נוצרה רשימה של סיומות ציבוריות שמוגדרות ברשימת הסיומות הציבוריות. הסיומות הציבוריות האלה נקראים גם דומיינים ברמה עליונה בפועל (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)

'same-site' ו-'cross-site'

אתרים עם אותה סכימה ואותו eTLD+1 נחשבים "אותו אתר". אתרים עם סכימה שונה או eTLD+1 אחר נחשבים "אתרים שונים".

מקור א' מקור ב' הסבר האם מקורות א' וב' הם 'באותו אתר' או 'מאתרים שונים'
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 same-site: יציאות שונות לא משנה
https://www.example.com:443 same-site: התאמה מדויקת
https://www.example.com same-site: יציאות לא חשובות

'schemeless same-site'

אותו אתר ללא סכימה

ההגדרה של 'אותו אתר' התפתחה להתייחס לסכימת כתובת ה-URL כחלק מהאתר, כדי למנוע שימוש ב-HTTP כערוץ חלש. המושג הישן של "אותו אתר" ללא השוואת סכימה נקרא עכשיו "באותו אתר ללא סכמה". לדוגמה, http://www.example.com ו-https://www.example.com נחשבים לאותו אתר ללא סכימה, אבל לא לאותו אתר, כי רק החלק eTLD+1 חשוב והסכימה לא נלקחת בחשבון.

מקור א' מקור ב' הסבר אם מקורות 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 באותו אתר ללא סכימה: ליציאות אין חשיבות

איך בודקים אם הבקשה היא מסוג 'same-site', 'same-origin' או 'cross-site'

כל הדפדפנים המודרניים (Safari תומכים בקרוב) שולחים בקשות עם Sec-Fetch-Site כותרת HTTP. לכותרת יש אחד מהערכים הבאים:

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

על ידי בחינת הערך של Sec-Fetch-Site, אפשר לקבוע אם הבקשה היא "same-site", "same-origin" או "cross-site".