עודכן לפני חודש
כתובת URL יכולה להצביע על משאב, אבל היא לא יכולה לבקש JSON במקום XML. היא לא יכולה להוכיח שאתה מחובר. היא לא יכולה לזכור שהיית כאן אתמול. היא אפילו לא יכולה לומר איזה אתר אתה רוצה כשאתרים מרובים חולקים כתובת IP.
כותרות בקשה פותרות את זה. הן הופכות מצביע פשוט לשיחה מתוחכמת בין לקוח לשרת.
איך כותרות נותנות לבקשות קול
כשאתה מבקש את https://api.example.com/users/123, כתובת ה-URL מציינת מה אתה רוצה. אבל היא לא אומרת שום דבר על:
- האם אתה רוצה JSON או XML
- האם אתה מאומת
- באיזו שפה אתה מעדיף
- האם יש לך גרסה שמורה במטמון
- באיזה דפדפן אתה משתמש
כותרות ממלאות את הפערים האלה. הן ההבדל בין להצביע על משהו לבין לתקשר לגביו בפועל.
הכותרות שכל בקשה צריכה
Host: על איזה דלת אתה דופק?
כותרת זו היא חובה ב-HTTP/1.1, והנה הסיבה: כתובת IP אחת יכולה לאחסן מאות אתרים. כשהבקשה שלך מגיעה לאותה כתובת IP, השרת צריך לדעת איזה אתר אתה רוצה. כותרת ה-Host היא התשובה שלך.
גם אם שם המארח מופיע בכתובת ה-URL שלך, הוא נשלח שוב ככותרת מפני שהודעת ה-HTTP הגולמית זקוקה לו במפורש.
User-Agent: מי שואל?
זה מזהה את הדפדפן או היישום שלך. שרתים משתמשים בזה לניתוח נתונים, החלטות תאימות, זיהוי בוטים ואופטימיזציה למכשירים ניידים.
מחרוזת ה-User-Agent הפכה למוזיאון של היסטוריית הדפדפנים. דפדפנים מודרניים עדיין טוענים שהם "Mozilla" מפני שב-1996, Netscape (Mozilla) קיבל תוכן עשיר יותר, וכל דפדפן מאז נאלץ לשמור על השקר כדי להימנע מקבלת דפים מופחתים. אנחנו עדיין חיים עם ההונאה הזאת.
פיתוח אינטרנט מודרני בדרך כלל נמנע מהסתמכות על User-Agent לטובת זיהוי יכולות, אבל הכותרת נמצאת בכל מקום.
Accept: מה אתה יכול לקבל?
כותרת זו מאפשרת משא ומתן על תוכן — כתובת URL אחת שמחזירה פורמטים שונים בהתאם להעדפה שלך. ערכי ה-q מציינים את ההעדפה: HTML מועדף ביותר (q=1.0 מרומז), XML פחות (q=0.9), כל דבר אחר הכי פחות (q=0.8).
נקודת קצה של API עשויה להחזיר JSON ליישום JavaScript שלך ו-XML למערכת ישנה — אותה כתובת URL, שיחה שונה.
Accept-Language: באיזו שפה אתה מדבר?
זה אומר לשרת: "אני מעדיף אנגלית אמריקאית, אבל כל אנגלית מתאימה, וספרדית מקובלת." אתרים משתמשים בזה כדי להציג תוכן בשפתך אוטומטית מבלי לשאול.
Accept-Encoding: כמה דחוס אתה יכול לקבל?
דפדפנים מודרניים תומכים באלגוריתמי דחיסה מרובים. על ידי הצהרה על מה שאתה יכול לפרוק, אתה מאפשר לשרת להקטין תגובות באופן משמעותי — קובץ HTML של 100KB עשוי להתדחס ל-20KB עם gzip.
להוכיח מי אתה
Authorization: האישורים שלך
כותרת זו נושאת הוכחת זהות. סכמות נפוצות:
- Basic: שם משתמש וסיסמה ב-Base64 (בטוח רק עם HTTPS)
- Bearer: אסימונים מ-OAuth 2.0 או JWT
- Digest: גיבוב קריפטוגרפי של אישורים
- API Key: סכמות מותאמות אישית לגישה תכנותית
אישורים לא תקינים מחזירים תגובת 401 Unauthorized.
Cookie: הזיכרון שלך
HTTP הוא חסר מצב — כל בקשה עצמאית, ללא זיכרון של בקשות קודמות. עוגיות פותרות את זה. כשהשרת מגדיר עוגייה, הדפדפן שלך שומר אותה וכולל אותה אוטומטית בבקשות עתידיות לאותו תחום.
כך אתרים זוכרים שאתה מחובר, זוכרים את ההעדפות שלך, ועוקבים אחר ההתנהגות שלך בין דפים.
מטמון: אל תשלח מה שכבר יש לי
If-Modified-Since
זה אומר: "יש לי גרסה מתאריך זה. שלח חדשה רק אם השתנתה."
אם לא השתנה, השרת מחזיר 304 Not Modified ללא גוף. הדפדפן שלך משתמש בעותק השמור במטמון. רוחב הפס נחסך.
If-None-Match
ETag (תגיות ישות) הן מדויקות יותר מחותמות זמן. השרת מקצה לכל גרסה מזהה ייחודי. אם ה-ETag השמור שלך תואם את הנוכחי, התוכן לא השתנה — 304, השתמש במטמון שלך.
אבטחה: מאיפה הגעת?
Origin
כותרת זו מרכזית לאבטחת CORS (שיתוף משאבים בין מקורות). כש-JavaScript בתחום אחד מנסה לאחזר נתונים מתחום אחר, הדפדפן כולל את כותרת ה-Origin. השרת בודק אותה ומחליט האם לאפשר גישה.
חשוב לציין: JavaScript לא יכול לזייף כותרת זו. הדפדפן מגדיר אותה אוטומטית עבור בקשות בין-מקורות, ומונע מאתרים זדוניים להתחזות לאתרים אמינים.
Referer
שים לב לשגיאת האיות — היא עברה תקנון כך מאז שגיאת הקלדה במפרט ה-HTTP המקורי.
כותרת זו מספרת לשרת איזה דף קישר לבקשה הנוכחית. שימושית לניתוח נתונים (מאיפה מגיע התנועה?), אבטחה (האם הבקשה מקורה בדף צפוי?) והקשר ניווט.
חששות פרטיות הובילו לכותרת Referrer-Policy, שקובעת כמה מהמידע הזה משותף.
ניהול חיבורים
Connection ו-Keep-Alive
פתיחת חיבור TCP יקרה — מסעות הלוך ושוב מרובים רק כדי לבסס את הערוץ. HTTP/1.1 כברירת מחדל שומר חיבורים פתוחים כך שבקשות מרובות יוכלו לזרום דרך חיבור יחיד.
Connection: close מודיע לשרת שסיימת, והוא יכול לסגור את החיבור לאחר התגובה.
בקשות חלקיות: תן לי רק חלק ממנו
Range
זה מבקש רק חלק ממשאב. חיוני עבור:
- הורדות שניתן לחדש: המשך מהנקודה שבה ההורדה נקטעה
- סטרימינג וידאו: בקשת קטעים קטנים בהדרגה
- טיפול בקבצים גדולים: קריאת הכותרת בלבד של קובץ ענק
השרת מגיב עם 206 Partial Content והבייטים המבוקשים.
כשיש מתווכים
X-Forwarded-For
כשהבקשה שלך עוברת דרך פרוקסי או מאזני עומסים, השרת רואה את כתובת ה-IP של הפרוקסי, לא שלך. כותרת זו שומרת את השרשרת — ה-IP השמאלי ביותר הוא הלקוח המקורי. קריטי לרישום אבטחה, הגבלת קצב וגיאולוקציה.
X-Forwarded-Proto
מאזני עומסים לעיתים קרובות מטפלים ב-HTTPS מבחוץ ומעבירים בקשות לשרתי הגב על גבי HTTP רגיל. כותרת זו מודיעה לשרת הגב שהחיבור המקורי היה מאובטח, כך שהוא מייצר כתובות HTTPS ואוכף מדיניות אבטחה כראוי.
כותרות מותאמות אישית: הרחבת השיחה
יישומים מוסיפים כותרות מותאמות אישית עבור:
- מעקב בקשות: מזהים ייחודיים שעוקבים אחר בקשה במערכות מבוזרות
- גרסאות API: בקשת גרסאות API ספציפיות
- דגלי תכונות: הפעלת תכונות ניסיוניות
- מטא-נתוני לקוח: מידע ספציפי ליישום
הקידומת "X-" הוצאה משימוש עבור כותרות חדשות, אבל מערכות ישנות מלאות בהן.
שאלות נפוצות על כותרות בקשה
האם אני יכול לראות אילו כותרות הדפדפן שלי שולח?
כן. פתח את כלי המפתחים של הדפדפן שלך (F12), עבור לכרטיסיית Network, לחץ על כל בקשה, והסתכל בחלק Headers. תראה הן כותרות בקשה והן כותרות תגובה עבור כל פעולת HTTP.
האם JavaScript יכול לשנות כל כותרת בקשה?
לא. דפדפנים מגנים על כותרות מסוימות מטעמי אבטחה. JavaScript לא יכול לשנות Host, Origin, Referer, Cookie (ישירות), או User-Agent דרך fetch או XMLHttpRequest. הגבלות אלה מונעות מסקריפטים זדוניים להתחזות לאתרים או משתמשים אחרים.
למה כמה כותרות מתחילות ב-X-?
היסטורית, "X-" ציין כותרות ניסיוניות או לא-סטנדרטיות. המוסכמה הוצאה משימוש כעת — כותרות מותאמות אישית חדשות צריכות פשוט להשתמש בשמות תיאוריים ללא הקידומת. אבל כותרות קיימות רבות (X-Forwarded-For, X-Request-ID) עדיין משתמשות בה.
מה קורה אם אני שולח כותרת שהשרת לא מזהה?
שום דבר רע. שרתים מתעלמים מכותרות שהם לא מבינים. זה עיצוב מכוון — הוא מאפשר אימוץ הדרגתי של כותרות חדשות מבלי לשבור תאימות. שרתים שלא מצפים ל-X-My-Special-Header שלך פשוט יתעלמו ממנה.
האם דף זה היה מועיל?