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-Type — MIME-тип содержимого тела ответа (например,
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 →


