В каждом моём плане проекта есть пункт: «Аутентификация — 2 дня».
В каждом ретроспективе проекта есть заметка: «Аутентификация заняла 2 недели».
Я создавал системы аутентификации 4 раза. Каждый раз я недооцениваю её. Вот почему и что я в итоге понял.
Айсберг
Что вы думаете об аутентификации:
- Форма входа
- Сохранить токен
- Проверить, действителен ли токен
- Готово
Что такое аутентификация на самом деле:
- Форма входа (email/пароль + OAuth + magic ссылки + MFA?)
- Хеширование паролей (bcrypt, argon2, какой фактор стоимости?)
- Управление сессиями (JWT vs куки сессии vs оба?)
- Обновление токена (тихое обновление, ротация, отзыв)
- Защита от CSRF (same-site куки, double-submit токен)
- Ограничение скорости (на вход, на регистрацию, на сброс пароля)
- Процесс сброса пароля (генерация токена, срок действия, одноразовое использование)
- Подтверждение email (токен, логика повторной отправки, что если email изменён?)
- Блокировка учётной записи (сколько попыток? Какой процесс разблокировки?)
- Управление доступом на основе ролей (администратор vs пользователь vs модератор)
- Управление API-ключами (для программного доступа)
- Аннулирование сессии при смене пароля
- «Запомнить меня» vs «только эта сессия»
- Уведомление о входе с нового устройства
- Аудит логов (кто вошёл, когда, откуда)
Это 15+ функций. По 1-2 дня на каждую — получается месяц.
Что я делаю сейчас: Использую Supabase Auth и расширяю
После того как я дважды создавал собственную аутентификацию и оба раза ненавидел свою жизнь, я теперь начинаю с Supabase Auth (или Clerk, или Auth.js). Она обрабатывает:
- Email/пароль с bcrypt
- OAuth провайдеры (Google, GitHub, Discord)
- JWT токены с обновлением
- Подтверждение email
- Сброс пароля
- Управление сессиями
- Ограничение скорости
Это 80% аутентификации, за которую отвечают люди, думающие об аутентификации полный рабочий день. Я сосредотачиваюсь на 20%, которые специфичны для моего приложения:
\\
