OIDC против SAML: почему монструозный XML из нулевых пора похоронить
Парсить мегабайты XML с каноникализацией и бояться XML Signature Wrapping — сомнительное удовольствие для инженера в 2026 году. Сравниваем SAML 2.0 и OpenID Connect на практике и объясняем, почему переход на JSON и JWT спасает проект.

Если вы когда-нибудь в пятницу вечером пытались подружить корпоративный сервис с корпоративным IdP по протоколу SAML 2.0, вы наверняка знаете этот специфический холодок внутри.
Вы смотрите в дампы трафика, где летает чудовищная простыня XML на 12 килобайт в Base64. Внутри — тридцать вложенных тегов <saml2p:Response>, пространства имён с URL-адресами несуществующих стандартов консорциума OASIS, блок <ds:X509Certificate> на пол-экрана и ошибка:
Signature verification failed: XML canonicalization error.
Что пошло не так? Пробел. Один невидимый пробел или символ переноса строки в середине файла сломал алгоритм каноникализации C14N, и подпись превратилась в тыкву.
Добро пожаловать в прекрасный мир SAML 2.0 — стандарта, который был утверждён в марте 2005 года, за два года до выхода первого iPhone.
Давайте разберёмся, почему монструозный XML из эпохи SOAP пора отправить на заслуженную пенсию, и почему современная индустрия безоговорочно выбрала OpenID Connect (OIDC).
---
Главные грехи SAML 2.0
SAML создавался во времена, когда корпоративный софт писали на Java, гоняли SOAP-запросы, а разработчики всерьёз верили, что схемы XSD спасут человечество.
Сегодня попытка внедрить SAML в современный стек вызывает непреодолимую тоску по четырём причинам:
1. Вес и раздутость (XML Bloat)
Обычный SAML Assertion — это тяжеленный мешок XML-разметки. Чтобы передать три атрибута (логин, имя и email), SAML генерирует документ на 5–15 килобайт.
Поскольку вся эта масса передаётся через редиректы браузера в параметрах HTTP POST или даже HTTP GET, вы регулярно упираетесь в лимиты веб-серверов на размер URI и заголовков.
2. Адская каноникализация (XML-DSig и C14N)
В JSON всё просто: взяли байты, посчитали HMAC или RSA-подпись, положили в третью часть JWT через точку.
В XML всё устроено извращённо: перед проверкой подписи парсер обязан выполнить «каноникализацию» — привести пробелы, атрибуты и переносы строк к сакральному эталону.
Разные парсеры (Java, libxml2, Python, Go) делают это чуть-чуть по-разному. Результат — недели дебага на тему «почему в тестовой среде работает, а на проде отваливается».
3. Дыры в безопасности: XML Signature Wrapping (XSW)
Из-за гибкости спецификации XML цифровой подписью заверяется не весь документ целиком, а отдельный узел с атрибутом ID.
Это породило целый класс критических уязвимостей — XML Signature Wrapping. Атакующий дублирует узел с пользователем, подсовывает чужую валидную подпись во второй узел, и уязвимый парсер проверяет подпись Васи, а права выдаёт админу Пете. Библиотеки для работы с SAML регулярно латают от подобных атак до сих пор.
4. Несовместимость с мобилками и SPA
Попробуйте реализовать чистый SAML Web Browser SSO Profile в нативном мобильном приложении на Flutter/Swift или в React-одностраничнике без бэкенда. Вы проклянёте всё. SAML фундаментально завязан на редиректы браузера с отправкой скрытых HTML-форм (HTTP-POST Binding).
---
Почему OpenID Connect (OIDC) — это глоток чистого воздуха
OpenID Connect, появившийся в 2014 году, не стал изобретать велосипед. Он взял проверенную базу авторизации OAuth 2.0 и добавил к ней стандартизированный слой идентификации.
| Параметр | SAML 2.0 | OpenID Connect (OIDC) |
|---|---|---|
| Формат данных | Монструозный XML с пространствами имён | Чистый JSON и JWT (RFC 7519) |
| Вес токена | 5 000 – 15 000 байт | 500 – 1 200 байт |
| Подпись и криптография | XML-DSig / Canonicalization | JWS / JWK (стандартная проверка хеша) |
| Настройка | Ручной обмен гигантскими XML-файлами метаданных | Авто-конфигурация через эндпоинт /.well-known/openid-configuration |
| Поддержка клиентов | Только классический веб в браузере | Любые клиенты: Веб, SPA, iOS, Android, CLI, микросервисы |
---
Как это выглядит для инженера на практике
Вместо того чтобы вручную генерировать сертификаты, скачивать XML-метаданные и закидывать их через форму настроек, интеграция с OIDC-шлюзом OwnGate выглядит так:
1. Вы указываете в приложении один URL:
https://auth.company.local/.well-known/openid-configuration
2. Приложение само стягивает эндпоинты авторизации, токенов и открытые ключи валидации;
3. После входа приложение получает компактный JWT (ID Token), который моментально декодируется в читаемый JSON:
{
"sub": "usr_948201",
"name": "Алексей Смирнов",
"email": "a.smirnov@company.ru",
"groups": ["DevOps", "Admins"],
"exp": 1789073400
}
Никаких парсеров XML, никаких рисков XSW-атак, никакого шаманства с пробелами.
---
Есть ли хоть одна причина оставаться на SAML?
Честный ответ — ровно одна: древний enterprise-легаси софт.
Если ваша компания обязана подключаться к старым инсталляциям SAP, Salesforce из 2010 года или специфическим государственным шлюзам, которые умеют только SAML 2.0 — от него никуда не деться.
Именно поэтому современный шлюз доступа (OwnGate) умеет работать в гибридном режиме: он может отдавать наружу лёгкий и быстрый OIDC для 99% ваших современных сервисов (GitLab, Grafana, Nextcloud, Sentry), сохраняя совместимость с SAML для капризных динозавров.
Но если перед вами стоит выбор протокола для нового сервиса компании — хороните SAML без колебаний. Инженерное спокойствие и простота отладки стоят дороже ностальгии по нулевым.