עוגייה (אינטרנט) | אופן המימוש
English: HTTP cookie

אופן המימוש

האתרים השונים (השרתים שלהם) מבצעים אופרציות CRUD (יצירה, קריאה, עדכון ומחיקה) על העוגיות השונות.

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

מפרט העוגיות קובע[1][2] כי על הדפדפנים לתמוך במספר מינימלי של עוגיות או להקצות שטח זיכרון מינימלי לאגירתן. בפרט, דפדפן צריך לאפשר לאגור לפחות 300 עוגיות בגודל 4 קילובייט כל אחת, ולפחות 20 עוגיות לכל שרת או מתחם.

מספר העוגיות המקסימלי משתנה בין דפדפנים. למשל, במוזילה פיירפוקס 2.0 ואינטרנט אקספלורר 8 ניתן לשמור עד חמישים עוגיות לכל שרת ואילו באופרה 9 ניתן לשמור שלושים עוגיות לכל שרת.

בפועל, על עוגיות להיות קטנות מ-4 קילובייט. אינטרנט אקספלורר כופה גודל זה על כל העוגיות שנשמרות במתחם נתון. שמות העוגיות רגישות לרישיות (כלומר, העוגיות "WIKI" ו-"wiki" הן עוגיות שונות).

בעת יצירת עוגייה חדשה ניתן להגדיר תאריך תפוגה בו תימחק העוגייה. אם לא נקבע תאריך תפוגה, העוגייה תימחק לאחר שהמשתמש סגר את הדפדפן (כלומר, בסיום השיחה עם השרת). ציון תאריך מאפשר את קיומה של העוגייה על פני שיחות שונות גם אם הדפדפן נסגר ביניהן. עוגיות אלו נקראות בשם "עוגיות קבועות" (באנגלית: "Persistent Cookies"), להבדיל מ"עוגיות זמניות".

הגדרת עוגייה חדשה

בקשות דפי אינטרנט נעשות דרך פרוטוקול HTTP, בעזרת הדפדפן. תחילה, מבלי להתייחס לעוגיות, הדפדפן מבקש דף מהשרת על ידי שליחת טקסט קצר המכונה " http://www.w3.org/index.html, הדפדפן שולח לשרת www.w3.org בקשה:

GET /index.html HTTP/1.1
Host: www.w3.org

דפדפן
שרת

השרת משיב ושולח חבילת מידע המכונה " HTTP header". חבילת מידע זו כוללת שורות טקסט המבקשות מהדפדפן ליצור עוגיות (השורה בירוק):

HTTP/1.1 200 OK
Content-type: text/html
Set-Cookie: name=value
 
(תוכן הדף)

דפדפן
שרת

שורת ה-Set-Cookie נשלחת רק כאשר השרת מעוניין ליצור עוגייה. בשורה זו מבקש השרת מהדפדפן לשמור את המחרוזת name=value. אם הדפדפן מתיר את השימוש בעוגיות, הדפדפן ישלח עוגייה זו לשרת בכל פעם שהמשתמש יבקש לעיין בדף חדש. לדוגמה, אם הבקשה הבאה תהיה הדף http://www.w3.org/spec.html, אזי הבקשה הבאה תישלח לשרת www.w3.org:

GET /spec.html HTTP/1.1
Host: www.w3.org
Cookie: name=value
Accept: */*
 

דפדפן
שרת

גם כאן מדובר בבקשת דף אינטרנט מהשרת. ההבדלים בין בקשה זו לבקשה הקודמת נובעים מהעוגייה שנוצרה בין הבקשות. באופן זה יודע השרת שבקשה זו קשורה לבקשה הקודמת. השרת, בתגובה, ישלח את הדף המבוקש, ואולי גם בקשה ליצירת עוגיות נוספות. שרת יכול לשנות ערך של עוגייה על ידי שליחת שורה חדשה (Set-Cookie: name=newvalue) בתגובה לבקשת דף מהדפדפן. הדפדפן יחליף את הערך הישן בערך החדש. שורת ה-Set-Cookie נוצרת על ידי תוכנית CGI ואילו שרת ה-HTTP שולח את פלט התוכנית לדפדפן. ניתן להגדיר עוגיות גם באמצעות שפת JavaScript ושפות דומות אחרות הרצות באמצעות הדפדפן. ב-JavaScript משמש האובייקט document.cookie למטרה זו. לדוגמה, ההוראה:

document.cookie = "temperature=20"

יוצרת עוגיה חדשה עם השם "temperature" והערך "20".

מאפייני העוגייה

מלבד השם והערך יכולה העוגייה לכלול גם תאריך תפוגה, נתיב, שם מתחם ומידע לגבי חיבורים מקודדים. על פי RFC 2965[3] יש לכלול גם את מספר הגרסה. שדות אלו מופיעים לאחר השם והערך, והם מופרדים בנקודה ופסיק. לדוגמה, ניתן ליצור עוגייה באמצעות השורה הבאה:

Set-Cookie: name=value; expires=date; path=/; domain=.example.org

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

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

תאריך התפוגה מורה לדפדפן למחוק את העוגייה כאשר תוקף העוגייה פג. אם לא הוגדר תאריך תפוגה, העוגייה תימחק כאשר המשתמש יסגור את הדפדפן. תאריך התפוגה מוגדר בפורמט הבא: Wdy, DD-Mon-YYYY HH:MM:SS GMT. לדוגמה, להלן עוגייה שהוגדרה על ידי שרת HTTP:

Set-Cookie: RMID=732423sdfs721242; expires=Fri, 31-Dec-2010 23:59:59 GMT; path=/; domain=.example.net

שם העוגייה הוא RMID וערכה 732423sdfs721242. השרת יכול להשתמש במחרוזת שרירותית בערך העוגייה. השרת יכול לשמור מספר פרמטרים במחרוזת יחידה, כמו למשל a=12&b=abcd&c=32 במקום 732423sdfs721242. הנתיב ושם המתחם, / ו-.example.net בהתאמה, מבקשים מהדפדפן לשלוח עוגייה זו כאשר מבקשים דף שנמצא תחת שם המתחם שצוין.

תפוגה

העוגייה לא תישלח לשרת על ידי הדפדפן במצבים הבאים:

  1. בסוף השיחה עם השרת (כלומר, כאשר המשתמש סוגר את הדפדפן), אם לא נקבע תאריך תפוגה ("עוגיות זמניות").
  2. כאשר חלף תאריך התפוגה שהוגדר מראש.
  3. כאשר מוזן (על ידי השרת או הסקריפט) תאריך תפוגה חדש שזמנו חלף.
  4. כאשר הדפדפן מחק את העוגייה לפי בקשת המשתמש.

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