Доброго времени суток! Я Мирошин Роман, руководитель проекта Trusted.ID. Занимаясь разработкой SSO, периодически получаю комментарии и вопросы, почему мы выбрали протокол OIDC вместо SAML и почему не включаем его в планы на поддержку. В этой статье я постараюсь рассказать, о причинах такого решения.

Что такое SSO

Single Sign-On (SSO) — это механизм, позволяющий пользователям получать доступ к нескольким приложениям и сервисам после однократной аутентификации. Как студенческий билет в университетском кампусе, он открывает двери в библиотеку, спортзал и столовую без повторных проверок.

Важность SSO раскрывается в трех аспектах:

  • Удобство: Пользователям не нужно запоминать десятки паролей.

  • Безопасность: Централизованный контроль снижает риски утечек и упрощает внедрение MFA.

  • Эффективность: IT-отделы тратят меньше времени на сброс паролей и управление учетными записями.

В корпоративных средах SSO — не роскошь, а стандарт для интеграции облачных сервисов (SaaS), порталов и внутренних систем.

Для чего нужен протокол в SSO

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

Другими словами, протокол в SSO определяет набор возможностей в системе:

  • SAML и OIDC (RFC 7522 и SPEC) обеспечивают обмен аутентификационными данными между провайдерами и сервисами.

  • OAuth 2.0 (RFC 6749) отвечает за делегирование доступа.

  • Kerberos (RFC 4120) реализует централизованную аутентификацию в корпоративных сетях.

  • WebAuthn (W3C) позволяет использовать биометрию и аппаратные ключи для входа.

Благодаря этим и другим протоколам пользователи проходят аутентификацию один раз и получают доступ к разным сервисам без повторного ввода пароля.

SAML vs OpenID Connect

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

Протокол SAML

Security Assertion Markup Language (SAML 2.0) — протокол для обмена аутентификационными данными в формате XML. Его архитектура разработана в начале 2000-х.

Схема протокола SAML
Схема протокола SAML

Этот протокол зарекомендовал себя с течением времени и широко используется во многих системах. Но у него есть ряд особенностей, которые осложняют его использование:

  • Сложность интеграции: SAML использует XML, что делает его громоздким для разработки и отладки по сравнению с JSON-базированными протоколами, такими как OAuth 2.0 и OpenID Connect.

  • Ограниченная поддержка мобильных и современных приложений: SAML изначально разрабатывался для веб-приложений и менее удобен для мобильных приложений или API-driven архитектур. OAuth 2.0 и OpenID Connect лучше подходят для таких случаев.

  • Меньшая гибкость: SAML ориентирован на SSO и передачу утверждений (assertions), тогда как OAuth и OpenID Connect предлагают более гибкие механизмы авторизации и аутентификации, включая поддержку токенов доступа (access tokens) и идентификационных токенов (ID tokens).

Протокол OpenID Connect

OpenID Connect (OIDC) — протокол аутентификации, расширяющий протокол OAuth 2.0 и добавляющий возможности идентификации пользователей. Он сочетает авторизацию и аутентификацию, используя JSON Web Token (JWT) для передачи данных о пользователе. Разработан в 2014 году.

Схема протокола OIDC
Схема протокола OIDC

Этот протокол считается более современным и рекомендуемым для новых систем. Данный протокол имеет ряд улучшений:

  • Простота: JSON и REST API упрощают интеграцию по сравнению с XML-базированным SAML.

  • Гибкость: Подходит для веб, мобильных приложений и API.

  • Безопасность: Поддержка JWT и PKCE.

  • Широкая поддержка: Совместим с Google, Okta, Auth0, Azure AD.

Сравнение протоколов SAML vs OpenID Connect

Если обобщить все вышесказанное в одну табличку, то результат сравнения говорит сам за себя.

Критерий

SAML 2.0

OIDC

Безопасность

⚠️ Риски canonicalization

✅ JWT-подписи + PKCE

Формат данных

XML (тяжелый)

JSON (легкий)

Мобильность

❌ Нет поддержки

✅ Нативные приложения + SPA

Сложность интеграции

Высокая (сертификаты, XML)

Низкая

Аутентификация

