Темы
Архитектура · Идентификация · Keycloak · AWS

Идентификация — компонент, который дешевле всего подключить и дороже всего покинуть. Решение обычно принимают за один вечер, в самом начале, тот, кто поднимает первое окружение. То есть ровно в момент, когда вариант с оплатой за пользователя не стоит ничего, потому что пользователей нет.

00 / Две разные формы затрат

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

У большинства B2B-продуктов растущая линия так и не становится крутой: несколько тысяч учётных записей — мелочь на фоне стоимости эксплуатации собственного сервера аутентификации, и решение даже не близкое. У потребительского продукта, рассчитанного на масштаб, линии пересекаются. Вопрос только в том, где именно и переживёте ли вы ошибку.

01 / Считайте по ценнику на сегодня, а не по памяти

Меняются и ставки, и сами модели. Заранее стоит знать форму ловушек. Со страницы цен Amazon Cognito, прочитанной 2026-10-23:

  • три тарифных уровня, и новый пул по умолчанию попадает в средний — Essentials, $0.015 за MAU сверх бесплатного объёма;
  • бесплатные 10 000 MAU в месяц действуют на Lite и Essentials. У Plus бесплатного объёма нет вовсе;
  • у федеративных пользователей SAML/OIDC своя квота — 50 MAU в месяц, независимо от уровня;
  • пулы, созданные 22 ноября 2024 года или раньше, сохраняют прежний больший объём в 50 000 MAU. То есть цена зависит не только от выбранного уровня, но и от того, когда создан ресурс.

Auth0 тоже считает B2C-планы по активным пользователям, с бесплатным объёмом в десятки тысяч MAU на момент написания. Но число, которое важно продукту, рассчитанному на масштаб, на странице отсутствует: верхний план не опубликован, а запрашивается. Если план — вырасти за пределы опубликованных уровней, стоимость управляемого варианта выше этой точки нельзя посмотреть. Её придётся обсуждать позже, из положения, в котором уходить уже дорого.

Заметить стоит именно эту асимметрию, а не ставку за MAU.

02 / Что на самом деле стоит в колонке самохостинга

Оценка, которая ставит ставку за MAU против «инстанса и базы», — не оценка. Это аргумент, из которого убрали неудобную половину. Честная колонка содержит:

  • Доступность. Вход лежит на критическом пути всего, включая сессии, которые истекают прямо во время работы. Сервер идентификации без плана отказоустойчивости — это единая точка отказа, внесённая в систему, у которой её, возможно, больше нигде и не было.
  • Обновления по чужому расписанию. CVE в сервере аутентификации не кладётся в бэклог.
  • Ротация ключей, инвалидация сессий и проверенная процедура «отозвать всё, прямо сейчас».
  • Резервные копии хранилища с хешами паролей — хотя бы раз восстановленные тем, кто записал, сколько это заняло.
  • Восстановление доступа и доставляемость писем — неприглядная половина потребительской идентификации и та самая, с которой пользователи действительно сталкиваются.
  • Злоупотребления: регистрации ботами, перебор украденных паролей, лимиты на аккаунт и на адрес.
  • Инженер, который знает, как это устроено — и второй, на время отпуска первого.

В пересчёте на полную стоимость часа эта колонка редко выходит маленькой. Она же почти целиком постоянная: та же работа обслуживает десять тысяч пользователей и десять миллионов. Именно поэтому линии вообще пересекаются.

03 / Блокировка не в протоколе

«Потом переедем, там же везде OIDC» верно наполовину. Переносим протокол. Хранилище пользователей — нет.

  • Идентификаторы субъектов меняются. Всё, что сохранило sub как личность пользователя, придётся переотображать, включая строки в вашей собственной базе.
  • Хеши паролей могут не выгружаться. Там, где провайдер их не отдаёт, миграция означает, что пароль сбрасывают все пользователи. Это продуктовое событие, а не выкатка.
  • Привязки MFA, связанные соцаккаунты и refresh-токены не переносятся.
  • Всё, что доверяет издателю токена, прибито к нему: авторайзеры шлюза, мобильные сборки, которые уже у людей, интеграции партнёров.

Поэтому вопрос не только в том, какой вариант дешевле, но и в том, в какую сторону дешевле ошибиться. Уйти от самохостинга — миграция, которую можно спланировать, потому что хеши у вас. Уйти от управляемого провайдера — не факт. Эта асимметрия относится к решению и обычно из него выпадает.

04 / Иногда аргумент вообще не про деньги

Где живёт вход — вопрос архитектуры раньше, чем вопрос цены. Если пользователей пускает один продукт, идентификация может жить внутри него. Если несколько продуктов должны делить один аккаунт, идентификация становится компонентом платформы: она живёт вне любого приложения, на собственном домене, со своим жизненным циклом. Перенести её туда позже значит поменять каждый redirect URI и каждого издателя токена из того, что уже выпущено.

В потребительском продукте с AI-чатом, описанном отдельным кейсом, она там и жила: Keycloak на собственном домене, задуманный как единая точка входа для планируемого семейства AI-приложений с общей базой. Cognito и Auth0 оба считают по пользователям, продукт рассчитывали на большую аудиторию, и росла бы вместе с ней именно линия оплаты за пользователя. На том проекте более широкая платформа осталась проектным замыслом, а не выпущенной системой, и это тоже часть вывода. Аргумент про платформу — ставка на дорожную карту, а дорожные карты меняются.

05 / Что стоит решить до того, как соглашаться

  • Три сценария по числу пользователей — запуск, план и цифра, которую вы сочли бы успехом, — посчитанные с обеих сторон, по актуальному ценнику, а не по статье в блоге.
  • Часы инженеров в колонке самохостинга, по полной стоимости, вместе с дежурствами.
  • Путь выгрузки пользователей, хешей и привязок MFA, записанный до запуска и подтверждённый провайдером, а не предположенный.
  • Что происходит, пока идентификация лежит, и пробовал ли это кто-нибудь.
  • Кто обновляет эту штуку, как часто и в какое окно.

Защитить можно любой из двух ответов. «Так дешевле» без второй колонки и «потом переедем» без пути выгрузки — нельзя.