SAML vs OIDC é a escolha de protocolo por trás do logon único. No SAML 2.0 (padrão OASIS, março de 2005), um provedor de identidade assina uma asserção XML sobre o usuário, e o navegador a leva até o provedor de serviços. O OpenID Connect (Core 1.0, fevereiro de 2014, também ISO/IEC 26131:2024) acrescenta uma camada de identidade ao OAuth 2.0: o provedor emite um JWT assinado, o token de ID, normalmente pelo fluxo de código de autorização, e pode emitir tokens de acesso para APIs na mesma troca.
Visão geral
| SAML 2.0 | OpenID Connect | |
|---|---|---|
| Publicação | Padrão OASIS, março de 2005 | Core 1.0, fevereiro de 2014 (errata de 2023); ISO/IEC 26131:2024 |
| Token | Asserção XML | Token de ID JWT, além dos tokens de acesso e dos tokens de atualização do OAuth |
| Assinatura | XML Signature com canonicalização, geralmente RSA-SHA256 | JWS; o suporte a RS256 é obrigatório, ES256 e outros são comuns |
| Transporte | POST ou redirecionamento pelo navegador; resolução de artefatos via SOAP | Código de autorização via redirecionamento, tokens obtidos no endpoint de token |
| Configuração | Metadados XML trocados com cada parceiro | Documento de descoberta e JWKS em URLs .well-known |
| Medido no Microsoft Entra ID (abaixo) | Metadados de 28–32 KB, 5 certificados | Descoberta de 1.728 bytes, JWKS com 7 chaves RSA |
| Rotação de chaves | Novo certificado nos metadados, muitas vezes atualizado manualmente por cada parceiro | Automática: os clientes atualizam o JWKS |
| Aplicativos nativos e móveis | Pouco prático (POST do navegador para um servidor) | Feito para isso (RFC 8252, PKCE) |
| Acesso a APIs | Não coberto (troca de tokens separada) | Tokens de acesso no mesmo fluxo |
| Logout | Single Logout via front channel ou back channel | RP-Initiated, Front-Channel e Back-Channel Logout (finais desde 2022) |
| Usuários típicos | SaaS corporativo, universidades (eduGAIN), governo | Login de consumidores, SaaS moderno, aplicativos móveis, identidade da força de trabalho |
Como cada um faz o login do usuário
No SAML, o provedor de serviços redireciona o navegador para o provedor de identidade com um AuthnRequest. Depois do login, o IdP retorna um formulário HTML que envia por POST uma Response codificada em base64 com a asserção: emissor, titular, restrição de público-alvo, janela de validade, atributos e uma assinatura XML. O provedor de serviços verifica a assinatura com o certificado dos metadados do IdP e confere as condições.
No OpenID Connect, o cliente redireciona para o endpoint de autorização do provedor com scope=openid, um state, um nonce e um desafio PKCE. O provedor retorna um código de uso único para a URI de redirecionamento; o cliente o troca no endpoint de token pelo token de ID e pelo token de acesso por meio de uma conexão TLS direta, de modo que os tokens nunca passam pela barra de endereços do navegador.
O script abaixo lê os dois tipos de configuração do mesmo provedor (20 de outubro de 2026, curl e jq 1.8.1). Em requisições repetidas, o tamanho dos metadados SAML variou entre 28 e 32 KB e o JWKS entre 7 e 8 chaves, conforme servidores diferentes respondiam.
#!/bin/sh
base=https://login.microsoftonline.com/common
echo "== OpenID Connect discovery"
curl -s "$base/v2.0/.well-known/openid-configuration" -o oidc.json
echo "bytes: $(wc -c < oidc.json | tr -d ' ')"
jq -c '{id_token_signing_alg_values_supported, response_types_supported}' oidc.json
curl -s "$(jq -r .jwks_uri oidc.json)" | jq -c '{jwks_keys: (.keys | length), kty: ([.keys[].kty] | unique)}'
echo "== SAML 2.0 metadata"
curl -s "$base/FederationMetadata/2007-06/FederationMetadata.xml" -o saml.xml
echo "bytes: $(wc -c < saml.xml | tr -d ' ')"
grep -o 'SignatureMethod Algorithm="[^"]*"' saml.xml | sort -u
grep -o 'SingleSignOnService Binding="[^"]*"' saml.xml | sort -u
echo "distinct certificates: $(grep -o '<X509Certificate>[^<]*' saml.xml | sort -u | wc -l | tr -d ' ')"
rm -f oidc.json saml.xml
== OpenID Connect discovery
bytes: 1728
{"id_token_signing_alg_values_supported":["RS256"],"response_types_supported":["code","id_token","code id_token","id_token token"]}
{"jwks_keys":7,"kty":["RSA"]}
== SAML 2.0 metadata
bytes: 28179
SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"
SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect"
distinct certificates: 5
O que a parte confiável deve verificar
SAML: verifique a assinatura XML com o certificado do IdP que você configurou (nunca com um certificado embutido na mensagem) e confirme que a assinatura cobre exatamente a asserção que seu código lê; depois confira Issuer, Destination, InResponseTo, AudienceRestriction, NotBefore e NotOnOrAfter e rejeite repetições (replay). A dificuldade é estrutural. A XML Signature assina elementos referenciados por ID depois da canonicalização, então um documento pode conter um elemento com assinatura válida e outro, diferente e não assinado, que a aplicação processa no lugar dele. Em 2012, Somorovsky e colegas demonstraram esse signature wrapping em 11 de 14 frameworks SAML; em 2024 e 2025, o ruby-saml (usado pelo GitLab) precisou de correções novamente (CVE-2024-45409, CVE-2025-25291 e CVE-2025-25292) porque dois parsers XML da mesma biblioteca liam o mesmo documento de formas diferentes.
OpenID Connect (Core §3.1.3.7): verifique o JWS com uma chave do JWKS do provedor, selecionada pelo kid, e com o algoritmo que você espera; depois confira iss, aud (o ID do seu cliente), exp, iat e o nonce que você enviou. O JSON tem uma única árvore de análise e a assinatura cobre exatamente os bytes recebidos, então o problema de wrapping não existe; as armadilhas que restam são aceitar algoritmos inesperados, pular a verificação de aud e comparar URIs de redirecionamento de forma frouxa, problemas tratados pelas melhores práticas atuais de segurança do OAuth (RFC 9700, janeiro de 2025). O validador de tokens OIDC executa essas verificações com o JWKS atual de um provedor, e o inspetor de SAML mostra qual elemento uma assinatura cobre de fato.
Quando escolher cada um
- Novas aplicações, aplicativos móveis, aplicações de página única, APIs: OpenID Connect com o fluxo de código e PKCE.
- Venda de SaaS para empresas: ofereça suporte aos dois; as equipes de identidade de muitos clientes ainda configuram o SAML primeiro.
- Federações de pesquisa e ensino (eduGAIN, InCommon): SAML, com agregados de metadados; o OpenID Federation 1.0 (final desde fevereiro de 2026) está em piloto no eduGAIN, mas ainda não é a norma.
- Governo e setores regulados: siga o perfil que seu ecossistema exige; o open banking e regimes semelhantes usam o FAPI 2.0, um perfil reforçado de OAuth e OpenID Connect.
- Provisionamento de usuários e grupos: nenhum dos dois; use o SCIM 2.0 (RFC 7643 e RFC 7644) junto com qualquer um dos protocolos.
Notas de migração
- Rode os dois em paralelo: configure uma aplicação OIDC no mesmo provedor de identidade e mapeie o mesmo identificador de usuário (
subou um atributo estável) para as contas existentes antes de fazer a troca. - Mapeie atributos para claims explicitamente; os nomes de atributos SAML (muitas vezes URNs) raramente coincidem com os nomes das claims OIDC, e as claims de grupo podem exigir uma chamada de API separada quando os usuários pertencem a muitos grupos.
- Use uma biblioteca certificada para OpenID Connect, ative a descoberta e o cache do JWKS com atualização quando aparecer um
kiddesconhecido e fixe os algoritmos aceitos. - Reforce o que continuar no SAML: atualize a biblioteca, exija asserções assinadas, rejeite documentos com várias asserções ou com DTDs e monitore a expiração dos certificados nos metadados dos parceiros.
- Planeje o logout separadamente: mapeie o Single Logout do SAML para o Back-Channel Logout do OIDC onde as sessões precisarem ser encerradas de forma centralizada.
- Desative a conexão SAML só depois que os logs não mostrarem nenhum login SAML durante um ciclo de negócios completo.
Referências
- OASIS SAML 2.0 Core e Bindings
- OpenID Connect Core 1.0 (§3.1.3.7, validação do token de ID)
- OpenID Connect Discovery 1.0
- OpenID Connect Back-Channel Logout 1.0
- RFC 9700, melhores práticas atuais de segurança do OAuth 2.0
- RFC 7636, PKCE e RFC 8252, OAuth para aplicativos nativos
- XML Signature Syntax and Processing 1.1 do W3C
- Somorovsky et al., On Breaking SAML, artigo no USENIX Security 2012