HTTP
Что такое HTTP и зачем он нужен
HTTP — прикладной протокол обмена сообщениями между клиентом (обычно браузером или мобильным приложением) и сервером. Он определяет формат запросов и ответов, поддержку методов, статусов, заголовков, правил кеширования, аутентификации, перенаправлений и многого другого. Поверх HTTP строятся веб-сайты, REST/JSON API, загрузка файлов, стриминг и realtime-механики.
Клиент-сервер: клиент инициирует запрос, сервер формирует ответ.
Без сохранения состояния: каждый запрос самодостаточен; состояние пользователя хранится вне протокола (например, в cookie или токене).
Расширяемость: поведение уточняется заголовками (кеш, язык, формат контента, авторизация и т. п.).
Структура HTTP-сообщений
Запрос (Request)
Запрос состоит из строки запроса, заголовков и необязательного тела. Строка запроса включает метод, путь URI и версию протокола.
Ответ (Response)
Ответ начинается со строки статуса: версия протокола, статус-код и фраза. Далее — заголовки и тело (опционально).
Методы и семантика
GET — получить ресурс; без побочных эффектов; тело запроса обычно не используется.
HEAD — как GET, но без тела ответа; для проверки наличия/метаданных.
POST — создать/выполнить действие; может изменять состояние на сервере.
PUT — полная замена ресурса по идентификатору.
PATCH — частичное изменение ресурса.
DELETE — удалить ресурс.
OPTIONS — запрос поддерживаемых методов/настроек (часто для CORS preflight).
Статус-коды: как выбрать корректный
2xx — успех: 200 OK, 201 Created (с заголовком
Location
), 204 No Content.3xx — перенаправления: 301/308 постоянное, 302/303/307 временное.
4xx — ошибка клиента: 400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found, 409 Conflict, 422 Unprocessable Entity, 429 Too Many Requests.
5xx — ошибка сервера: 500 Internal Server Error, 502 Bad Gateway, 503 Service Unavailable, 504 Gateway Timeout.
Заголовки: основы взаимодействия
Content-Type — тип тела ответа/запроса (например,
application/json
).Accept — желаемый формат ответа (контент-негациация).
Authorization — схема авторизации (например, Bearer или Basic).
Cache-Control, ETag, Last-Modified — управление кешированием.
Range, Content-Range — частичная загрузка.
X-Request-Id, Traceparent — корреляция и трассировка.
Контент-негациация (Content Negotiation)
Клиент указывает, в каком виде хочет получить ответ, через Accept
, Accept-Language
, Accept-Encoding
. Сервер выбирает лучший вариант и возвращает соответствующие заголовки.
Кеширование: быстро и экономно
Сильное и условное кеширование
Кеш снижает задержки и нагрузку. Управляйте им заголовками:
Cache-Control:
max-age
,s-maxage
,public/private
,no-store
,must-revalidate
.ETag и If-None-Match — условные запросы (304 Not Modified).
Last-Modified и If-Modified-Since — альтернативный механизм.
Практика для API
Ставьте
Cache-Control: no-store
для приватных данных.Для справочников и статических данных — разумный
max-age
иETag
.Указывайте
Vary
(например,Vary: Accept-Encoding, Accept
), если ответ зависит от заголовков запроса.
Куки и сессии
Cookie — пары ключ=значение, сохраняемые браузером. Сервер устанавливает их через Set-Cookie
, а клиент отправляет обратно в заголовке Cookie
.
Флаги:
HttpOnly
,Secure
,SameSite
(Lax/Strict/None), срок, домен, путь.Сессии: сервер хранит состояние в хранилище, а клиент держит идентификатор сессии в cookie.
JWT: альтернатива сессиям — хранение токена у клиента (часто в cookie с
HttpOnly
).
Аутентификация и авторизация поверх HTTP
Basic:
Authorization: Basic <base64(user:pass)>
— только через HTTPS.Bearer:
Authorization: Bearer <token>
— распространённый способ для API.Cookies + сессии: классическая модель для веб-сайтов.
HTTPS и TLS в двух словах
HTTPS — это HTTP поверх TLS, обеспечивающий шифрование, целостность и аутентификацию сервера (по сертификату). Клиент устанавливает TLS-сеанс, затем передаёт HTTP-сообщения внутри защищённого канала.
Преимущества: конфиденциальность, защита от подмены, обязательное требование для современных браузеров (например, для Service Worker, HTTP/2, cookie).
Практика: автоматизируйте выпуск сертификатов (например, ACME/Let's Encrypt), включайте HSTS.
HTTP/1.1 vs HTTP/2 vs HTTP/3
HTTP/1.1: один запрос на соединение; keep-alive; head-of-line blocking на уровне TCP сокетов при последовательных запросах.
HTTP/2: мультиплексирование в одном соединении, бинарный формат, сжатие заголовков (HPACK), серверный push (устарел).
HTTP/3: поверх QUIC/UDP; устойчивее к потере пакетов, более быстрый hand-shake, отсутствие HOL-блокировок TCP.
Потоковые ответы, SSE и сравнение с WebSocket
Chunked Transfer: сервер отправляет части тела по мере готовности (
Transfer-Encoding: chunked
).SSE (Server-Sent Events): однонаправленный поток от сервера к клиенту поверх HTTP.
WebSocket: двусторонний постоянный канал; не HTTP после апгрейда, но инициируется HTTP-запросом.
Прокси, реверс-прокси, CDN
Реверс-прокси (Nginx, Envoy) принимает запросы от клиентов и проксирует их в бэкенды: выполняет TLS, кеширование, сжатие, балансировку, слияние соединений, ограничения скорости. CDN кэширует статический и полу-статический контент ближе к пользователю.
Безопасность на уровне протокола
Всегда HTTPS: шифрование, HSTS, корректные сертификаты.
CORS: разрешайте только ожидаемые источники, не используйте
*
с credentials.Заголовки безопасности:
Content-Security-Policy
,X-Content-Type-Options: nosniff
,Referrer-Policy
,X-Frame-Options
илиframe-ancestors
в CSP.Размеры и таймауты: ограничивайте тело запроса, время ожидания и частоту запросов (rate limiting).
Инструменты: как работать руками и из кода
curl — швейцарский нож HTTP
Диагностика и типичные ошибки
Неверный Content-Type: JSON без правильного заголовка ломает парсинг на клиенте.
Несогласованные статусы: 200 при ошибке логики сбивает клиентов; используйте 4xx/5xx.
Отсутствует кеш-контроль: лишняя нагрузка, медленные ответы.
Смешение HTTP и бизнес-ошибок: разделяйте транспортный уровень и доменную валидацию.
Игнорирование таймаутов: зависшие соединения; выставляйте серверные и клиентские таймауты.