Backend Typescript 1.0.0 Help

HTTP

Что такое HTTP и зачем он нужен

HTTP — прикладной протокол обмена сообщениями между клиентом (обычно браузером или мобильным приложением) и сервером. Он определяет формат запросов и ответов, поддержку методов, статусов, заголовков, правил кеширования, аутентификации, перенаправлений и многого другого. Поверх HTTP строятся веб-сайты, REST/JSON API, загрузка файлов, стриминг и realtime-механики.

  • Клиент-сервер: клиент инициирует запрос, сервер формирует ответ.

  • Без сохранения состояния: каждый запрос самодостаточен; состояние пользователя хранится вне протокола (например, в cookie или токене).

  • Расширяемость: поведение уточняется заголовками (кеш, язык, формат контента, авторизация и т. п.).

Структура HTTP-сообщений

Запрос (Request)

Запрос состоит из строки запроса, заголовков и необязательного тела. Строка запроса включает метод, путь URI и версию протокола.

GET /api/users?limit=10&page=2 HTTP/1.1 Host: api.example.com User-Agent: curl/8.5.0 Accept: application/json Authorization: Bearer <token>

Ответ (Response)

Ответ начинается со строки статуса: версия протокола, статус-код и фраза. Далее — заголовки и тело (опционально).

HTTP/1.1 200 OK Content-Type: application/json; charset=utf-8 Content-Length: 27 ETag: "W/'1b-abc123'" {"total": 2, "items": []}

Методы и семантика

  • 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. Сервер выбирает лучший вариант и возвращает соответствующие заголовки.

GET /report HTTP/1.1 Host: api.example.com Accept: application/json, text/csv;q=0.8 Accept-Language: ru,en;q=0.7 Accept-Encoding: gzip, br HTTP/1.1 200 OK Content-Type: application/json; charset=utf-8 Content-Encoding: gzip {"ok":true}

Кеширование: быстро и экономно

Сильное и условное кеширование

Кеш снижает задержки и нагрузку. Управляйте им заголовками:

  • Cache-Control: max-age, s-maxage, public/private, no-store, must-revalidate.

  • ETag и If-None-Match — условные запросы (304 Not Modified).

  • Last-Modified и If-Modified-Since — альтернативный механизм.

GET /avatars/u123.png HTTP/1.1 Host: cdn.example.com If-None-Match: "W/'a1b2c3'" HTTP/1.1 304 Not Modified Cache-Control: public, max-age=604800 ETag: "W/'a1b2c3'"

Практика для 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&#39;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

curl -i -X POST "https://api.example.com/login" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ --data '{"email":"user@example.com","password":"secret"}'
curl -I "https://static.example.com/logo.png" # только заголовки (HEAD)

Диагностика и типичные ошибки

  • Неверный Content-Type: JSON без правильного заголовка ломает парсинг на клиенте.

  • Несогласованные статусы: 200 при ошибке логики сбивает клиентов; используйте 4xx/5xx.

  • Отсутствует кеш-контроль: лишняя нагрузка, медленные ответы.

  • Смешение HTTP и бизнес-ошибок: разделяйте транспортный уровень и доменную валидацию.

  • Игнорирование таймаутов: зависшие соединения; выставляйте серверные и клиентские таймауты.

Last modified: 01 October 2025