הסבר על קובצי cookie מסוג SameSite

Browser Support

  • Chrome: 51.
  • Edge: 16.
  • Firefox: 60.
  • Safari: 13.

כל קובץ Cookie מכיל צמד מפתח/ערך, וגם מספר מאפיינים שקובעים מתי ואיפה נעשה שימוש בקובץ ה-Cookie הזה.

ההשקה של המאפיין SameSite (מוגדר ב-RFC6265bis) מאפשרת לכם להצהיר אם קובץ ה-Cookie מוגבל להקשר של צד ראשון או של אותו אתר. חשוב להבין בדיוק מה המשמעות של 'אתר' בהקשר הזה. האתר הוא השילוב של סיומת הדומיין והחלק של הדומיין שמופיע ממש לפני הסיומת. לדוגמה, הדומיין www.web.dev הוא חלק מהאתר web.dev.

מונח חשוב: אם המשתמש נמצא באתר www.web.dev ומבקש תמונה מ-static.web.dev, זו בקשה מאותו אתר.

רשימת הסיומות הציבוריות מגדירה אילו דפים נחשבים כדפים באותו אתר. היא לא תלויה רק בדומיינים ברמה העליונה כמו .com, אלא יכולה לכלול גם שירותים כמו github.io. כך המערכת יכולה לספור את your-project.github.io ואת my-project.github.io כאתרים נפרדים.

מונח חשוב: אם המשתמש נמצא ב-your-project.github.io ומבקש תמונה מ-my-project.github.io, זו בקשה חוצת אתרים.

שימוש במאפיין SameSite כדי להצהיר על השימוש בקובצי Cookie

מאפיין SameSite בקובץ Cookie מספק שלוש דרכים שונות לשליטה בהתנהגות הזו. אפשר לבחור לא לציין את המאפיין, או להשתמש בערכים Strict או Lax כדי להגביל את קובץ ה-Cookie לבקשות מאותו אתר.

אם מגדירים את SameSite ל-Strict, אפשר לשלוח את קובץ ה-Cookie רק בהקשר של צד ראשון, כלומר אם האתר שקובץ ה-Cookie שייך לו זהה לאתר שמוצג בסרגל הכתובות של הדפדפן. לכן, אם קובץ ה-Cookie‏ promo_shown מוגדר כך:

Set-Cookie: promo_shown=1; SameSite=Strict

כשהמשתמש נמצא באתר שלכם, קובץ ה-Cookie נשלח עם הבקשה כצפוי. עם זאת, אם המשתמש מגיע לאתר שלכם מקישור באתר אחר, קובץ ה-Cookie לא נשלח בבקשה הראשונית הזו. האפשרות הזו מתאימה לקובצי Cookie שקשורים לתכונות שתמיד מופעלות אחרי ניווט ראשוני, כמו שינוי סיסמה או ביצוע רכישה, אבל היא מגבילה מדי לקובץ Cookie כמו promo_shown. אם הקורא לוחץ על הקישור כדי להיכנס לאתר, הוא רוצה שקובץ ה-Cookie יישלח כדי שההעדפה שלו תוחל.

SameSite=Lax מאפשר לדפדפן לשלוח את קובץ ה-Cookie עם הניווטים האלה ברמה העליונה. לדוגמה, אם אתר אחר מפנה לתוכן באתר שלכם, במקרה הזה באמצעות שימוש בתמונה של החתול שלכם וקישור למאמר שלכם באופן הבא:

<p>Look at this amazing cat!</p>
<img src="https://blog.example/blog/img/amazing-cat.png" />
<p>Read the <a href="https://blog.example/blog/cat.html">article</a>.</p>

עם קובץ Cookie שהערך שלו מוגדר ל-Lax באופן הבא:

Set-Cookie: promo_shown=1; SameSite=Lax

כשהדפדפן מבקש את amazing-cat.png עבור הבלוג של האדם השני, האתר שלכם לא שולח את קובץ ה-Cookie. עם זאת, כשהקורא לוחץ על הקישור אל cat.html באתר שלכם, הבקשה הזו כוללת את קובץ ה-Cookie.

מומלץ להשתמש ב-SameSite באופן הזה, להגדיר את קובצי ה-Cookie שמשפיעים על התצוגה של האתר כ-Lax, ואת קובצי ה-Cookie שקשורים לפעולות של המשתמש כ-Strict.

