Web и сеть
Для чего модуль
Научиться быстро разбирать сетевые проблемы и уверенно отвечать на вопросы по HTTP/API на собеседовании.
Результат после прохождения
- Вы объясняете путь запроса от браузера до сервера и обратно.
- Уверенно диагностируете проблемы CORS, кэша и latency.
- Проектируете API-взаимодействия с учетом надежности и ошибок.
Термины и аббревиатуры
| Термин | Коротко |
|---|---|
HTTP | Протокол запрос-ответ |
CORS | Ограничение чтения cross-origin |
ETag | Версия ресурса |
TTFB | Время до первого байта |
Idempotency | Повтор без двойного эффекта |
Фокус по грейдам
Junior: понимать базовые механики и объяснять их простыми примерами.Middle: применять тему в продуктовых сценариях с учетом рисков и ограничений.Senior: управлять архитектурными trade-offs, метриками и эволюцией решения.
Как работать с модулем
- Берите один сетевой кейс на урок.
- Фиксируйте: симптом -> гипотеза -> проверка -> решение.
- После урока обновляйте чек-лист диагностики.
Программа модуля
Урок 1. HTTP и кэширование
Цель: уверенно читать и проектировать HTTP-взаимодействия без мифов.
1. HTTP-методы, безопасность и идемпотентность
Частая ошибка на собеседовании: путать safe и idempotent.
| Метод | Safe | Idempotent | Типовой смысл |
|---|---|---|---|
GET | Да | Да | Прочитать ресурс |
HEAD | Да | Да | Прочитать только headers |
PUT | Нет | Да | Полностью заменить ресурс |
DELETE | Нет | Да | Удалить ресурс |
POST | Нет | Обычно нет | Создать ресурс/запустить действие |
PATCH | Нет | Обычно нет | Частично изменить ресурс |
Как это использовать в реальном API:
- Для безопасного чтения используйте
GETи исключайте побочные эффекты. - Для повторяемых операций (повтор запроса, retry) опирайтесь на идемпотентные методы или
Idempotency-Key. - Для ошибок разделяйте клиентские (
4xx) и серверные (5xx) причины.
Быстрый ориентир по статусам:
200/204- операция выполнена.304- можно использовать кэшированную версию.400/422- проблема во входных данных.401/403- проблема доступа (не путать между собой).404- ресурс не найден.409- конфликт состояния (например, версия ресурса).429- превышен лимит запросов.
2. Кэширование: Cache-Control, ETag, 304
Цель кэша: не делать лишние network round-trip и уменьшать latency.
Типовой flow с валидацией по ETag:
GET /api/profile HTTP/1.1
Host: app.example.com
HTTP/1.1 200 OK
Cache-Control: private, max-age=60
ETag: "profile-v42"
Content-Type: application/json
Через минуту клиент делает conditional request:
GET /api/profile HTTP/1.1
Host: app.example.com
If-None-Match: "profile-v42"
HTTP/1.1 304 Not Modified
Cache-Control: private, max-age=60
ETag: "profile-v42"
Что важно понимать:
max-ageзадает "свежесть" ответа.ETagиIf-None-Matchдают проверку версии ресурса.304возвращает только метаданные, а тело берется из кэша клиента.- Для персональных данных используйте
private, для публичных ассетов -public.
Антипаттерны:
- Кэшировать ответы с user-specific данными как
public. - Отдавать агрессивный кэш на эндпоинт, который часто меняется, без стратегии инвалидации.
- Смешивать бизнес-ошибки и транспортные ошибки в один неструктурированный текст.
3. Единый контракт ошибок API
Минимальный контракт, который удобно логировать и разбирать:
{
"error": {
"code": "PROFILE_NOT_FOUND",
"message": "Profile does not exist",
"context": {
"profileId": "123"
},
"traceId": "0a12fcd9-7f5f-4a6f-bce2-3ec0b09dfaa8"
}
}
Зачем это нужно:
- FE может стабильно маппить
codeв UX-сценарий. traceIdсвязывает frontend-лог и backend-трассировку.contextснижает время диагностики инцидентов.
Мини-задача (обязательная)
Разберите в DevTools три запроса из вашего проекта и заполните таблицу:
| Endpoint | Метод | Статус | Cache-Control / ETag | Можно кэшировать? | Почему |
|---|
Требование: хотя бы один пример должен быть "кэшировать нельзя" с четким аргументом.
Разбор-ориентир (как проверять себя)
GET /api/catalogсCache-Control: public, max-age=120обычно кэшируется.GET /api/meс персональными данными - толькоprivate, либо вообще без кэша в зависимости от требований актуальности.POST /api/ordersне должен кэшироваться браузером как обычное чтение ресурса.
Для junior и для senior
Junior focus:
- Четко отличать
safeиidempotent. - Уметь объяснить разницу между
401и403. - Понимать, зачем нужен
ETag.
Senior focus:
- Проектировать стратегию кэширования по типам endpoint.
- Учитывать инвалидацию и риск stale-данных в UI.
- Стандартизировать error contract для всех сервисов команды.
Что спросит интервьюер:
когда GET может быть небезопасным и почему PUT называют идемпотентным.
Критерий готовности по уроку: вы можете за 2-3 минуты разобрать любой HTTP-запрос из DevTools и предложить улучшения по кэшу и контракту ошибок.
Урок 2. DNS, TLS и latency
Цель: понимать, где теряется время до первого байта.
1. Из чего реально складывается задержка
Когда "endpoint медленный", важно разложить время, а не гадать.
Типовые этапы в DevTools Waterfall:
DNS lookup- поиск IP по домену.Initial connection- TCP-соединение.SSL/TLS- согласование защищенного канала.TTFB- время до первого байта ответа.Content download- скачивание тела ответа.
Упрощенная модель:
Latency ~= DNS + Connect + TLS + Server processing (часть TTFB) + Download
Практический вывод:
- Большой
TTFBобычно указывает на backend/DB/очереди или удаленный регион. - Большой
Content downloadчасто связан с тяжелым payload. - Повторные запросы без роста
DNS/TLSмогут быть быстрее за счет keep-alive и кэша.
2. Почему локально быстро, а в проде медленно
Локальный стенд почти всегда "тепличный":
- Малая задержка до сервиса (один регион).
- Меньше сетевых hops и нет реального мобильного канала.
- Меньше конкуренции за ресурсы, чем в проде.
Что проверять первым:
- География пользователей и регион backend.
- Размер JSON/медиа, сжатие (
gzip/br), pagination. - Кэширование на CDN/edge.
- Холодные старты или деградация зависимостей на backend.
3. Как отличать сетевую проблему от серверной
Быстрый диагностический шаблон:
- Если
DNS/Connect/TLSвысокие на многих endpoint одновременно - ищите сеть/маршрут/инфраструктуру. - Если узкое место только в
TTFBодного-двух endpoint - вероятен backend-код или БД. - Если высокий только
Content download- оптимизируйте ответ (объем, формат, компрессия).
Проверочные вопросы к себе:
- Проблема глобальная или только для конкретной страницы/API?
- Воспроизводится ли в другом регионе/сети?
- Есть ли корреляция с ростом server-side метрик (p95/p99 latency)?
4. Мини-кейс (как объяснять на интервью)
Ситуация: экран каталога открывается 3.8s, пользователь жалуется на "тормоза".
Разбор:
DNS + Connect + TLS= 120ms (нормально).TTFB= 2.9s (основная проблема).Download= 700ms при ответе 1.8MB (вторичная проблема).
Решение:
- На backend ввели пагинацию и убрали лишние поля.
- Добавили сжатие и короткий кэш для стабильно повторяемых данных.
- Вынесли тяжелые вычисления из sync-path запроса.
Результат:
TTFB снизился до 900ms, payload до 420KB, итоговое время заметно сократилось.
Мини-задача (обязательная)
Возьмите один медленный endpoint и заполните таблицу:
| Endpoint | DNS | Connect | TLS | TTFB | Download | Главный bottleneck | Что менять |
|---|
Требование: обоснуйте одну гипотезу и один способ проверки гипотезы.
Для junior и для senior
Junior focus:
- Читать waterfall и находить самый дорогой этап.
- Понимать разницу между
TTFBиDownload. - Давать простую гипотезу и проверку.
Senior focus:
- Приоритизировать улучшения по p95/p99, а не по единичному замеру.
- Связывать сетевые симптомы с backend и инфраструктурой.
- Проектировать mitigation-план: кэш, payload budget, деградация UX при медленной сети.
Что спросит интервьюер: как отличить проблему сети от медленного backend-кода.
Критерий готовности по уроку: вы можете по одному waterfall объяснить, где теряется время, и предложить 2 реалистичных улучшения с ожидаемым эффектом.
Урок 3. CORS и API-контракты
Цель: не путать CORS, авторизацию и контракт API.
1. Что CORS делает, а что не делает
CORS управляет тем, может ли браузерный frontend читать ответ другого origin.
Это не механизм авторизации и не защита API "сама по себе".
Важно разделять:
CORS- браузерное ограничение на чтение ответа.AuthN/AuthZ- проверка личности и прав доступа на сервере.CSRF/XSS- отдельные классы угроз, которые CORS не закрывает.
2. Same-origin policy и preflight
Когда браузер делает preflight (OPTIONS):
- Метод не "simple" (
PUT,PATCH,DELETEи т.д.). - Есть нестандартные headers (например,
Authorization). Content-Typeне входит в "simple" набор.
Типовой ответ сервера на preflight:
HTTP/1.1 204 No Content
Access-Control-Allow-Origin: https://app.example.com
Access-Control-Allow-Methods: GET,POST,PUT,PATCH,DELETE,OPTIONS
Access-Control-Allow-Headers: Content-Type, Authorization, X-Request-Id
Access-Control-Allow-Credentials: true
Vary: Origin
Критичные моменты:
- При
Allow-Credentials: trueнельзя использоватьAllow-Origin: *. - Всегда задавайте
Vary: Origin, чтобы не сломать кэширование. - Разрешайте только нужные методы и заголовки, а не "всё подряд".
3. Политика CORS по средам
Практичная схема:
dev: whitelist локальных origin (http://localhost:3000,http://localhost:5173).stage: только домены стенда и QA-окружения.prod: только production-origin (без wildcard).
Антипаттерны:
- Единая permissive-политика для всех окружений.
*в production "для скорости разработки".- Отсутствие аудита разрешенных origin после релизов.
4. API-контракты и обратная совместимость
Базовые правила стабильного API:
- Предпочитайте additive changes: добавлять поля безопаснее, чем удалять/переименовывать.
- Для breaking changes фиксируйте версию (
/v2или versioned media type). - Введите deprecation window с датой отключения и коммуникацией клиентам.
Минимальный lifecycle изменения:
- Объявили
deprecatedполе и срок удаления. - Обновили клиентов и метрики использования старого поля.
- Удалили поле после окна миграции.
Мини-задача (обязательная)
Опишите для своего учебного API:
- CORS-политику для
dev/stage/prod. - Правила для breaking/non-breaking изменений.
- Шаблон уведомления о деприкации (что, когда, кого затрагивает).
Проверка качества: ваш документ должен позволять новому разработчику настроить CORS и выпустить изменение API без поломки клиентов.
Для junior и для senior
Junior focus:
- Уметь объяснить preflight и причину
OPTIONS. - Не путать CORS и авторизацию.
- Понимать, почему
Access-Control-Allow-Origin: *часто опасен.
Senior focus:
- Проектировать environment-specific CORS policy без компромиссов по безопасности.
- Управлять эволюцией API через versioning/deprecation процесс.
- Связывать контрактные изменения с monitoring и rollout-стратегией.
Что спросит интервьюер:
почему «включить * в CORS» обычно плохая идея.
Критерий готовности по уроку: вы можете предложить безопасную CORS-политику и план эволюции API-контракта без регрессий для существующих клиентов.
Урок 4. Наблюдаемость и диагностика
Цель: выстроить воспроизводимый процесс сетевой диагностики.
1. Что наблюдать в первую очередь
Базовый набор сигналов для frontend-диагностики:
Network waterfall: где тратится время по этапам запроса.Status + payload: пришли ли данные нужной структуры.Server-TimingиtraceId: есть ли связь с backend-метриками.- UI-состояния: loading, empty, error, partial data.
Минимальная дисциплина:
- Любой инцидент разбирается на фактах из логов/метрик, а не на предположениях.
- Для каждого инцидента фиксируется timeline: что увидели, что проверили, что подтвердили.
- После фикса добавляется проверка, чтобы кейс не вернулся.
2. Retry, timeout, cancellation, circuit-breaker
Эти механизмы решают разные проблемы:
timeoutограничивает ожидание одного запроса.retryполезен для временных сбоев (502/503/504, сетевой шум).cancellation(AbortController) защищает от устаревших ответов.circuit-breakerвременно "закрывает" проблемный endpoint и снижает каскадные ошибки.
Практические правила:
- Не ретраить безусловно
4xxошибки. - Для retry используйте ограничение попыток и backoff.
- Всегда логируйте причину таймаута/отмены отдельно от бизнес-ошибок.
3. Корреляция FE и backend
Без корреляции вы видите только "симптом" на клиенте.
Что должно быть в контракте наблюдаемости:
X-Request-IdилиtraceIdв запросе и ответе.- Единый формат frontend error log (route, endpoint, status, traceId, user action).
- Привязка к релизу (
build/version), чтобы быстро находить регрессии.
Пример полезной frontend-записи:
{
"route": "/catalog",
"endpoint": "/api/catalog?filter=sale",
"status": 200,
"traceId": "4f6e43a7-b9f5-4c15-8e32-9f1d8106fba1",
"payloadItems": 0,
"uiState": "empty_unexpected",
"build": "web-2026.02.11-3"
}
4. Runbook для кейса: 200 OK, но UI пустой
Пошаговый шаблон:
- Проверить network: endpoint, query params, status, размер тела.
- Сравнить фактический payload с ожидаемой схемой UI.
- Проверить клиентскую фильтрацию/маппинг: не "съедает" ли данные трансформация.
- Проверить feature flags и условия рендера (роль, регион, эксперимент).
- Найти
traceIdи сверить backend-логи по тому же запросу. - Зафиксировать root cause и добавить защиту (валидация схемы, fallback, alert).
Типовые причины:
- Контракт API изменился, а клиент ожидает старое поле.
- Неправильные query params после изменения роутинга.
- Ошибка маппинга на клиенте при корректном ответе сервера.
Мини-задача (обязательная)
Соберите runbook для вашего кейса "200 OK, но пустой экран" и добавьте:
- Чек-лист проверки (минимум 8 шагов).
- Какие логи/метрики нужны на FE и BE.
- Какой alert должен сработать, если проблема повторится.
Критерий качества: другой разработчик должен по вашему runbook локализовать проблему без вашей помощи.
Для junior и для senior
Junior focus:
- Уметь читать network + response body вместе, а не по отдельности.
- Отличать пустые данные "по бизнесу" от пустых данных "из-за бага".
- Работать по готовому runbook без пропуска шагов.
Senior focus:
- Строить end-to-end observability между FE, API gateway и сервисами.
- Вводить SLO/alerting для критичных пользовательских сценариев.
- Уменьшать MTTR через стандарты логирования и postmortem-процесс.
Что спросит интервьюер: как вы действуете, если баг плавающий и не воспроизводится локально.
Критерий готовности по уроку: вы можете провести диагностику "200 OK, но UI пустой" до root cause и предложить превентивные меры, которые реально снижают повторяемость инцидента.
Практика
- Разберите 3 запроса в DevTools Network и определите bottleneck.
- Напишите runbook для кейса
200 OK, но пустой экран. - Подготовьте шаблон API error contract (поля, коды, trace id).
- Закрепите в Junior JavaScript и Senior Frontend.
- Реализуйте диагностический сценарий в Песочнице.
Связь с треками и вопросами
- Треки: Junior трек, Middle трек, Senior трек.
- Вопросы: Junior JavaScript, Senior Frontend.
- Повторение: 3-5 вопросов без подсказок -> сверка с модулем -> повтор через 24 часа.
Критерий готовности
Вы даете структурный ответ: проблема -> гипотеза -> проверка -> решение -> метрика улучшения.
Артефакты после модуля
- Личный чек-лист сетевой диагностики.
- Документ по CORS/API-контрактам для учебного проекта.
- 2-3 истории из практики для собеседования (контекст -> действие -> результат).