Безопасность и хранение
Для чего модуль
Научиться принимать решения по безопасности не по мифам, а через модель угроз: какие активы защищаем, от кого защищаем, и какой ценой.
Результат после прохождения
- Вы уверенно различаете 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 и показать, какие риски этим реально закрываются.
Практика
- Составьте threat model для login/logout/refresh flow.
- Подготовьте таблицу: где хранить токены для 3 типов приложений (SPA, BFF, mobile web).
- Опишите единый error-contract для auth-ошибок и правила логирования без секретов.
- Проведите tabletop-упражнение по инциденту «утечка refresh token».
- Закрепите материал в Node.js вопросах и NestJS вопросах.
- Проверьте login/refresh/logout flow в Песочнице и отметьте точки риска
XSS/CSRF.
Связь с треками и вопросами
- Треки: Junior трек, Middle трек, Senior трек.
- Вопросы: Junior JavaScript, Senior Frontend, Playbook.
- Повторение: 3-5 вопросов без подсказок -> сверка с модулем -> повтор через 24 часа.
Критерий готовности
Вы объясняете security-решения через модель угроз, эксплуатацию и конкретные защитные механизмы, а не через общие фразы.
Артефакты после модуля
- Threat model документация для auth-потока.
- Security checklist релиза (с ролями и критериями прохождения).
- Incident playbook для сценария утечки токена/ключа.
- Набор из 8 сильных ответов на auth/security вопросы.