Что такое HTTP-заголовки и какие их основные типы существуют?

Ответ

HTTP-заголовки (HTTP Headers) — это строки в формате ключ: значение, которые передают метаданные о HTTP-запросе или ответе. Они следуют за стартовой строкой и отделяются от тела сообщения пустой строкой.

Заголовки позволяют клиенту и серверу обмениваться служебной информацией, управляя такими аспектами, как:

  • Аутентификация и авторизация
  • Кэширование
  • Управление сессиями (cookies)
  • Формат и кодировка передаваемых данных (Content Negotiation)

Пример HTTP-запроса:

GET /api/users/123 HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Accept: application/json
Authorization: Bearer <token>

Пример HTTP-ответа:

HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Content-Length: 78
Cache-Control: no-cache
Set-Cookie: session_id=abcde12345; HttpOnly

Основные группы заголовков по назначению:

  • Идентификация и маршрутизация:

    • Host: Обязательный заголовок в HTTP/1.1, указывает доменное имя сервера.
    • User-Agent: Идентифицирует клиентское приложение (например, браузер).
    • Server: Идентифицирует программное обеспечение веб-сервера.
  • Переговоры о содержимом (Content Negotiation):

    • Accept: Сообщает серверу, какие типы контента (MIME-типы) может принять клиент.
    • Accept-Language: Указывает предпочитаемый язык.
    • Content-Type: Указывает MIME-тип ресурса в теле сообщения.
    • Content-Length: Размер тела сообщения в байтах.
  • Аутентификация и сессии:

    • Authorization: Содержит учетные данные для аутентификации клиента на сервере.
    • Cookie: Отправляет на сервер cookie, ранее установленные заголовком Set-Cookie.
    • Set-Cookie: Отправляет cookie от сервера клиенту для сохранения.
  • Кэширование:

    • Cache-Control: Содержит директивы для управления кэшированием как для запросов, так и для ответов.
    • ETag: Идентификатор конкретной версии ресурса, используется для условных запросов.

Ответ 18+ 🔞

Давай я тебе про эти ваши HTTP-заголовки расскажу, а то смотришь на них как баран на новые ворота, блядь. Это ж не просто так, это, сука, целая переписка между браузером и сервером, как два мудака на базаре торгуются, только по протоколу.

Представь, ты (клиент) такой приходишь в ларек (сервер) и говоришь: «Дайте мне вот эту штуку». А чтобы тебя правильно поняли и не послали нахуй, нужно добавить деталей. Вот эти детали — заголовки. Строки вида ключ: значение, которые идут после первой строчки и до пустого места, где уже само тело сообщения, если оно есть.

Зачем они, эти ваши заголовки, нахуй? А чтобы, блядь:

  • Предъявить пропуск или сказать, кто ты (Authorization, куки всякие).
  • Объяснить, какую именно хрень ты хочешь получить — в JSON, на русском, сжатый архив или ещё как (Accept, Accept-Language).
  • Сказать серверу: «Эй, мудила, не присылай мне то, что у меня уже лежит три дня в кэше, если оно не поменялось» (Cache-Control, ETag).
  • Вообще управлять всей этой ебалой.

Вот смотри, как это выглядит в жизни. Ты (клиент) шлёшь запрос:

GET /api/users/123 HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Accept: application/json
Authorization: Bearer <token>

Перевод на человеческий: «Слушай, сервак, дай-ка мне пользователя под номером 123. Сижу я на example.com, браузер у меня модный, Mozilla. Отдавай данные в JSON, не хочу твой HTML, нахуй. И вот мой пропускной жетон, не гони».

А сервер тебе в ответ:

HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Content-Length: 78
Cache-Control: no-cache
Set-Cookie: session_id=abcde12345; HttpOnly

Перевод: «Ну получи, ебанашка, твоего пользователя (статус 200 — всё ок). Данные в JSON, кодировка utf-8, размер 78 байт. Не кэшируй это говно, а то завтра обновится. И на, жри печеньку (session_id), в следующий раз принеси её с собой, чтобы я тебя узнал».


А теперь, блядь, по группам, чтобы в голове не ебозилось:

  • «Кто ты и куда прешь?» (Идентификация и маршрутизация):

    • Host: ОБЯЗАТЕЛЬНЫЙ, ёпта. Говоришь, на каком именно сайте из кучи виртуальных хостов тебя искать. Без него — 404, иди нахуй.
    • User-Agent: Твоя визитка. «Я — Firefox с Windows 10» или «Я — curl, пидарас скриптовый».
    • Server: А это уже сервер хвастается: «Я — nginx/1.18.0, я крутой».
  • «Какую именно хрень тебе прислать?» (Переговоры о содержимом):

    • Accept: «Я понимаю JSON и XML, HTML тоже сойдёт, но картинки в PNG — нахуй».
    • Accept-Language: «По-русски можно? А то английский у меня так себе».
    • Content-Type: Это сервер тебе говорит: «Держи, мудила, данные, и вот тебе инструкция, как их читать (MIME-тип)».
    • Content-Length: Просто число — сколько байт в теле посылки. Чтобы ты знал, когда переставать читать.
  • «А ты кто такой, ваще?» (Аутентификация и сессии):

    • Authorization: Вот, блядь, твой пропуск. Можешь логин-парль в Base64 засунуть, а можешь этот ваш модный Bearer <token>.
    • Cookie: Ты приносишь серверу его же печеньку, которую он тебе дал в прошлый раз. «Смотри, я это тот самый Герасим».
    • Set-Cookie: А это сервер тебе новую печеньку выдает. «Запомни этот session_id, в следующий раз предъяви».
  • «Можно я возьму то, что у меня уже есть?» (Кэширование):

    • Cache-Control: Главный начальник кэша. «Храни это пять минут», «вообще не храни», «перепроверь у сервера, не обновилось ли».
    • ETag: Хуёвая метка версии файла. Как отпечаток пальца. Ты можешь сказать серверу: «У меня уже есть ресурс с отпечатком abc123», и если ничего не менялось, он ответит «304 Not Modified — сиди, мудак, на том, что есть, не грузи меня».

Вот и вся, блядь, магия. Не так страшен чёрт, как его малюют. Главное — понять, что это просто бумажка-инструкция, которая прилагается к основной посылке, чтобы все друг друга поняли и не накосячили.