Безопасность и хранение
Для чего модуль
Научиться принимать решения по безопасности не по мифам, а через модель угроз: какие активы защищаем, от кого защищаем, и какой ценой.
Результат после прохождения
- Вы уверенно различаете AuthN, AuthZ, session management и token lifecycle.
- Вы проектируете хранение токенов с учетом XSS/CSRF-рисков, а не по «популярному совету».
- Вы умеете объяснить и внедрить базовый security baseline для frontend/fullstack продукта.
- Вы знаете, что делать в первый час после security-инцидента.
Термины и аббревиатуры
| Термин | Коротко |
|---|---|
AuthN | Проверка личности |
AuthZ | Проверка прав |
JWT | Подписанный токен |
BFF | Backend for Frontend |
XSS | Внедрение скрипта |
CSRF | Подделка запроса |
Фокус по грейдам
Junior: понимать базовые механики и объяснять их простыми примерами.Middle: применять тему в продуктовых сценариях с учетом рисков и ограничений.Senior: управлять архитектурными trade-offs, метриками и эволюцией решения.
Как работать с модулем
- Каждый урок проходите через призму одного продукта (например, личный кабинет, админка, B2C SPA).
- На каждую тему фиксируйте: решение, какой риск закрывает, какие новые риски создает.
- После каждого урока обновляйте threat model и checklist релиза.
Программа модуля
Урок 1. Auth-модели
Цель: выбирать auth-подход не по тренду, а по требованиям продукта и рискам.
Что нужно различать
- AuthN: кто пользователь.
- AuthZ: что ему разрешено.
- Session management: как долго и где живет авторизованное состояние.
Session vs JWT vs BFF
Session (stateful):
- Плюсы: централизованная инвалидция, проще revoke.
- Минусы: хранение сессионного состояния на сервере/в кэше.
JWT (часто stateless):
- Плюсы: масштабирование без общего session store.
- Минусы: revoke сложнее, ошибки в lifecycle токенов стоят дорого.
BFF:
- Плюсы: токены скрыты от браузера, лучше контроль boundary.
- Минусы: добавляется отдельный слой и операционная сложность.
Access/Refresh lifecycle
Базовая схема:
- Короткоживущий
access token. - Долгоживущий
refresh tokenс ротацией. - Явные правила revoke при logout, compromise, смене пароля.
Cookie-атрибуты
HttpOnly: JS не читает cookie.Secure: только HTTPS.SameSite: базовая защита от CSRF для cookie-сценариев.
Set-Cookie: refresh_token=...; HttpOnly; Secure; SameSite=Lax; Path=/auth/refresh
Где ломается в проде
- Нет централизованной стратегии revoke.
- Access token живет слишком долго «ради удобства».
- Logout удаляет только UI-state, но не серверную сессию.
Мини-задача (обязательная)
Сравните два сценария: SPA без BFF и SPA + BFF. Для каждого опишите: где хранится auth state, как делается refresh, как выполняется logout/revoke.
Что спросит интервьюер: когда cookie-based подход безопаснее, а когда удобнее токены в header.
Критерий готовности по уроку: вы можете выбрать auth-модель под конкретный продукт и защитить выбор через риски и эксплуатационные ограничения.
Урок 2. Хранение и клиентская безопасность
Цель: понимать, где и почему происходят утечки токенов на клиенте.
Storage options и риски
localStorage:
- Удобен для чтения из JS.
- Уязвим при XSS: украсть токен просто.
sessionStorage:
- Живет в пределах вкладки.
- Проблема XSS остается.
HttpOnly cookie:
- JS не читает токен.
- Требует правильной защиты от CSRF.
XSS как главный практический риск
Если в приложении XSS, злоумышленник может:
- Читать токены из JS-доступного хранилища.
- Вызывать API от лица пользователя.
- Экспортировать чувствительные данные.
Минимальный baseline:
- Не рендерить непроверенный HTML.
- CSP + безопасные шаблоны рендера.
- Никаких секретов в client bundle и console logs.
Data minimization и логирование
- Не логируйте токены, session id, PII в открытом виде.
- Маскируйте чувствительные поля.
- В error-логах храните
traceId, но не секреты.
Где ломается в проде
- Refresh token кладут в
localStorage«временно», и это остается навсегда. - Логи фронта уходят во внешний сервис с чувствительными данными.
- В CSP оставляют слишком широкие
script-src.
Мини-задача (обязательная)
Сделайте таблицу хранения секретов для вашего проекта: что хранится, где хранится, почему именно так, какой риск и как он смягчается.
Что спросит интервьюер:
почему хранить refresh token в localStorage опасно.
Критерий готовности по уроку: вы можете обосновать storage-решение с учетом XSS/CSRF/операционки, а не только удобства разработки.
Урок 3. CSRF, CORS и защита API
Цель: отделять браузерные ограничения от контроля доступа и защиты бизнес-операций.
Что CORS не решает
CORS управляет тем, может ли браузер читать ответ cross-origin.
Это не авторизация и не полноценная защита API.
CSRF mitigation
Для cookie-based auth защищайтесь комбинацией:
SameSite.- CSRF token (synchronizer/double-submit).
- Проверка Origin/Referer для критичных mutation endpoint.
Защита mutation API
Минимальный baseline:
- AuthZ на сервере для каждого действия.
- Rate limiting и anti-abuse для чувствительных endpoint.
- Idempotency key для критичных повторяемых операций (платежи, заказы).
Пример CORS-конфига (идея)
Access-Control-Allow-Origin: https://app.example.com
Access-Control-Allow-Credentials: true
Access-Control-Allow-Methods: GET,POST,PUT,PATCH,DELETE,OPTIONS
Vary: Origin
Важно:
при Allow-Credentials: true нельзя использовать Allow-Origin: *.
Где ломается в проде
- Включают
*«на время отладки» и забывают убрать. - CORS воспринимают как замену серверной AuthZ.
- Нет rate limiting для login/reset endpoints.
Мини-задача (обязательная)
Опишите схему защиты для двух endpoint:
POST /auth/login и POST /payments/confirm.
Добавьте: auth, csrf, rate limiting, audit logging, idempotency.
Что спросит интервьюер:
почему «включить * в CORS» не решает безопасность и часто вредит.
Критерий готовности по уроку: вы можете спроектировать защиту API так, чтобы она покрывала и браузерные, и серверные векторы атак.
Урок 4. Безопасные практики релиза
Цель: превратить безопасность в процесс команды, а не в разовую проверку.
Security baseline перед релизом
- Secrets только через защищенные env/secret manager.
- Dependency audit и фиксация критичных уязвимостей.
- Проверка CSP/headers (
X-Frame-Options,Referrer-Policy,HSTS). - Проверка auth flows: login, refresh, logout, revoke.
Incident response: первый час
- Классифицировать инцидент: что утекло, кто затронут, текущий радиус поражения.
- Снизить ущерб: revoke токенов/ключей, ограничение risky endpoint.
- Собрать фактологию: таймлайн, trace id, affected services.
- Коммуникация: внутренняя и внешняя, без домыслов.
После инцидента
- Postmortem: root cause + corrective actions + preventive actions.
- Обновление чеклистов и автоматизированных проверок.
- Проверка, что риск реально снижен, а не «документация обновлена».
Мини-задача (обязательная)
Сделайте pre-release security checklist (минимум 15 пунктов) и incident-playbook (первый час). Привяжите каждый пункт к роли: frontend, backend, devops, security.
Что спросит интервьюер: какие 3 шага вы сделаете в первый час после security-инцидента.
Критерий готовности по уроку: вы можете провести релиз по security-checklist и показать, какие риски этим реально закрываются.
Практика
1. Threat model для auth/session flow
Связка: Senior q-11, Node q-14, Nest q-7.
Что сделать:
- Опишите flow
login -> refresh -> logout -> revokeдля SPA, BFF и mobile web. - Заполните таблицу
surface -> asset -> attacker action -> client control -> server control -> evidence -> owner. - Отдельно отметьте XSS, CSRF, token theft, token replay, session fixation и missing AuthZ.
Артефакт: frontend/backend threat model для auth flow.
Критерий готовности: вы называете, что контролирует frontend, что обязан проверять server, и где frontend validation не является security boundary.
2. Storage и token policy
Связка: Junior JS q-18,
Senior q-11,
строка Browser storage and CORS в Practice Bridges.
Что сделать:
- Заполните таблицу для
theme,draft form,access token,refresh token,csrf token:storage -> lifetime -> JS-readable? -> XSS risk -> CSRF risk -> mitigation. - Для SPA, BFF и mobile web выберите session strategy и назовите trade-off.
- Проверьте login/refresh/logout flow как free-practice: где токен появляется, где исчезает, что логируется, что не логируется.
Артефакт: storage/token policy table.
Критерий готовности: вы не отвечаете "localStorage плохо, cookie хорошо" шаблоном, а объясняете threat model, lifetime, CSRF controls и server-side checks.
3. Auth error contract и safe logging
Связка: Node q-7, Node q-10, Nest q-19.
Что сделать:
- Опишите public auth errors:
UNAUTHENTICATED,FORBIDDEN,SESSION_EXPIRED,TOKEN_REVOKED,RATE_LIMITED. - Для каждого укажите HTTP meaning, safe message, UI action, retryability,
requestIdand logs. - Составьте
do not logсписок: raw token, cookie, password, provider payload, private user data, stack trace in client response.
Артефакт: auth error contract + safe logging checklist.
Критерий готовности: вы можете показать пользователю понятное действие и одновременно не раскрыть детали, полезные атакующему.
4. Incident tabletop: утечка refresh token
Связка: Senior q-12, Senior q-13, Node q-9.
Что сделать:
- Проведите tabletop на первый час инцидента: detect, scope, contain, revoke, communicate, monitor.
- Привяжите действия к ролям: frontend, backend, devops, security, support/product.
- Добавьте stop conditions: когда отключить endpoint, включить rate limit, отозвать токены, остановить rollout.
Артефакт: incident playbook refresh token leak: first hour.
Критерий готовности: вы не говорите "пофиксим и напишем postmortem", а показываете порядок снижения ущерба и доказательство, что риск реально закрыт.
Связь с треками и вопросами
- Browser/session basics: Junior JS q-18..q-20.
- Frontend security: Senior q-11, Senior q-12, Senior q-13.
- Backend/auth boundary: Node q-7, Node q-9, Node q-10, Node q-14, Nest q-7, Nest q-19.
- Повторение: через 24 часа без подсказок восстановите threat model и storage/token policy, затем проверьте себя по Playbook.
Критерий готовности
Ready: вы объясняете security-решения через threat model, exploit path, client/server controls, logging policy и incident response.
Partial: вы знаете XSS/CSRF/JWT определения, но не можете выбрать storage strategy или показать, где server обязан проверить AuthZ.
Not ready: вы предлагаете "спрятать кнопку", "включить CORS", "положить токен куда удобнее" или логировать raw token/debug payload.
Артефакты после модуля
- Threat model для
login -> refresh -> logout -> revoke. - Storage/token policy table для SPA, BFF и mobile web.
- Auth error contract + safe logging checklist.
- Pre-release security checklist с ролями и pass/fail criteria.
- Incident playbook
refresh token leak: first hour.