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 после релизов.