Открыть сервис

HTTP-заголовки

HTTP-заголовки — это строки в текстовом формате, которые передаются в составе HTTP-запроса или HTTP-ответа между клиентом (обычно веб-браузером) и сервером. Они содержат метаданные о передаваемом сообщении, такие как тип содержимого, кодировка, информация об аутентификации, настройки кэширования и управление соединением. Заголовки являются неотъемлемой частью протокола HTTP, определённого в стандартах RFC 7230—7235 (ранее RFC 2616), и позволяют клиенту и серверу обмениваться дополнительной информацией, необходимой для корректной обработки запроса и формирования ответа.

Формат и структура

Каждый HTTP-заголовок представляет собой пару «имя: значение», разделённую двоеточием и пробелом. Имя заголовка регистронезависимо, но по соглашению обычно пишется с заглавной буквы каждого слова (например, Content-Type, User-Agent). Значение может содержать текст, числа, даты или сложные структуры, разделённые точкой с запятой.

Заголовки передаются до тела сообщения и отделяются от него пустой строкой. В одном запросе или ответе может присутствовать множество заголовков, каждый на отдельной строке. Стандарт HTTP/1.1 требует, чтобы каждый заголовок занимал одну строку, но в HTTP/2 заголовки сжимаются и передаются в бинарном формате.

Классификация заголовков

HTTP-заголовки делятся на несколько категорий в зависимости от контекста использования и назначения.

По контексту передачи

  • Заголовки запроса — передаются от клиента к серверу. Они описывают запрашиваемый ресурс, предпочтения клиента, его возможности и данные для аутентификации. Примеры: Host, User-Agent, Accept, Authorization.
  • Заголовки ответа — передаются от сервера к клиенту. Они содержат информацию о статусе обработки запроса, метаданные о возвращаемом ресурсе и инструкции для клиента. Примеры: Content-Type, Set-Cookie, Cache-Control, Location.
  • Заголовки сущности — относятся к телу сообщения (если оно есть). Они описывают его размер, тип, кодировку и способ сжатия. Примеры: Content-Length, Content-Encoding, Content-Language.

По стандартизации

  • Стандартные заголовки — определены в спецификациях HTTP (RFC) и имеют фиксированное имя и формат. Они широко поддерживаются всеми браузерами и серверами. Примеры: Content-Type, Cache-Control, Date.
  • Нестандартные (пользовательские) заголовки — начинаются с префикса X- (например, X-Requested-With, X-Forwarded-For). Хотя практика использования X- префикса была распространена, современные рекомендации (RFC 6648) не рекомендуют его, так как он может конфликтовать с будущими стандартами. Пользовательские заголовки используются для передачи специфической информации, не предусмотренной стандартом.
  • Заголовки расширений — могут быть введены производителями программного обеспечения для своих нужд, например, X-Powered-By (указывает технологию, на которой работает сервер) или X-Frame-Options (защита от кликджекинга).

Основные группы заголовков

Заголовки общего назначения

Эти заголовки могут присутствовать как в запросе, так и в ответе. Они управляют поведением соединения, кэшированием и датами.

  • Date — дата и время формирования сообщения.
  • Cache-Control — директивы кэширования (например, no-cache, max-age, public, private).
  • Connection — управление сетевым соединением (например, keep-alive, close).
  • Transfer-Encoding — способ кодирования тела сообщения при передаче (например, chunked).
  • Via — информация о промежуточных прокси-серверах.

Заголовки запроса

Эти заголовки отправляются клиентом и описывают его возможности и намерения.

  • Host — обязательный заголовок, указывающий доменное имя и порт сервера, к которому обращается клиент. Без него сервер не может определить, какой виртуальный хост обслуживать.
  • User-Agent — строка, идентифицирующая клиентское приложение (браузер, поисковый робот, мобильное приложение). Содержит информацию о названии, версии и операционной системе.
  • Accept — указывает, какие MIME-типы контента клиент готов принять (например, text/html, application/json, image/png). Сервер использует это для выбора формата ответа.
  • Accept-Encodingсписок методов сжатия, которые поддерживает клиент (например, gzip, deflate, br).
  • Accept-Language — предпочитаемые языки для ответа (например, ru-RU, en-US).
  • Authorization — данные для аутентификации (например, токен Bearer или базовые учётные данные в формате Basic).
  • Cookie — передаёт ранее сохранённые cookie от сервера.
  • Referer — URL страницы, с которой был сделан текущий запрос (используется для анализа переходов, но может быть скрыт по соображениям безопасности).
  • Origin — указывает источник запроса (схема, хост, порт). Используется в CORS (Cross-Origin Resource Sharing) для контроля доступа между разными доменами.

Заголовки ответа

