מתכונים לעוגיות צד ראשון

במאמר הזה מוסבר איך להגדיר קובצי cookie מהדומיין הנוכחי כדי להבטיח אבטחה ותאימות לדפדפנים שונים, ולצמצם את הסיכוי לשיבושים לאחר ההוצאה משימוש של קובצי cookie של צד שלישי.

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

קובצי cookie מדומיינים שאינם של האתר הנוכחי נקראים בדרך כלל קובצי cookie של צד שלישי.

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

כברירת מחדל, ניתן לשתף קובצי cookie בין אתרים, לגשת אליהם באמצעות JavaScript ולשלוח אותם באמצעות חיבורי HTTP, והדבר כולל סיכונים מסוימים של פרטיות ואבטחה. אנחנו פועלים כל הזמן לשיפור התנהגות ברירת המחדל, אבל באמצעות ארגז החול לפרטיות והצעות אחרות כמו קובצי Cookie שמקורו במקור, יש הרבה דברים שאפשר לעשות היום על ידי הגדרת מאפיינים נוספים לקובצי ה-cookie.

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

המתכון

Set-Cookie:
__Host-cookie-name=cookie-value;
Secure;
Path=/;
HttpOnly;
Max-Age=7776000;
SameSite=Lax;
פרטים

Host היא קידומת אופציונלית שהופכת מאפיינים מסוימים לחובה ולא כוללת מאפיינים אחרים:

  • יש לציין Secure
  • חובה להשמיט את Domain
  • Path חייב להיות /

אחרי שמוסיפים את Host, אפשר להסתמך על הדפדפן כדי לבדוק אם המאפיינים האלה מוגדרים בהתאם לכללי __Host ולדחות את קובץ ה-cookie אם הוא לא מוגדר.

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

המאפיין Domain מציין אילו מארחים יכולים לקבל קובץ cookie. אם לא כוללים את קובץ ה-cookie, הוא יוגבל למארח המסמך הנוכחי, לא כולל תת-דומיינים: קובץ ה-cookie של example.com יישלח בכל בקשה אל example.com, אבל לא בבקשות ל-images.example.com. אם יש לכם אפליקציות שונות שפועלות בתת-דומיינים שונים, כך תפחיתו את הסיכון שדומיין אחד שנפגע יאפשר כניסה לאחרים.

Path מציין את הנתיב שחייב להימצא בכתובת ה-URL המבוקשת כדי שהדפדפן ישלח את הכותרת Cookie. המשמעות של הגדרה של Path=/ היא שקובץ ה-cookie נשלח לכל נתיבי כתובות ה-URL בדומיין הזה. השילוב של ללא Domain ו-Path=/ גורם לקובץ ה-cookie להיות משויך למקור קרוב ככל האפשר, כך שהוא מתנהג באופן דומה לאחסון אחר בצד הלקוח כמו LocalStorage – אין בלבול שה-example.com/a עשוי לקבל ערכים שונים ל-example.com/b.

המאפיין HttpOnly מוסיף הגנה מפני סקריפטים זדוניים של צד שלישי באתרים שלך על ידי הגבלת הגישה ל-JavaScript. היא מאפשרת שליחה של קובץ cookie רק בכותרות של בקשות, וכתוצאה מכך היא לא תהיה זמינה ל-JavaScript באמצעות document.cookie.

Max-Age מגביל את משך החיים של קובץ cookie, כי סשנים בדפדפן יכולים להימשך זמן רב יחסית, ואינך רוצה שקובצי cookie לא פעילים יישמרו לתמיד. היא מתאימה לקובצי cookie לטווח קצר, כמו סשנים של משתמשים, או לקובצי cookie קצרים יותר כמו אסימונים לשליחת טפסים. Max-Age מוגדר בשניות ובדוגמה הקודמת הוא מוגדר ל-7776,000 שניות, כלומר 90 יום. זוהי ברירת מחדל סבירה, שאפשר לשנות אותה בהתאם לתרחיש השימוש שלכם.

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

אפשר לקרוא מידע נוסף על המאפיינים השונים של קובצי cookie במסמכי התיעוד בנושא Set-Cookie ב-MDN.

אם יש לכם אתר עם תת-דומיינים ואתם רוצים להפעיל סשן אחד בכל אחד מהם, הקידומת Host יכולה להיות מגבילה מדי. לדוגמה, יכול להיות של-news.site יש תת-דומיינים של נושאים, כמו finance.news.site ו-sport.news.site, וצריך להגדיר סשן אחד של משתמש בכולם. במקרה כזה, צריך להשתמש בקידומת __Secure במקום ב-__Host ולציין Domain.

המתכון

Set-Cookie:
__Secure-cookie-name=cookie-value;
Secure;
Domain=news.site;
Path=/;
HttpOnly;
Max-Age=7776000;
SameSite=Lax;
פרטים

Secure היא קידומת אופציונלית שמציינת פחות דרישות מ-Host: היא דורשת רק להגדיר את קובץ ה-cookie עם המאפיין Secure.

קובצי cookie מסוג SameSite=Lax לא נשלחים בבקשות משנה חוצות-אתרים (לדוגמה, כשטוענים תמונות מוטמעות או מסגרות iframe באתר של צד שלישי), אבל הם נשלחים כשמשתמש מנווט לאתר המקור (למשל, כשלוחצים על קישור מאתר אחר).

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

המתכון

Set-Cookie:
__Host-cookie-name=cookie-value;
Secure;
Path=/;
HttpOnly;
Max-Age=7776000;
SameSite=Strict;