Авторизация

  • OIDC по сравнению с SAML обладает повышенным уровнем безопасности, отвечающим последним требованиям безопасности.

  • Простота настройки протокола OIDC лишь повышает уровень безопасности, так как возможностей для совершения ошибок значительно меньше.

  • Возможность подключать нативные приложения и SPA в нынешнее время является обязательным требованием.

  • Возможность не только аутентифицировать, но и авторизировать расширяют сферы применения протокола OIDC.

Протокол SAML не устарел, но он явно уступает протоколу OIDC по многим параметрам.

OIDC или SAML для SSO

Собрав всю информацию воедино, то вывод о причине того, что мы в своем SSO проекте Trusted.ID выбрали OIDC вместо SAML, очевиден, но все-равно подведу итоги:

  1. Безопасность: Избежание рисков, связанных с canonicalization XML и подписью вычисляемых значений. Уязвимости в SAML (например, Duo Security, 2018) позволяли эскалацию привилегий даже с включенным MFA.

  2. Производительность: JSON в OIDC требует меньше ресурсов для парсинга, чем XML в SAML. Это критично для микросервисной архитектуры.

  3. Опыт пользователя: Встроенная поддержка согласия (consent flow) в OIDC упрощает onboarding. SAML же требует кастомной реализации.

  4. Сложность интеграции: OIDC значительно прост в настройках по сравнению SAML, что делает его более доступным и не требует высококвалифицированных специалистов.

  5. SPA и нативные приложения: OIDC позволяет подключать SPA и нативные приложения, что для пользователей SSO является явным плюсом.

«Стойте! Ведь SAML позволяет работать с LDAP, а OIDC нет и это перечеркивает всю нашу аналитическую работу!». Вовсе нет, зная о проблемах протокола SAML, мы поддержали работу с AD по протоколу LDAP и потребность в SAML окончательно отпала.

Официально SAML не признан устаревшим, но он явно уступает протоколу OIDC. Мы выбрали для своего проекта OIDC и не видим необходимости в реализации и поддержки протокола SAML.

Заключение

SAML 2.0 сыграл ключевую роль в эволюции SSO, но сегодня устарел: сложность интеграции, уязвимости canonicalization XML и отсутствие поддержки мобильных сценариев делают его аутсайдером. Альтернатива — стек OAuth 2.0 + OIDC:

  • Безопасный за счет PKCE и JWT.

  • Простой в реализации.

  • Универсальный для веб, API и мобильных приложений.

Для проектов вроде Trusted.ID это означает меньшие риски и быстрый вывод продукта на рынок.

Какие протоколы используете вы? Сталкивались ли с проблемами SAML? Делитесь опытом в комментариях!