Эти заголовки отправляются сервером и содержат информацию о результате обработки запроса и свойствах возвращаемого ресурса.

  • Content-TypeMIME-тип содержимого тела ответа (например, text/html; charset=utf-8, application/json).
  • Content-Length — размер тела ответа в байтах.
  • Content-Encoding — метод сжатия, применённый к телу ответа (например, gzip).
  • Set-Cookie — устанавливает cookie на стороне клиента.
  • Location — используется для перенаправления (код ответа 3xx). Указывает новый URL, на который клиент должен перейти.
  • WWW-Authenticate — запрашивает аутентификацию у клиента (код ответа 401).
  • Server — информация о программном обеспечении сервера (например, nginx, Apache).
  • Access-Control-Allow-Origin — указывает, какие источники имеют право получать доступ к ресурсу (CORS).
  • Retry-After — указывает время, через которое клиент может повторить запрос (используется с кодами 429 Too Many Requests или 503 Service Unavailable).

Заголовки безопасности

Специальные заголовки, предназначенные для защиты веб-приложений от атак.

  • Strict-Transport-Security (HSTS) — предписывает браузеру всегда использовать HTTPS для данного домена.
  • Content-Security-Policy (CSP) — ограничивает источники, из которых браузер может загружать ресурсы (скрипты, стили, изображения), предотвращая XSS-атаки.
  • X-Content-Type-Options — запрещает браузеру автоматически определять MIME-тип (снижает риск MIME-сниффинга).
  • X-Frame-Options — запрещает отображение страницы во фрейме (защита от кликджекинга).
  • X-XSS-Protection — включает или отключает встроенный фильтр XSS в браузере (устаревший, заменён CSP).

Применение и значение

HTTP-заголовки играют критическую роль в функционировании веба. Они позволяют:

  • Управлять кэшированием — заголовки Cache-Control, ETag, Last-Modified и Expires определяют, как долго и при каких условиях браузер или прокси-сервер могут сохранять копию ресурса. Это снижает нагрузку на сервер и ускоряет загрузку страниц.
  • Обеспечивать безопасность — заголовки, такие как Content-Security-Policy и Strict-Transport-Security, защищают пользователей от распространённых атак, включая межсайтовый скриптинг (XSS) и перехват трафика.
  • Передавать данные аутентификации — заголовки Authorization и Set-Cookie используются для идентификации пользователя и поддержания сессий.
  • Управлять соединением — заголовки Connection и Keep-Alive определяют, следует ли держать TCP-соединение открытым для последующих запросов, что снижает задержки.
  • Реализовывать CORS — заголовки Access-Control-Allow-Origin и связанные с ними позволяют веб-страницам безопасно запрашивать ресурсы с других доменов.
  • Передавать метаданные — заголовки Content-Type, Content-Language и Content-Encoding обеспечивают корректную интерпретацию и отображение контента клиентом.

Примеры использования

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

`` GET /index.html HTTP/1.1 Host: www.example.com User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8 Accept-Encoding: gzip, deflate, br Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7 Connection: keep-alive ``

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

`` HTTP/1.1 200 OK Date: Mon, 23 Jul 2024 12:34:56 GMT Server: nginx Content-Type: text/html; charset=utf-8 Content-Length: 1234 Content-Encoding: gzip Cache-Control: public, max-age=3600 Set-Cookie: session_id=abc123; Path=/; HttpOnly Strict-Transport-Security: max-age=31536000; includeSubDomains ``

Интересные факты

  • Максимальный размер одного заголовка не стандартизирован, но на практике серверы (например, Apache и Nginx) ограничивают его значением от 8 до 64 КБ. Общий размер всех заголовков в запросе также может быть ограничен (обычно 16—32 КБ).
  • В HTTP/2 заголовки передаются в сжатом бинарном формате с использованием HPACK, что уменьшает объём передаваемых данных и снижает задержки. Это особенно важно для мобильных сетей.
  • Некоторые заголовки, такие как X-Powered-By или Server, могут раскрывать информацию об используемом программном обеспечении, что потенциально помогает злоумышленникам. По соображениям безопасности их часто скрывают или модифицируют.
  • Заголовок Referer часто ошибочно пишется как Referrer (с двумя 'r'), что является исторической опечаткой в спецификации HTTP, сохранённой ради обратной совместимости.

Источники

  • RFC 7230 — HTTP/1.1: Message Syntax and Routing
  • RFC 7231 — HTTP/1.1: Semantics and Content
  • RFC 7232 — HTTP/1.1: Conditional Requests
  • RFC 7233 — HTTP/1.1: Range Requests
  • RFC 7234 — HTTP/1.1: Caching
  • RFC 7235 — HTTP/1.1: Authentication
  • RFC 7540 — HTTP/2
  • RFC 6648 — Deprecating the "X-" Prefix and Similar Constructs in Application Protocols
  • MDN Web Docs — HTTP Headers

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →