Компьютерные сети
HTTP заголовки
Заголовки - невидимая часть каждого запроса, которая управляет всем: авторизацией, кешированием, безопасностью. Одна неправильная настройка Cache-Control - и пользователи видят устаревшие данные. Одна неправильная cookie - и сессия украдена.
- **Оптимизация:** правильный Cache-Control ускоряет сайт в разы
- **Безопасность:** HttpOnly + Secure cookies защищают сессии
- **Интеграция:** CORS позволяет frontend и backend на разных доменах
Предварительные знания
Заголовки HTTP
**HTTP-заголовки** - метаданные запроса или ответа в формате `Имя: Значение`. Заголовки управляют кешированием, аутентификацией, форматом данных, безопасностью. Делятся на заголовки запроса, ответа и общие.
**Host обязателен!** В HTTP/1.1 заголовок Host: обязателен - он указывает домен. Один IP может хостить много сайтов (virtual hosts), и сервер выбирает нужный по Host.
Какой заголовок обязателен в HTTP/1.1 запросах?
Content-Type и MIME
**Content-Type** указывает формат тела сообщения. Использует MIME-типы (Multipurpose Internet Mail Extensions). Формат: `тип/подтип; параметры`. Без правильного Content-Type браузер может неверно интерпретировать данные.
**charset важен!** `Content-Type: text/html; charset=utf-8` - без charset браузер может неправильно декодировать текст (кракозябры). Для JSON charset не нужен - он всегда UTF-8 по спецификации.
Какой Content-Type нужен для отправки JSON в API?
Cookies
**Cookies** - способ хранить состояние в stateless HTTP. Сервер устанавливает куку через `Set-Cookie`, браузер автоматически отправляет её в последующих запросах через `Cookie`. Используются для сессий, настроек, трекинга.
**Third-party cookies умирают.** Браузеры блокируют куки с других доменов (трекеры). Chrome планирует полностью удалить third-party cookies. Для трекинга теперь нужны альтернативы (first-party data, Privacy Sandbox).
Зачем флаг HttpOnly у cookie?
Кеширование
**Cache-Control** - главный заголовок управления кешем. Указывает, можно ли кешировать, как долго, кому. Правильное кеширование ускоряет сайты и снижает нагрузку на сервер. Неправильное - показывает устаревшие данные.
**immutable** говорит: файл никогда не изменится. Используй для версионированных файлов (style.abc123.css). Браузер не будет делать conditional request - файл всегда свежий, пока в кеше.
Что означает Cache-Control: no-cache?
CORS
**CORS** (Cross-Origin Resource Sharing) - механизм безопасности браузера. По умолчанию JavaScript не может делать запросы к другим доменам (same-origin policy). CORS позволяет серверу разрешить кросс-доменные запросы через специальные заголовки.
**CORS - защита браузера, не сервера!** curl и Postman игнорируют CORS. Сервер получит запрос в любом случае. CORS защищает пользователя: злой сайт не сможет через браузер жертвы сделать запрос к её банку.
CORS ошибки означают проблему с клиентским кодом
CORS настраивается на сервере - он должен отправить правильные заголовки
Браузер просто исполняет политику. Если сервер не отправляет Access-Control-Allow-Origin, браузер блокирует ответ. Решение - настроить CORS на сервере (или использовать прокси).
Что делает браузер перед «непростым» кросс-доменным запросом?
Ключевые идеи
- **Content-Type** указывает формат данных (application/json, text/html)
- **Cookies** хранят состояние; HttpOnly + Secure + SameSite - обязательны
- **Cache-Control** управляет кешированием; no-store ≠ no-cache
- **CORS** разрешает кросс-доменные запросы; настраивается на сервере
Связанные темы
Заголовки работают вместе с другими концепциями:
- HTTPS и TLS — Secure cookies требуют HTTPS
- HTTP/2 — Сжатие заголовков через HPACK
- CDN — Cache-Control управляет кешированием на CDN
Вопросы для размышления
- Почему нельзя использовать Access-Control-Allow-Origin: * с credentials?
- Как версионирование файлов (app.abc123.js) связано с кешированием?
- Почему SameSite=Strict может сломать некоторые сценарии?