Комментарии (4)


  1. mayorovp
    02.09.2025 12:47

    SAML ориентирован на SSO и передачу утверждений (assertions), тогда как OAuth и OpenID Connect предлагают более гибкие механизмы авторизации и аутентификации, включая поддержку токенов доступа (access tokens) и идентификационных токенов (ID tokens).

    Вот тут какая-то чушь написана, ID token по сути такой же assertion и содержит, только в формате JWT вместо SAML.

    JSON и REST API упрощают интеграцию по сравнению с XML-базированным SAML.

    Ну, некоторое упрощение чувствуется, но не сильное. От REST API тут одно название, спецификации что там, что там мозголомные.

    Забыли, к слову, третий способ в сравнение добавить - WS-Federation.

    OIDC значительно прост в настройках по сравнению SAML, что делает его более доступным и не требует высококвалифицированных специалистов.

    Что-то не видел я никакой принципиальной разницы в простоте настройки.

    Избежание рисков, связанных с canonicalization XML и подписью вычисляемых значений. Уязвимости в SAML (например, Duo Security, 2018) позволяли эскалацию привилегий даже с включенным MFA.

    А можно подробности?

    OIDC позволяет подключать SPA и нативные приложения, что для пользователей SSO является явным плюсом

    Правильно ли я понимаю, что вся разница - в том, что SAML шлёт токен методом POST, в то время как OIDC использует GET, умещая всё что нужно в строку запроса? И у SPA с нативными приложениями сложности именно с получением тела запроса?


    1. ma1uta
      02.09.2025 12:47

      А можно подробности?

      Когда начинаем работать с SAML, то проблемы начинаются ещё до начала работы с SAML, в частности, надо корректно работать с входящими XML (отключить external entity и пр.), чтобы избежать XXE и других уязвимостей. У json-а подобных проблем нет.

      Ну, некоторое упрощение чувствуется, но не сильное. От REST API тут одно название, спецификации что там, что там мозголомные.

      Не одно название. Отлаживать OIDC/OAuth2 действительно проще, достаточно иметь консоль и curl. И json на 10 строк более читаем чем xml от SAML-а.

      Что-то не видел я никакой принципиальной разницы в простоте настройки.

      Можно сравнить список рекомендаций по настройке:

      И в целом у OAuth2.0 всё более-менее сведено в одно место (отправная точка RFC 9700) и не надо бегать в поисках специалиста с сакральным знанием, как надо настраивать его.

      Правильно ли я понимаю, что вся разница - в том, что SAML шлёт токен методом POST, в то время как OIDC использует GET, умещая всё что нужно в строку запроса? И у SPA с нативными приложениями сложности именно с получением тела запроса?

      Речь про то, что в OIDC/OAuth2 есть разделение на пользователя и клиент, где клиентом может быть SPA, нативное приложение и любое другое. И для каждого клиента есть возможность управлять политиками и правилами. Например, каждому клиенту выдавать только свой набор ролей (у одного клиента запрашивать только логин/пароль, а для другого логин/пароль+второй фактор). Не говоря уже о ACR и LoA.

      Кроме того, OAuth2 предлагает три варианта передачи токена:

      • параметр в GET-запросе - не желателен к использованию

      • параметр в Header - чаще всего используется

      • часть содержимого POST-запроса - реже используется.

      Например, следующая ситуация, есть мобильное приложение, есть десктопное приложение, если веб-приложение. Используя эти разные клиенты, предоставляем доступ к одному и тому же ресурсу. При этом мы хотим при использовании десктопного приложения дать больше прав (например, десктопное приложение ставится только на доверенные ноуты в домене, есть поддержка цифровой подписи), а мобильному приложению хотим дать меньше прав (что-то сложное сделать нельзя, но получить статус, прочитать уведомление, прочитать краткое резюме). В OAuth2 это решается через клиенты, ACR, и у нас из коробки сразу же есть защита от mixup атак (это когда перехватили токен от мобилки, закинули в десктопное приложение и пытаемся получить расширенные права).

      Как сделать разделение по правам между мобилкой и десктопным приложением в SAML2.0?

      Автор ещё не указал, что OpenID Connect 1.0/OAuth 2.0 предоставляют возможности, которые отсутствуют в SAML2.0, например, управление сессией, чтобы клиент мог отслеживать сессию, мог обновить сессию, корректно завершить сессию (back-channel logout, front-channel logout, rp-initiated logout).

      Или например динамическая регистрация клиента. Или аналог OAuth2 UMA2 (https://docs.kantarainitiative.org/uma/wg/rec-oauth-uma-grant-2.0.html).


      1. mayorovp
        02.09.2025 12:47

        Когда начинаем работать с SAML, то проблемы начинаются ещё до начала работы с SAML, в частности, надо корректно работать с входящими XML (отключить external entity и пр.), чтобы избежать XXE и других уязвимостей.

        На стороне Relying Party ждать XXE-атаки со стороны Identity Provider глупо, поскольку тот может просто выписать токен на имя любого пользователя без всяких хитростей. Вот на стороне Identity Provider - да, надо защищаться от атак на XML. Но, с другой стороны, хороший переиспользуемый Identity Provider должен быть многопротокольным, а значит выбора "какой из протоколов использовать" не стоит, этот выбор есть только для Relying Party.

        Можно сравнить список рекомендаций по настройке [,,,]

        Там по второй ссылке 2/3 объёма - это рекомендации по работе с сертификатами, которые и для OIDC нужны. Единственная причина почему их нет по первой ссылке - потому что она касается исключительно OAuth2, без OIDC-надстройки.

        Не говоря уже о ACR и LoA.

        Это что вообще?

        Как сделать разделение по правам между мобилкой и десктопным приложением в SAML2.0?

        Зарегистрировать их как разные Relying Party со своими настройками?

        Автор ещё не указал, что OpenID Connect 1.0/OAuth 2.0 предоставляют возможности, которые отсутствуют в SAML2.0, например, управление сессией [...]

        Ну, они все есть в WS-Federation.


  1. ma1uta
    02.09.2025 12:47

    SAML позволяет работать с LDAP, а OIDC нет

    Можете подробнее раскрыть, что подразумевается под этой фразой?