1. Bibliotek
  2. HTTP והרשת
  3. כותרות HTTP

Uppdaterad för 1 månad sedan

כל החלפת HTTP מתחילה במשא ומתן שאינך רואה לעולם.

לפני שהדפדפן שלך מקבל בייט אחד של HTML, לפני שה-API מחזיר JSON כלשהו — יש שיחה. הלקוח שלך אומר: "שלום, אני Chrome על macOS. אני מעדיף JSON אבל אקבל גם HTML. אני מבין gzip. ואגב, יש לי עותק שמור במטמון מיום שלישי — יש לך משהו חדש יותר?" השרת עונה: "הנה JSON, 4,847 בייטים, דחוס עם gzip. שמור אותו במטמון לשעה. ואגב, אתה חייב להשתמש ב-HTTPS מעכשיו."

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

צורת הכותרת

כותרות הן זוגות מפתח-ערך פשוטים:

Content-Type: application/json
Cache-Control: max-age=3600
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...

כל כותרת עונה על שאלה ספציפית. Content-Type עונה על "מה זה?" Cache-Control עונה על "כמה זמן אני יכול לשמור אותו?" Authorization עונה על "מי אתה?"

שמות הכותרות אינם תלויי-רישיות (אם כי נהוג לכתוב אותם ב-Title-Case). הערכים עשויים להיות תלויי-רישיות, תלוי בכותרת. זה בערך כל מה שצריך לדעת על התחביר.

שני כיוונים, שאלות שונות

כותרות בקשה הן שאלות מהלקוח לשרת:

  • "אילו פורמטים יש לך?" (Accept)
  • "מי אני?" (Authorization)
  • "מאיפה הגעתי?" (Origin, Referer)
  • "יש לך משהו חדש יותר ממה שיש לי במטמון?" (If-Modified-Since)
  • "מה אני מריץ?" (User-Agent)

כותרות תגובה הן תשובות מהשרת ללקוח:

  • "הנה מה שאני שולח" (Content-Type, Content-Length)
  • "הנה כמה זמן לשמור אותו במטמון" (Cache-Control, Expires)
  • "הנה דרישות האבטחה שלי" (Strict-Transport-Security)
  • "שמור את זה לשימוש מאוחר יותר" (Set-Cookie)

השיחה זורמת בשני הכיוונים, אבל השאלות שונות.

מה כותרות עושות בפועל

תיאור תוכן. Content-Type אומר לך מה יש בקופסה. Content-Length אומר לך כמה גדול. Content-Encoding אומר לך איך הוא דחוס. בלי אלה, הדפדפן שלך היה צריך לנחש — וניחוש מוביל לפגיעויות אבטחה ולדפים שבורים.

מטמון. Cache-Control היא אולי הכותרת בעלת ההשפעה הגדולה ביותר על ביצועים. הוראה אחת — max-age=31536000 — יכולה לבטל מיליוני הורדות מיותרות. ETag ו-Last-Modified מאפשרים ללקוחות לשאול "השתנה משהו?" במקום להוריד מחדש הכול.

אימות. כותרת ה-Authorization נושאת את האישורים. השרת מגיב עם WWW-Authenticate כדי לומר "אני צריך אישורים, והנה כיצד לעצב אותם." הריקוד הזה מתרחש כמעט בכל קריאת API שאתה מבצע.

אבטחה. Strict-Transport-Security אומר "השתמש תמיד ב-HTTPS". Content-Security-Policy אומר "טען סקריפטים רק ממקורות אלה". X-Frame-Options אומר "אל תאפשר לאתרים אחרים להטמיע אותי". הכותרות האלה הן מדיניות האבטחה שלך, שנאכפת על ידי הדפדפן.

גישה בין-מקורית. כותרות CORS — Access-Control-Allow-Origin וחברותיהן — עונות על השאלה: "האם לאתר הזה מותר לקרוא את התגובה שלי?" בלעדיהן, JavaScript בדומיין אחד לא יכול לקרוא תגובות מדומיין אחר — מודל אבטחה יסודי של הדפדפן.

הזרימה

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

בין הלקוח לשרת, מתווכים — פרוקסי, CDN, מאזני עומסים — עשויים להוסיף, להסיר או לשנות כותרות. חלק מהכותרות (כמו Connection) הן מסוג "hop-by-hop", כלומר הן חלות רק על קישור אחד בשרשרת ולא על כל המסלול.

סטנדרטי ומותאם אישית

רוב הכותרות מתוקננות על ידי ה-IETF. Content-Type, Authorization, Cache-Control — לאלה יש משמעויות מוגדרות שכל דפדפן ושרת מסכים עליהן.

ניתן ליצור כותרות מותאמות אישית לצרכים ספציפיים של היישום. הנוהג הישן היה להוסיף קידומת "X-" (X-Request-ID, X-Forwarded-For), אבל זה כבר ירד מהפרק. בנוהג המודרני: פשוט משתמשים בשם תיאורי.

מה אנשים טועים

כותרות אינן מוצפנות מעל HTTP. כותרת ה-Authorization שלך נוסעת כטקסט רגיל אלא אם אתה משתמש ב-HTTPS. זו הסיבה שחשוב להשתמש ב-HTTPS — לא רק בשביל גוף הבקשה, אלא גם בשביל הכותרות.

לכותרות יש מגבלות גודל. שרתים בדרך כלל דוחים בקשות עם כותרות גדולות מכ-8KB. אם אתה דוחס יותר מדי לתוך הכותרות — אתה עושה את זה לא נכון.

לא כל הכותרות שורדות את המסלול. מתווכים מסירים כמה כותרות. כותרות hop-by-hop כמו Connection אינן מועברות במכוון. הכותרות שהשרת שלך מקבל עשויות שלא להיות הכותרות שהלקוח שלח.

לראות את השיחה

כל דפדפן מאפשר לך לצפות בשיחה הזאת בזמן אמת:

  1. פתח את כלי הפיתוח (F12 או לחיצה ימנית ← בדוק)
  2. עבור לכרטיסיית Network
  3. עשה משהו שמפעיל בקשה
  4. לחץ על כל בקשה כדי לראות את הכותרות שלה

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

שאלות נפוצות על כותרות HTTP

למה אני צריך להבין כותרות אם ה-framework שלי מטפל בהן?

ה-framework מפשט את המקרים הנפוצים, אבל ניפוי שגיאות דורש לראות מה שקורה בפועל. כשה-API שלך מחזיר 403, כשמטמון מגיש תוכן ישן, כש-CORS חוסם את הבקשה שלך — הכותרות אומרות לך למה. ה-framework לא יכול לנפות שגיאות בעצמו.

מה ההבדל בין כותרות לפרמטרים של שאילתה?

פרמטרים של שאילתה הם חלק מה-URL (?page=2&sort=name). הם גלויים, ניתנים לסימניה, ובדרך כלל מתארים איזה משאב אתה רוצה. כותרות הן מטא-נתונים על הבקשה עצמה — אימות, העדפות תוכן, הנחיות מטמון. מטרות שונות, מנגנונים שונים.

האם אפשר להגדיר כל כותרת שרוצים מ-JavaScript?

לא. דפדפנים מגבילים כותרות מסוימות (כמו Host, Content-Length ו-Cookie) מכיוון שאפשרות שליטה ללא הגבלה בהן תשבור את מנגנוני האבטחה. ה"כותרות האסורות" האלה יכולות להיות מוגדרות רק על ידי הדפדפן עצמו.

למה חלק מהכותרות מתחילות ב-X-?

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

Var den här sidan till hjälp?

😔
🤨
😃