HTTP-запросы
HTTP-запрос — это сообщение, отправляемое клиентом (например, веб-браузером, мобильным приложением или серверным ботом) на сервер по протоколу передачи гипертекста (HTTP) с целью получения или отправки данных. HTTP-запрос является основным элементом взаимодействия в архитектуре «клиент-сервер», лежащей в основе работы Всемирной паутины (World Wide Web) и большинства современных веб-приложений. Каждый запрос состоит из стартовой строки, заголовков и, опционально, тела сообщения.
Структура HTTP-запроса
HTTP-запрос имеет строго определённый текстовый формат, регламентированный стандартами RFC 7230 и последующими спецификациями. Он состоит из трёх основных частей.
Стартовая строка
Стартовая строка (request line) содержит три обязательных элемента, разделённых пробелами:
- Метод HTTP (глагол, указывающий на действие, например, GET, POST, PUT, DELETE).
- URI (Uniform Resource Identifier) — путь к запрашиваемому ресурсу на сервере (например,
/index.htmlили/api/users?id=123). В HTTP/1.1 обычно указывается абсолютный путь, а в HTTP/1.0 — полный URL. - Версия протокола (например,
HTTP/1.1илиHTTP/2).
Пример: GET /index.html HTTP/1.1
Заголовки запроса
Заголовки (headers) представляют собой набор строк в формате «Ключ: Значение», которые передают метаданные о запросе, клиенте и ожидаемом ответе. Заголовки завершаются пустой строкой, отделяющей их от тела запроса. Основные типы заголовков:
- Общие заголовки (general headers): применимы как к запросу, так и к ответу (например,
Date,Cache-Control). - Заголовки запроса (request headers): содержат информацию о клиенте и предпочтениях (например,
User-Agent,Accept,Referer,Authorization). - Заголовки сущности (entity headers): описывают тело запроса (например,
Content-Type,Content-Length).
Примеры заголовков: `` Host: example.com User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Accept: text/html,application/xhtml+xml Content-Type: application/json ``
Тело запроса
Тело (body) — это необязательная часть, которая содержит данные, передаваемые серверу. Оно присутствует в запросах, изменяющих состояние сервера (например, POST, PUT, PATCH). Тело может быть в любом формате, но чаще всего используется JSON, XML, URL-кодированные данные формы (application/x-www-form-urlencoded) или бинарные данные (например, изображения). Формат тела указывается в заголовке Content-Type, а размер — в Content-Length.
Методы HTTP-запросов
Метод HTTP-запроса (или HTTP-глагол) определяет предполагаемое действие с ресурсом. Стандарт HTTP/1.1 определяет несколько основных методов, а также расширения (например, PATCH).
GET
Метод GET используется для запроса данных с сервера. Он не должен изменять состояние сервера (идемпотентен) и не имеет тела запроса. Ответ может кэшироваться. GET-запросы часто содержат параметры в строке URI (например, ?id=1&page=2).
POST
Метод POST предназначен для отправки данных на сервер для создания нового ресурса или выполнения действия. Тело запроса обязательно. POST-запросы не являются идемпотентными — повторная отправка может привести к созданию нескольких ресурсов.
PUT
Метод PUT заменяет текущее представление ресурса данными, переданными в теле запроса. Если ресурс не существует, он может быть создан. PUT является идемпотентным — повторный запрос с теми же данными не изменит состояние сервера.
DELETE
Метод DELETE удаляет указанный ресурс. Он также является идемпотентным — после первого удаления последующие запросы вернут тот же результат (чаще всего код 404 или 410).
PATCH
Метод PATCH применяется для частичного изменения ресурса. В отличие от PUT, он не заменяет весь ресурс, а модифицирует его. PATCH не обязательно является идемпотентным.
Другие методы
- HEAD — аналогичен GET, но сервер возвращает только заголовки ответа без тела. Используется для проверки существования ресурса или получения метаданных.
- OPTIONS — запрашивает информацию о доступных методах и опциях для указанного ресурса. Сервер возвращает заголовок
Allow. - CONNECT — устанавливает туннель к серверу через прокси (часто используется для HTTPS-соединений).
- TRACE — выполняет диагностический запрос для проверки пути прохождения запроса через промежуточные серверы.
Классификация HTTP-запросов
HTTP-запросы можно классифицировать по нескольким критериям.
По версии протокола
- HTTP/0.9 (1991) — простейшая версия, поддерживающая только метод GET без заголовков.
- HTTP/1.0 (1996) — добавил заголовки, методы POST и HEAD, но каждое соединение закрывалось после одного запроса.
- HTTP/1.1 (1997) — стандартная версия, поддерживающая постоянные соединения (keep-alive), конвейерную обработку (pipelining), виртуальные хосты и множество методов.
- HTTP/2 (2015) — бинарный протокол, поддерживающий мультиплексирование (несколько запросов в одном соединении), сжатие заголовков и серверный push.
- HTTP/3 (2022) — работает поверх протокола QUIC (на основе UDP), обеспечивая более низкую задержку и устойчивость к потере пакетов.
По типу содержимого
- Запросы с телом (POST, PUT, PATCH) — передают данные.
- Запросы без тела (GET, HEAD, DELETE, OPTIONS) — не содержат данных.
По идемпотентности
- Идемпотентные (GET, HEAD, PUT, DELETE, OPTIONS, TRACE) — повторный запрос не изменяет состояние сервера.
- Неидемпотентные (POST, PATCH) — повторный запрос может привести к разным результатам.
Применение HTTP-запросов
HTTP-запросы являются основой для всех веб-технологий. Они используются в следующих сценариях:
- Веб-браузинг: браузер отправляет GET-запросы для загрузки HTML-страниц, изображений, стилей и скриптов. POST-запросы используются для отправки форм (логин, регистрация, поиск).
- REST API: большинство современных веб-сервисов (например, социальные сети, облачные хранилища, платёжные системы) предоставляют программные интерфейсы на основе HTTP-запросов. Клиент отправляет запросы с методами GET, POST, PUT, DELETE для управления ресурсами (пользователями, товарами, заказами).
- AJAX и SPA: в одностраничных приложениях (Single Page Application) JavaScript отправляет асинхронные HTTP-запросы (через объект XMLHttpRequest или Fetch API) для обновления части страницы без перезагрузки.
- Веб-хуки (webhooks): серверы отправляют HTTP-запросы (обычно POST) на указанный URL при наступлении события (например, новый заказ, обновление статуса).
- Прокси-серверы и кэширование: прокси-серверы перенаправляют HTTP-запросы, а кэширующие серверы (например, Varnish, CDN) хранят копии ответов на GET-запросы для ускорения загрузки.
Коды состояния ответа
В ответ на HTTP-запрос сервер возвращает HTTP-ответ, содержащий код состояния (status code). Коды делятся на пять классов:
- 1xx (Informational) — информационные (например, 101 Switching Protocols).
- 2xx (Success) — успешное выполнение (200 OK, 201 Created, 204 No Content).
- 3xx (Redirection) — перенаправление (301 Moved Permanently, 302 Found, 304 Not Modified).
- 4xx (Client Error) — ошибка клиента (400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found).
- 5xx (Server Error) — ошибка сервера (500 Internal Server Error, 502 Bad Gateway, 503 Service Unavailable).
Безопасность HTTP-запросов
HTTP-запросы передаются в открытом виде, что делает их уязвимыми для перехвата и модификации. Для защиты используется протокол HTTPS (HTTP over TLS), который шифрует содержимое запроса и ответа. Основные угрозы, связанные с HTTP-запросами:
- Перехват данных (Man-in-the-Middle) — злоумышленник может прочитать пароли, токены и личные данные.
- Подделка запросов (CSRF — Cross-Site Request Forgery) — злоумышленник заставляет браузер жертвы отправить запрос на сервер от её имени.
- SQL-инъекции и XSS — вредоносные данные в теле запроса или URI могут быть выполнены сервером или браузером.
- Атаки на аутентификацию — перебор паролей через POST-запросы.
Для защиты применяются: HTTPS, токены CSRF, валидация входных данных, ограничение частоты запросов (rate limiting), использование заголовков безопасности (например, Content-Security-Policy, X-Frame-Options).
Интересные факты
- Первый HTTP-запрос был отправлен в 1991 году Тимом Бернерсом-Ли в ЦЕРНе. Он использовал метод GET для запроса страницы с описанием проекта World Wide Web.
- Максимальная длина URI в HTTP-запросе не регламентирована стандартом, но большинство серверов ограничивают её 8–16 КБ (например, Apache — 8 КБ, IIS — 16 КБ).
- В HTTP/1.1 конвейерная обработка (pipelining) позволяла отправлять несколько запросов без ожидания ответа, но из-за проблем с реализацией она редко используется. В HTTP/2 эта проблема решена через мультиплексирование.
- Заголовок
User-Agentчасто подделывается браузерами и ботами для обхода ограничений или для совместимости. - Метод TRACE редко используется в современных системах из-за уязвимости к атакам Cross-Site Tracing (XST).
Источники
- RFC 7230 — Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing
- RFC 7231 — Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content
- RFC 7540 — Hypertext Transfer Protocol Version 2 (HTTP/2)
- RFC 9000 — QUIC: A UDP-Based Multiplexed and Secure Transport (HTTP/3)
- «HTTP: The Definitive Guide» by David Gourley, Brian Totty (O'Reilly Media, 2002)
- Документация MDN Web Docs — HTTP
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →