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 и предложить превентивные меры, которые реально снижают повторяемость инцидента.
Практика
1. Request lifecycle и DevTools Network
Связка: Junior JS q-19..q-20, Senior q-10, Browser storage and CORS.
Что сделать:
- Разберите 3 запроса в DevTools Network: успешный JSON, preflight/CORS case и медленный запрос.
- Для каждого запроса заполните таблицу
route -> method -> status -> headers -> timing -> body size -> cache -> bottleneck. - Для CORS вручную выпишите preflight request/response для
dev,stage,prodи объясните, почему frontend не "чинит" CORS.
Артефакт: network diagnosis table + CORS preflight policy table.
Критерий готовности: вы читаете request/response/timing вместе и можете доказать, где проблема: DNS/TLS, network latency, server time, payload, cache, CORS или client mapping.
2. 200 OK, но пустой экран
Связка: Senior q-6, Senior q-10, Nest q-19.
Что сделать:
- Соберите runbook для кейса
200 OK, но UI пустой: минимум 8 шагов от Network до root cause. - Добавьте expected payload shape, фактический payload, UI mapping rule и возможные states:
empty,partial,stale,unavailable,blocked. - Опишите, какие FE/BE логи,
requestId/traceId, метрики и alert нужны, чтобы следующий инцидент нашли быстрее.
Артефакт: runbook 200 OK -> empty UI + observability signal matrix.
Критерий готовности: другой разработчик может по вашему runbook локализовать, это бизнес-пустота, контракт API, клиентский mapping, feature flag или backend degradation.
3. API error contract для клиента
Связка: Node q-7, Nest q-19, Senior q-10.
Что сделать:
- Подготовьте error envelope для validation, auth, domain conflict, dependency timeout и unknown error.
- Для каждого класса укажите
public code, HTTP meaning, safemessage,details,requestId,retryable, UI action. - Отдельно выпишите, что нельзя отдавать клиенту: stack trace, SQL, raw provider payload, token details, private data.
Артефакт: error envelope compatibility table.
Критерий готовности: вы объясняете error contract как стабильный API для UX и диагностики, а не как случайный текст ошибки.
Связь с треками и вопросами
- Для browser boundary: Junior JS q-18..q-20 и строка
Browser storage and CORSв Practice Bridges. - Для frontend reliability: Senior q-6 и Senior q-10.
- Для backend-facing contract: Node q-7, Node q-10, Nest q-19.
- Повторение: завтра заново разберите один запрос без подсказок и обновите runbook, если в нем не хватает шага.
Критерий готовности
Ready:
вы даете структурный ответ симптом -> гипотеза -> проверка -> evidence -> fix -> метрика/alert,
а не просто перечисляете HTTP/CORS термины.
Partial:
вы понимаете Network panel, но не связываете client symptom с API contract, logs, traceId и user impact.
Not ready:
вы видите 200 OK и прекращаете диагностику, хотя UI state, payload shape или client mapping могут быть сломаны.
Артефакты после модуля
- Network diagnosis table для 3 запросов.
- CORS preflight policy table для
dev/stage/prod. - Runbook
200 OK -> empty UI. - Observability signal matrix для
search empty results,login failure,checkout submit,slow product page. - Error envelope compatibility table для клиентских ошибок.