OGOwnGate

Backchannel Logout на пальцах: как выбить сессии из всех приложений разом

Нажать «Выйти» на шлюзе и надеяться, что браузер закроет сессии во всех тридцати открытых вкладках — опасная наивность. Разбираем спецификацию OIDC 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 превращает разрозненный зоопарк веб-сервисов в монолитный контур безопасности, где выход означает действительно полный и бесповоротный выход.

← Все статьи