אפשר גם להגדיר את SameSite לערך None כדי לציין שרוצים שקובץ ה-cookie יישלח בכל ההקשרים. אם אתם מספקים שירות שאתרים אחרים משתמשים בו, כמו ווידג'טים, תוכן מוטמע, תוכניות שותפים, פרסום או כניסה לחשבון בכמה אתרים, כדאי להשתמש ב-None כדי לוודא שהכוונה שלכם ברורה.

שלושה קובצי Cookie עם התוויות None, ‏ Lax או Strict, בהתאם להקשר
סימון מפורש של ההקשר של קובץ Cookie כ-None,‏ Lax או Strict.

שינויים בהתנהגות ברירת המחדל ללא SameSite

Browser Support

  • Chrome: 80.
  • Edge: 86.
  • Firefox: behind a flag.
  • Safari: not supported.

מאפיין SameSite נתמך באופן נרחב, אבל לא נעשה בו שימוש נרחב. בעבר, הגדרת קובצי Cookie בלי SameSite הייתה גורמת לשליחתם כברירת מחדל בכל ההקשרים, מה שהיה חושף את המשתמשים ל-CSRF ולדליפת מידע לא מכוונת. כדי לעודד מפתחים לציין את הכוונות שלהם ולספק למשתמשים חוויה בטוחה יותר, בהצעה של IETF‏, Incrementally Better Cookies, מפורטים שני שינויים מרכזיים:

  • קובצי Cookie ללא מאפיין SameSite מטופלים כאילו מוגדר להם SameSite=Lax.
  • קובצי Cookie עם SameSite=None צריכים לציין גם Secure, כלומר הם דורשים הקשר מאובטח.

שני השינויים האלה תואמים לאחור לדפדפנים שיישמו בצורה נכונה את הגרסה הקודמת של מאפיין SameSite, וגם לדפדפנים שלא תומכים בגרסאות קודמות של SameSite. המטרה שלהם היא לצמצם את ההסתמכות של מפתחים על התנהגות ברירת המחדל של הדפדפנים, על ידי הגדרה מפורשת של התנהגות קובצי ה-Cookie והשימוש המיועד בהם. כל לקוח שלא מזהה את SameSite=None צריך להתעלם ממנו.

SameSite=Lax כברירת מחדל

אם שולחים קובץ Cookie בלי לציין את מאפיין SameSite שלו, הדפדפן מתייחס לקובץ ה-Cookie הזה כאילו הוא הוגדר לערך SameSite=Lax. אנחנו עדיין ממליצים להגדיר את SameSite=Lax באופן מפורש כדי לשפר את חוויית המשתמש בדפדפנים שונים.

הערך SameSite=None חייב להיות מאובטח

כשיוצרים קובצי Cookie חוצי-אתרים באמצעות SameSite=None, צריך גם להגדיר אותם ל-Secure כדי שהדפדפן יקבל אותם:

Set-Cookie: widget_session=abc123; SameSite=None; Secure

אפשר לבדוק את ההתנהגות הזו החל מ-Chrome 76 על ידי הפעלת about://flags/#cookies-without-same-site-must-be-secure, ומ-Firefox 69 על ידי הגדרת network.cookie.sameSite.noneRequiresSecure ב-about:config.

מומלץ גם לעדכן קובצי Cookie קיימים ל-Secure בהקדם האפשרי. אם אתם מסתמכים על שירותים שמספקים תוכן של צד שלישי באתר שלכם, חשוב לוודא שספק השירותים מעדכן את קובצי ה-Cookie שלו, ולעדכן את כל קטעי הקוד או התלות באתר שלכם כדי לוודא שהאתר משתמש בהתנהגות החדשה.

פרטים נוספים על עדכון קובצי ה-Cookie כדי לטפל בהצלחה בשינויים האלה ב-SameSite=None ובהבדלים בהתנהגות הדפדפן זמינים במאמר ההמשך SameSite cookie recipes.

תודה רבה על התרומה והמשוב של לילי צ'ן, מלטה אובל, מייק ווסט, רוב דודסון, טום שטיינר וויבק סקהאר.

תמונה ראשית (Hero) של קובצי Cookie מאת Pille-Riin Priske באתר Unsplash