Actualizat acum 1 lună
כל החלפת HTTP מתחילה במשא ומתן שאינך רואה לעולם.
לפני שהדפדפן שלך מקבל בייט אחד של HTML, לפני שה-API מחזיר JSON כלשהו — יש שיחה. הלקוח שלך אומר: "שלום, אני Chrome על macOS. אני מעדיף JSON אבל אקבל גם HTML. אני מבין gzip. ואגב, יש לי עותק שמור במטמון מיום שלישי — יש לך משהו חדש יותר?" השרת עונה: "הנה JSON, 4,847 בייטים, דחוס עם gzip. שמור אותו במטמון לשעה. ואגב, אתה חייב להשתמש ב-HTTPS מעכשיו."
השיחה הזאת מתרחשת בכותרות. הן השיחה הקצרה לפני ישיבת העסקים — המטא-נתונים שמאפשרים לשני הצדדים להסכים על תנאים לפני שתוכן כלשהו עובר ידיים.
צורת הכותרת
כותרות הן זוגות מפתח-ערך פשוטים:
כל כותרת עונה על שאלה ספציפית. 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 בדומיין אחד לא יכול לקרוא תגובות מדומיין אחר — מודל אבטחה יסודי של הדפדפן.
הזרימה
- הדפדפן שלך בונה בקשה ומוסיף כותרות על מי הוא ומה הוא רוצה
- הכותרות מועברות כטקסט רגיל, לפני גוף הבקשה
- השרת קורא את הכותרות כדי להבין את הבקשה
- השרת בונה תגובה ומוסיף כותרות על מה שהוא שולח ואיך לטפל בזה
- הדפדפן שלך קורא את כותרות התגובה כדי לדעת כיצד לעבד את מה שיגיע
בין הלקוח לשרת, מתווכים — פרוקסי, 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 אינן מועברות במכוון. הכותרות שהשרת שלך מקבל עשויות שלא להיות הכותרות שהלקוח שלח.
לראות את השיחה
כל דפדפן מאפשר לך לצפות בשיחה הזאת בזמן אמת:
- פתח את כלי הפיתוח (F12 או לחיצה ימנית ← בדוק)
- עבור לכרטיסיית Network
- עשה משהו שמפעיל בקשה
- לחץ על כל בקשה כדי לראות את הכותרות שלה
תראה את שני צדי המשא ומתן — מה הדפדפן שלך ביקש ומה השרת שלח בחזרה. כשאימות נכשל, כשמטמון מגיש תוכן ישן, כש-CORS חוסם קריאת API — התשובה נמצאת בדרך כלל בכותרות.
שאלות נפוצות על כותרות HTTP
למה אני צריך להבין כותרות אם ה-framework שלי מטפל בהן?
ה-framework מפשט את המקרים הנפוצים, אבל ניפוי שגיאות דורש לראות מה שקורה בפועל. כשה-API שלך מחזיר 403, כשמטמון מגיש תוכן ישן, כש-CORS חוסם את הבקשה שלך — הכותרות אומרות לך למה. ה-framework לא יכול לנפות שגיאות בעצמו.
מה ההבדל בין כותרות לפרמטרים של שאילתה?
פרמטרים של שאילתה הם חלק מה-URL (?page=2&sort=name). הם גלויים, ניתנים לסימניה, ובדרך כלל מתארים איזה משאב אתה רוצה. כותרות הן מטא-נתונים על הבקשה עצמה — אימות, העדפות תוכן, הנחיות מטמון. מטרות שונות, מנגנונים שונים.
האם אפשר להגדיר כל כותרת שרוצים מ-JavaScript?
לא. דפדפנים מגבילים כותרות מסוימות (כמו Host, Content-Length ו-Cookie) מכיוון שאפשרות שליטה ללא הגבלה בהן תשבור את מנגנוני האבטחה. ה"כותרות האסורות" האלה יכולות להיות מוגדרות רק על ידי הדפדפן עצמו.
למה חלק מהכותרות מתחילות ב-X-?
היסטורית, X- סימן "ניסיוני" או "הרחבה" — כותרת מותאמת אישית שאינה חלק מאף תקן. הנוהג ירד מהפרק מכיוון שיותר מדי כותרות "ניסיוניות" הפכו קבועות, והקידומת לא הוסיפה דבר. כותרות מותאמות אישית חדשות צריכות פשוט להשתמש בשמות תיאוריים.
A fost utilă această pagină?