АвторизацияБезопасность

Своя авторизация или готовый сервис: что на самом деле придётся сделать

5 мин чтения

Форма входа это два поля и кнопка. Но за ней прячется много работы. Ниже список этой работы и ответ на вопрос: писать самому или взять готовое.

Что входит в авторизацию

Хранение паролей

Пароль хранится только в виде хеша медленного алгоритма: Argon2id или bcrypt. Быстрые хеши вроде SHA-256 перебираются на видеокарте миллиардами вариантов в секунду. Соль у каждого пароля своя, современные алгоритмы добавляют её сами.

Подтверждение почты

Без подтверждения в базе копятся чужие и выдуманные адреса, а письма сброса пароля уходят не тем людям. Ссылка подтверждения содержит случайный токен с ограниченным сроком жизни. В базе хранится хеш токена, а не он сам.

Сброс пароля

Самый частый путь взлома после подбора. Правила:

  • токен одноразовый и живёт 15–60 минут;
  • ответ одинаковый для существующего и несуществующего email, иначе форма сброса превращается в проверку «зарегистрирован ли адрес»;
  • после смены пароля завершаются все остальные сессии.

Сессии и токены

Два подхода: сессия в базе с идентификатором в cookie или JWT. С сессией проще отзыв доступа. С JWT нужна пара токенов: короткий токен доступа и долгий токен обновления с ротацией, иначе украденный токен работает до истечения срока. Cookie выставляются с флагами HttpOnly, Secure и SameSite.

Защита от перебора

Ограничение попыток входа по аккаунту и по IP, задержка после неудачных попыток, капча после нескольких ошибок. Без этого любая форма входа открыта для подбора по базам утёкших паролей.

Двухфакторный вход

Коды из приложения (TOTP), резервные коды на случай потери телефона, сброс второго фактора через поддержку. Для админок и B2B это требование, а не опция.

Вход через внешние сервисы

Каждый провайдер со своими особенностями: у VK ID обязательный device_id, у Яндекса нестандартные поля, Telegram не передаёт email. Отдельная задача: связать вход через Яндекс и вход по паролю с одним аккаунтом, если email совпадает.

Письма

Подтверждение, сброс пароля, уведомление о входе с нового устройства. Нужен SMTP и настройка SPF, DKIM и DMARC для домена, иначе письма уходят в спам.

Закон

Email, телефон и имя пользователя это персональные данные. По 152-ФЗ данные граждан России при сборе записываются в базы на территории России, а об обработке персональных данных уведомляется Роскомнадзор. Сервис авторизации за рубежом нарушает первое требование.

Сколько это стоит

Каждый пункт выше это код, тесты и поддержка. Типичный объём для своей реализации с нуля: несколько недель работы опытного разработчика, плюс постоянное сопровождение: обновления зависимостей, реакция на уязвимости, новые требования провайдеров.

Когда хватит библиотеки

Своя авторизация на готовой библиотеке оправдана, если:

  • приложение одно;
  • нужен вход по email и паролю, плюс Google или GitHub;
  • бэкенд свой, и фреймворк уже содержит авторизацию.

Подходящие варианты: встроенная авторизация Django, Laravel (Fortify, Breeze), Rails, а для JavaScript библиотеки Better Auth или Auth.js. Они закрывают хеширование, сессии, сброс пароля и защиту от перебора. Если бэкендом служит Supabase или PocketBase, авторизация уже встроена в них.

Когда проще готовый сервис

  • Нужны Яндекс ID, VK ID и Telegram, и не хочется разбираться с отличиями каждого.
  • Несколько приложений с одними пользователями: сайт, мобильное приложение, админка.
  • Нет бэкенда: фронтенд или мобильное приложение без своего сервера.
  • Нужна готовая страница входа, двухфакторный вход и управление пользователями без своего кода.

Важный критерий при выборе сервиса: возможность уйти. Сервис на открытом стандарте (OpenID Connect) и открытом движке позволяет выгрузить пользователей и перенести их к себе. Закрытый сервис с собственным SDK привязывает приложение к себе надолго.

Чек-лист для любой реализации

  1. Пароли хешируются Argon2id или bcrypt.
  2. Токены подтверждения и сброса одноразовые, с коротким сроком, в базе хранятся хеши.
  3. Сброс пароля не раскрывает, зарегистрирован ли адрес.
  4. Число попыток входа ограничено.
  5. Cookie с флагами HttpOnly, Secure, SameSite.
  6. После смены пароля завершаются все сессии.
  7. Письма проходят SPF, DKIM и DMARC.
  8. Данные пользователей хранятся в России, уведомление в Роскомнадзор подано.
Читать дальше