במאמר הזה מוסבר איך להגדיר קובצי cookie מהדומיין הנוכחי כדי להבטיח אבטחה ותאימות לדפדפנים שונים, ולצמצם את הסיכוי לשיבושים לאחר ההוצאה משימוש של קובצי 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.
מתכון לקובץ Cookie מהדומיין הנוכחי של אתרים עם תת-דומיינים
אם יש לכם אתר עם תת-דומיינים ואתם רוצים להפעיל סשן אחד בכל אחד מהם, הקידומת 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 מהדומיין הנוכחי בבקשות שנשלחות מאתרי צד שלישי
קובצי cookie מסוג SameSite=Lax
לא נשלחים בבקשות משנה חוצות-אתרים (לדוגמה, כשטוענים תמונות מוטמעות או מסגרות iframe באתר של צד שלישי), אבל הם נשלחים כשמשתמש מנווט לאתר המקור (למשל, כשלוחצים על קישור מאתר אחר).
ניתן להגביל עוד יותר את הגישה לקובצי cookie ולא לאפשר שליחה שלהם יחד עם בקשות שנשלחו מאתרים של צד שלישי באמצעות SameSite=Strict
. האפשרות הזו שימושית כשיש לכם קובצי cookie הקשורים לפונקציונליות שתמיד יוצעו במהלך ניווט ראשוני, כמו שינוי סיסמה או ביצוע רכישה.
המתכון
Set-Cookie:
__Host-cookie-name=cookie-value;
Secure;
Path=/;
HttpOnly;
Max-Age=7776000;
SameSite=Strict;