Когда ID-провайдер перестаёт окупаться
Управляемый провайдер стоит денег за пользователя, самохостинг — за инженера. Где эти линии пересекаются, обычно никто не считает, а блокировка не в протоколе.
Идентификация — компонент, который дешевле всего подключить и дороже всего покинуть. Решение обычно принимают за один вечер, в самом начале, тот, кто поднимает первое окружение. То есть ровно в момент, когда вариант с оплатой за пользователя не стоит ничего, потому что пользователей нет.
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, записанный до запуска и подтверждённый провайдером, а не предположенный.
- Что происходит, пока идентификация лежит, и пробовал ли это кто-нибудь.
- Кто обновляет эту штуку, как часто и в какое окно.
Защитить можно любой из двух ответов. «Так дешевле» без второй колонки и «потом переедем» без пути выгрузки — нельзя.