01Безопасность
Дизайн 2FA
TOTP / SMS / passkey: enrollment UX, recovery codes, lost-device flow, обязательность по ролям.
Спроектируй 2FA для {{product}}. Сегменты: {{user_segments}}.
Шаг 1: выбор факторов
Рекомендованный набор (в порядке приоритета)
- Passkey (WebAuthn) — лучший UX и безопасность, default где можно
- TOTP (Google Authenticator, 1Password, Authy) — отлично, кросс-платформенно
- Recovery codes — backup-фактор, всегда вместе с любым основным
- Security key (Yubikey) — для enterprise / admin
- SMS — только как fallback, никогда как единственный метод
Что НЕ использовать
- Email как 2-й фактор (это уже 1-й — пароль идёт через email reset)
- Push без подтверждения номера (MFA fatigue → юзер просто approve)
- Только SMS (SIM-swap)
Шаг 2: обязательность по сегментам
| Сегмент | Политика |
|---|---|
| Admin / staff | Mandatory, passkey или TOTP, без SMS |
| Enterprise | Mandatory (через SSO/SAML или 2FA) |
| Paid customers | Strongly recommended, prompt при login |
| Free | Optional, ненавязчиво |
| После suspicious activity | Forced enrollment до access |
Шаг 3: enrollment UX
Точка входа
- Settings → Security → «Add 2FA»
- Post-signup nudge для paid: «Защитите аккаунт за 60 секунд»
- Forced для admin при первом логине
Поток (TOTP пример)
- Введение: «Что это и зачем» (2-3 строки, не учебник)
- Выбор метода: карточки с tradeoffs
- QR-код + ручной ключ для копирования
- Подтверждение: ввести код из приложения
- Recovery codes — обязательный экран, заставь скачать/распечатать
- Confirmation: 2FA активна, что изменится при следующем логине
Passkey enrollment
- «Use this device as your key» — кнопка
- Native browser prompt (Touch ID / Windows Hello)
- Confirm + recovery codes
- Опция: add another device
Шаг 4: логин с 2FA
Стандартный
- Email + password → success
- Prompt: «Enter 6-digit code» / «Use passkey»
- Опция «Trust this device for 30 days» (cookie + binding, не просто localStorage)
- Success → app
Edge cases
- Wrong code 5 раз → temporary lockout (15 мин)
- Lost device → ссылка «Use recovery code» прямо на экране
- Recovery code исчерпан → support contact + identity verification flow
Шаг 5: recovery flow (самое важное)
Когда recovery codes использованы
- Принять, отметить код как used (single-use!)
- После логина — predзагрузить генерацию новых
- Опция перенастроить 2FA
Когда нет ни кодов, ни устройства
- Account recovery через email + cooling-off (24-72ч)
- Identity verification: фото документа / known device / billing info / human review
- НЕ давать мгновенный bypass через email (это убивает 2FA)
- Уведомить юзера во ВСЕ доступные каналы о попытке recovery
Шаг 6: уведомления
Обязательные emails
- 2FA enabled — confirmation
- 2FA disabled — alert (даже если сам отключил, в случае хайджека ловим)
- New 2FA method added
- Recovery codes regenerated
- Login from new device
- Account recovery initiated
Шаг 7: технические требования
TOTP
- RFC 6238, SHA-1, 30-second window, 6-digit
- Accept ±1 window (clock skew)
- Хранить secret encrypted at rest
- Никогда не показывать secret после enrollment (только при первом сетапе)
Passkey
- WebAuthn API, prefer platform authenticator
- Origin binding (не работает за пределами твоего домена)
- Хранить credential ID + public key
Recovery codes
- 8-10 кодов, формат XXXX-XXXX
- Bcrypt/argon2 хеши в БД (одноразовые)
- Показывать ОДИН раз при генерации
SMS (если все же)
- Rate limit: 3 попытки на номер за час
- Timer 60s между запросами
- Verify number ДО включения
Шаг 8: метрики
- Enrollment rate по сегментам (taргет: 80%+ для paid)
- Adoption по методам (passkey vs TOTP vs SMS)
- Login success rate с 2FA (норма >95%)
- Lockout rate (норма <2%)
- Recovery flow usage (норма <5% активаций)
- Account recovery успех vs отказ
- Time-to-second-factor (UX-метрика)
Формат вывода
- Policy: кто/что/когда обязан
- Wireframes для enrollment (TOTP + passkey), login, recovery
- Email templates (минимум 5)
- Backend spec: эндпоинты, эрроры, rate limits
- Список метрик и алертов
Анти-паттерны
- ❌ SMS как единственный метод (SIM-swap)
- ❌ Email-based код как 2FA (один фактор)
- ❌ Recovery бессилен → юзеры теряют аккаунт навсегда
- ❌ Recovery мгновенный через email → 2FA бесполезна
- ❌ Force 2FA сразу для free без объяснения — массовый отвал
- ❌ Push notifications без challenge (MFA fatigue → юзеры approve фишинговые попытки)
- ❌ Не уведомлять о enable/disable 2FA — нет канала ловли хайджеков
- ❌ Recovery codes показаны несколько раз — теряют ценность
- ❌ 2FA для admin опциональна (это первая мишень)
- ❌ Один прокси-метод TOTP без backup — потерянный телефон = потерянный аккаунт
Похожие промты
site / security
Content Security Policy и security headers
CSP, HSTS, X-Frame, Permissions-Policy — закрыть основные классы атак за один проход.
securitycspheaders
Открыть
Продвинутый30-60 мин
site / security
Управление секретами
Где хранить, как ротировать, как обнаружить утечку.
securitysecrets
Открыть
Средний30-60 мин
site / security
Аутентификация и rate limiting
Защита логина, реги, восстановления пароля от brute force.
securityauthrate-limit
Открыть
Продвинутый30-60 мин