"Same-site" ו-"same-origin"

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

מקור

מקור
המבנה של מקור.

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

'מאותו מקור' ו'ממקורות שונים'

אתרים שיש להם את אותו שילוב של סכימה, שם מארח ויציאה נחשבים כ'מאותו מקור'. כל שאר הבקשות נחשבות כבקשות 'ממקורות שונים'.

מקור A מקור ב' 'מאותו מקור' או 'ממקורות שונים'?
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)
החלקים בכתובת ה-URL שמרכיבים אתר.

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

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

בדומיינים עם רכיבים כמו .co.jp או .github.io, השימוש רק ב-.jp או ב-.io לא ספציפי מספיק כדי לזהות את 'האתר'. אי אפשר לקבוע באופן אלגוריתמי את רמת הדומיינים שאפשר לרשום בדומיין ברמה עליונה מסוים. כדי לעזור בכך, רשימת הסיומות הציבוריות מגדירה רשימה של סיומת ציבוריות, שנקראות גם סיומת ברמה העליונה בפועל (eTLD). הרשימה של TLDs ברמה העליונה נמצאת בכתובת publicsuffix.org/list.

כדי לזהות את החלק 'site' בדומיין שכולל TLD של דומיין ברמה העליונה, צריך להשתמש באותה שיטה כמו בדוגמה עם .com. לדוגמה, בכתובת https://www.project.github.io:443/foo, ההסכמה היא https, ה-eTLD הוא .github.io וה-eTLD+1 הוא project.github.io, כך ש-https://project.github.io נחשבת ל'אתר' של כתובת ה-URL הזו.

אתר (eTLD+1)
החלקים בכתובת URL עם TLD של דומיין ברמה העליונה.

'באותו אתר' ו'באתרים שונים'

אתרים שיש להם את אותה סכמה ואת אותו eTLD+1 נחשבים כ'באותו אתר'. אתרים שיש להם סכמה שונה או eTLD+1 שונה נחשבים כ'בין אתרים'.

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

איך בודקים אם בקשה היא 'באותו אתר', 'באותו מקור' או 'באתרים שונים'

Browser Support

  • Chrome: 76.
  • Edge: 79.
  • Firefox: 90.
  • Safari: 16.4.

Source

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

  • cross-site
  • same-site (מתייחס לאתרים באותה סכימה)
  • same-origin
  • none

אפשר לבדוק את הערך של Sec-Fetch-Site כדי לקבוע אם הבקשה היא באותו אתר, באותו מקור או בין אתרים.

אפשר לסמוך על הערך של הכותרת Sec-Fetch-Site, כי: