Backchannel Logout на пальцах: как выбить сессии из всех приложений разом
Нажать «Выйти» на шлюзе и надеяться, что браузер закроет сессии во всех тридцати открытых вкладках — опасная наивность. Разбираем спецификацию OIDC Backchannel Logout и то, как сервер-серверные запросы моментально тушат доступ везде.

Представьте картину: инженер уходит на обед из коворкинга, благоразумно нажимает кнопку «Выйти» в личном кабинете корпоративного портала, захлопывает ноутбук и уходит.
Он уверен, что сессия завершена.
Через пять минут к его столику подходит человек с недобрыми намерениями, открывает ноутбук, вбивает в адресную строку https://gitlab.company.local — и браузер радостно открывает дашборд с закрытыми репозиториями без малейшего запроса пароля. В соседней вкладке точно так же активна Grafana, а в третьей — корпоративное облако с документами.
Как такое возможно, если человек своими руками нажал «Выход»?
Добро пожаловать в суровый мир распределённой аутентификации, где корректно разлогинить пользователя во всех системах — задача едва ли не более сложная, чем залогинить его.
---
Почему традиционный логаут в браузере мёртв
Исторически существовало два способа завершить Single Sign-On сессию через браузер (так называемый Frontchannel):
1. Цепочка HTTP-редиректов: Шлюз перенаправляет браузер пользователя по очереди на 10 разных сервисов: auth -> gitlab/logout -> grafana/logout -> nextcloud/logout -> auth.
*В реальности:* если у вас 10 сервисов, пользователь просто закрывает вкладку на втором редиректе, не дожидаясь конца карусели.
2. Скрытые iframe: Шлюз отрисовывает страницу со скрытыми фреймами <iframe src="https://service/logout">.
*В реальности:* современные браузеры (Safari с ITP, Chrome с Privacy Sandbox, Firefox) по умолчанию блокируют сторонние куки (Third-Party Cookies) внутри iframe. Запрос на логаут прилетает в сервис без куки пользователя, сервис не понимает, чью сессию надо удалить, и игнорирует запрос.
В обоих случаях иллюзия выхода остаётся только на экране шлюза, а все открытые приложения продолжают считать сессию активной.
---
Backchannel Logout: когда сервер говорит с сервером напрямую
Чтобы решить эту проблему раз и навсегда, консорциум OpenID разработал спецификацию OIDC Back-Channel Logout 1.0.
Главная идея: браузер пользователя вообще исключается из процесса завершения сессий.
Вместо того чтобы надеяться на редиректы и куки на клиенте, шлюз авторизации берёт дело в свои руки и общается с серверами приложений напрямую по бэкенд-каналам:
[Пользователь] ──► Нажал «Выйти» (или заблокирован админом)
│
▼
[Шлюз OwnGate]
│ │ │
(Прямой POST)│ │ │(Прямой POST)
▼ ▼ ▼
[GitLab] [Grafana] [Nextcloud]
Как устроен Logout Token
Когда шлюз OwnGate инициирует завершение сессии, он отправляет на зарегистрированный эндпоинт каждого приложения (/oauth2/backchannel-logout) специальный криптографический JWT-токен — Logout Token:
{
"iss": "https://auth.company.local",
"sub": "user_849201",
"aud": "gitlab-production",
"iat": 1789074200,
"jti": "e4b901a8-2041-48cf",
"sid": "sess_91823091823",
"events": {
"http://schemas.openid.net/event/backchannel-logout": {}
}
}
Обратите внимание на поле events. Это стандартный маркер спецификации. Также токен содержит:
sub: неизменяемый идентификатор пользователя в каталоге;sid: идентификатор конкретной сессии, которую требуется убить;- Цифровую подпись шлюза, гарантирующую подлинность команды.
Получив такой токен, бэкенд приложения (GitLab, Grafana или корпоративный бэкенд):
1. Проверяет подпись токена публичным ключом шлюза (JWKS);
2. Находит в своей базе сессий или Redis запись с соответствующим sid или sub;
3. Физически удаляет сессию из памяти.
---
Что это даёт на практике
1. Мгновенный результат. Сисадмин нажал кнопку в панели OwnGate — через 200 миллисекунд шлюз разослал параллельные HTTP-запросы во все сервисы. Сессии сгорели одновременно.
2. Работает при выключенном ноутбуке. Сотрудник потерял телефон или рабочий ноутбук? Вам не нужно ждать, пока устройство выйдет в сеть. Сессии на серверах уже аннулированы. Следующий же запрос с украденного устройства наткнётся на ответ 401 Unauthorized.
3. Устойчивость к блокировкам браузера. Никакие блокировщики рекламы, политики SameSite-кук или приватные вкладки не могут помешать серверу шлюза постучаться на сервер приложения.
Настоящий Single Sign-On не имеет права существовать без честного Single Sign-Out. Реализация Backchannel Logout в OwnGate превращает разрозненный зоопарк веб-сервисов в монолитный контур безопасности, где выход означает действительно полный и бесповоротный выход.