HTTP: как устроен протокол и что о нём спрашивают на собеседовании
HTTP спрашивают у всех: бэкендеров, фронтендеров, тестировщиков, иногда даже у аналитиков. Причина простая: почти любое взаимодействие в вебе идёт через него, и по ответам сразу видно, понимает человек, что происходит между кликом и данными на экране, или пользуется этим как чёрным ящиком.
Разберём протокол по частям.
Модель: запрос и ответ
Клиент отправляет запрос, сервер отвечает. Никакого состояния между запросами протокол не хранит: каждый запрос самодостаточен, сервер по умолчанию не помнит, что было в прошлый раз.
Отсюда растут куки, токены и сессии: раз протокол не помнит, приходится передавать признак пользователя в каждом запросе.
Запрос состоит из строки запроса (метод, путь, версия), заголовков и необязательного тела. Ответ из строки статуса, заголовков и тела.
Методы
GET запрашивает данные и не должен ничего менять. Может кешироваться, параметры уезжают в URL.
POST создаёт или запускает действие. Не идемпотентен: два одинаковых POST обычно создают две сущности.
PUT заменяет ресурс целиком и идемпотентен: сколько раз ни повторяй, результат тот же.
PATCH меняет часть ресурса. Идемпотентность зависит от реализации.
DELETE удаляет. Идемпотентен по смыслу: повторное удаление уже удалённого не должно ломать систему.
Про идемпотентность спрашивают почти всегда, потому что она напрямую связана с ретраями. Сеть теряет ответы, клиенты повторяют запросы, и без продуманной идемпотентности вы получаете двойные списания. На практике для POST добавляют ключ идемпотентности, по которому сервер узнаёт повтор.
Коды состояния
Группы важнее конкретных чисел.
2xx успех. 200 общий случай, 201 создано, 204 успех без тела.
3xx перенаправление. 301 постоянное, 302 временное, 304 «не изменилось, бери из кеша».
4xx ошибка клиента. 400 некорректный запрос, 401 не аутентифицирован, 403 аутентифицирован, но нельзя, 404 не найдено, 409 конфликт, 422 не прошло валидацию, 429 слишком много запросов.
5xx ошибка сервера. 500 общая, 502 плохой ответ от апстрима, 503 недоступен, 504 таймаут апстрима.
Любимый вопрос интервьюера: разница между 401 и 403. Первое означает «мы не знаем, кто вы», второе «знаем, и вам сюда нельзя». Второй по популярности: что вернуть при ошибке валидации, и тут допустимы и 400, и 422, главное объяснить логику.
Заголовки, которые надо знать
Content-Type: что за формат в теле. Классическая ошибка новичка это отправить JSON без него.
Authorization: токен или другой способ идентификации.
Accept: что клиент готов принять.
Cache-Control и ETag: как кешировать и как проверять, не устарело ли.
Set-Cookie и Cookie: механика сессий.
X-Request-Id или его аналоги: сквозной идентификатор для отладки. В распределённых системах без него разбор инцидентов превращается в гадание.
Кеширование
Механизм, который экономит больше всего трафика и чаще всего ломает продакшн неожиданным образом.
Сервер говорит, сколько ответ можно считать свежим (Cache-Control), и даёт метку версии (ETag). Клиент при следующем запросе спрашивает: «у меня версия такая, изменилось?». Если нет, сервер отвечает 304 без тела, и трафик экономится.
Типичная проблема: закешировали то, что нельзя, например персональные данные на общем кеширующем слое. Отсюда правило про приватные ответы и заголовок private.
Версии протокола
HTTP/1.1 работает по текстовому протоколу, на одном соединении запросы идут по очереди. Отсюда историческая практика открывать несколько соединений.
HTTP/2 ввёл бинарный формат и мультиплексирование: много запросов параллельно в одном соединении, плюс сжатие заголовков.
HTTP/3 переехал на QUIC поверх UDP, что убирает проблему блокировки очереди на уровне транспорта и ускоряет установление соединения.
Для собеседования достаточно понимать смысл изменений, а не детали формата кадров.
HTTPS в двух абзацах
HTTPS это тот же HTTP, но поверх TLS. TLS даёт шифрование, целостность и подтверждение подлинности сервера сертификатом.
Что стоит понимать: рукопожатие стоит времени (отсюда переиспользование соединений), сертификат подтверждает домен, а не добропорядочность владельца, и трафик внутри туннеля не виден промежуточным узлам, включая заголовки и путь запроса.
Что чаще всего спрашивают
Чем GET отличается от POST и почему GET не должен менять данные. Что такое идемпотентность и зачем она нужна при ретраях. Разница 401 и 403. Что вернуть при ошибке валидации. Как работает кеширование и что такое ETag. Что происходит от ввода адреса в браузере до появления страницы. Чем отличается HTTP/2 от HTTP/1.1.
Последний вопрос про «что происходит при вводе адреса» любят особенно: он разворачивается на десять минут и показывает всю картину сразу, от DNS до рендера.
Как проверить, что действительно понимаете
Простой тест: откройте инструменты разработчика в браузере, вкладку с сетью, и разберите любой запрос по частям. Метод, заголовки, код ответа, время. Потом сделайте то же самое из консоли через curl.
Пять минут практики дают больше, чем час чтения спецификации.
А для проверки себя вопросами есть Сеньорчик: блоки по API, вебу и сетям в треках бэкенда и тестирования, вопросы с реальных собеседований, с вариантами ответов и разбором. Движок возвращает темы, где вы ошибаетесь. Десять минут в день в Telegram, бесплатно.