Segurança de APIs para o CTO: identidade, gateway e tokens, sem confiar às cegas
Por Dorian Chávez · fundador da Hábil e arquiteto de integração ·
Quando revalidar o token atrás do gateway, como as APIs se chamam entre si, introspecção ou validação local, logout e quanto tempo um token deve durar.
Uma arquitetura de segurança de APIs frequente hoje tem três peças: um provedor de identidade que emite os tokens —Keycloak, Microsoft Entra ID, Okta ou outro—, um gateway que recebe todo o tráfego —APISIX, Kong, Apigee, Azure API Management ou outro— e o OAuth 2.0 como a linguagem com que as permissões são pedidas e apresentadas. É uma boa arquitetura. O problema aparece nas perguntas que ninguém escreveu ao desenhá-la: o serviço que fica atrás do gateway volta a verificar o token? O que acontece quando uma API chama outra? Se o usuário encerra a sessão, o token dele deixa de valer? Quanto tempo um token deve durar?
Este artigo responde a essas perguntas para quem precisa assinar a arquitetura: o CTO de um banco, de uma fintech, de uma seguradora, de uma rede de varejo ou de qualquer empresa regulada. Cada resposta vem com a condição que lhe cabe, porque em segurança quase nunca há um «sempre».
Três tipos de rota, três níveis de confiança
Antes de falar de tokens, convém classificar cada rota da API:
| Tipo de rota | Para que serve | O que prova | O que não prova |
|---|---|---|---|
| Pública | Catálogos, informações gerais, saúde do serviço | Nada | Quem chama |
| Com API key | Identificar um consumidor, medir e limitar o uso | Que quem chama tem a chave | Quem é a pessoa, o que consentiu nem se a chave foi roubada |
| Com token OAuth | Acesso com permissões, em nome de um sistema ou de uma pessoa | Com access token OAuth configurado para esta API: permite verificar os atributos que o perfil e o provedor emitirem —por exemplo, emissor, audiência, vigência e permissões— por validação de JWT ou introspecção | Que a pessoa continue autorizada neste momento, se o token é longo |
Uma API key identifica, mas não autoriza bem: não traz permissões finas, nem a quem se destina, nem vencimento padrão, nem delegação [1][2]. Serve para consumo simples, medição e cotas. Para uma integração entre empresas (B2B) com dados sensíveis, convém OAuth 2.0 com credenciais de cliente (client credentials): o sistema parceiro obtém por API um token de vida curta, com permissões restritas e destinado à API em questão [3][4]. Esse caminho se aplica quando o sistema age por conta própria ou sob um acordo prévio; não substitui o consentimento de uma pessoa. Se as API keys forem mantidas: uma por consumidor e por ambiente, guardadas como segredo, rotacionadas e nunca na URL, porque as URLs ficam registradas nos logs do gateway, dos proxies e das ferramentas de monitoramento, onde qualquer pessoa com acesso pode lê-las [2].
O serviço atrás do gateway deve verificar o token?
É a pergunta que gera mais discussões, e a resposta curta é: estar atrás do gateway não dá confiança por si só. Quem diz é o marco de confiança zero do NIST: a localização na rede não implica confiança, e a zona de confiança implícita deve ser a menor possível [5].
A resposta completa separa duas coisas que costumam ser confundidas:
- Validar o token (é autêntico, foi emitido pelo provedor, é para este serviço, continua vigente?).
- Autorizar a operação (esta pessoa ou este sistema pode ler esta conta, esta apólice, este pedido?).
A segunda, a autorização fina sobre o objeto, deve ser avaliada onde estejam disponíveis a regra de negócio e a relação com o objeto: normalmente no serviço ou em um componente de política integrado a ele. O gateway pode complementar com controles de granularidade grossa, mas não substitui essa regra. Uma permissão genérica como «ler pagamentos» não decide se alguém pode ler o pagamento de outro cliente. Esse erro tem nome e é o primeiro da lista de riscos de APIs da OWASP [6][7].
A primeira pode ser delegada ao gateway, mas somente se todas estas condições forem cumpridas [5][8][9]:
- O serviço não é alcançável por nenhum outro caminho que não seja o gateway: nem de outra rede, nem de outro serviço vizinho, nem por uma rota administrativa.
- O canal entre o gateway e o serviço é autenticado, por exemplo com TLS mútuo.
- O gateway apaga qualquer cabeçalho de identidade que chegue de fora e coloca o próprio, assinado (por exemplo, um token interno) ou sobre um canal autenticado, de modo que o serviço possa verificar que vem do gateway.
- A configuração de rotas é inventariada, testada e com falha fechada (fail-closed): uma rota sem regra não fica aberta.
Se uma condição não for cumprida, documente outro ponto de aplicação de política que valide de forma verificável a identidade de quem chama e o contexto; se não existir, o serviço deverá fazê-lo. E há casos em que convém que o valide mesmo que se cumpram as quatro: quando lida com dinheiro ou dados pessoais, quando decide com dados do token, ou quando atende vários clientes ou domínios.
Um detalhe de configuração que vale ouro: em alguns gateways, os plugins que validam API keys ou JWT repassam a credencial original ao serviço de trás a menos que se configure o contrário, e o de OpenID Connect, com bearer_only em false, não exige estritamente um bearer token [10][11]. São os valores documentados no APISIX 3.19 [provedor]; confirme a versão instalada e a configuração efetiva. Revisar esses valores padrão faz parte da arquitetura, não é um detalhe.
Quando uma API chama outra
Dentro da arquitetura, um serviço precisa chamar outro. Há cinco padrões frequentes, e cada uma serve para algo distinto [12][13][14]:
| Há um usuário por trás? | Padrão | Usar quando | Risco se mal usado |
|---|---|---|---|
| Sim | Repassar o token do usuário | O serviço de destino está declarado como destinatário do token | O intermediário tem nas mãos um token que serve para outros serviços |
| Sim | Trocar o token (token exchange, RFC 8693) | O destino precisa saber quem é o usuário, mas com um token próprio, reduzido e destinado a ele | Que a troca permita pedir qualquer permissão para qualquer destino |
| Não | Credenciais do próprio serviço | Trabalho técnico, processos em lote, eventos, conciliação: não há usuário por trás | Atribuir a um usuário uma ação que foi feita pelo sistema |
| Sim | Token interno de vida curta | O gateway troca o token externo por um interno, válido somente por dentro | Criar sem querer um segundo provedor de identidade sem governança |
| Não | Somente TLS mútuo entre serviços | Basta saber qual serviço chama | O certificado prova o serviço, não a permissão do usuário |
Uma regra que reduz o risco de reutilização indevida: cada serviço verifica se o token era destinado a ele. O campo que indica isso se chama audiência (aud), e se o serviço não está ali, o token é rejeitado [15][16]; para restringir o destino ao solicitá-lo, existem os indicadores de recurso (RFC 8707) [30]. Assim se evita o erro de «repassar às cegas» (token passthrough) e a consequência mais conhecida dele, o confused deputy: um serviço que, com um token alheio, faz algo que o usuário nunca autorizou. Por exemplo, um serviço de relatórios que recebe um token emitido para o serviço de pagamentos e, com ele, acaba podendo executar pagamentos.
Para a cadeia «A chama B em nome do usuário», o padrão recomendado é a troca de tokens: A troca o token que recebeu por um novo, destinado a B e com menos permissões [12]. No Keycloak, a função padrão V2 vem habilitada por padrão, mas o cliente solicitante deve ser confidencial e ter habilitado Standard token exchange; a troca padrão opera entre clientes do mesmo realm [17]. E o NIST propõe algo parecido para microsserviços: trocar o token externo na entrada por um interno de vida curta, e verificá-lo a cada salto [8].
Confiar no token ou perguntar ao provedor?
Há duas formas de saber se um token é bom:
| Método | Convém quando | Vantagem | Limite |
|---|---|---|---|
| Validação local do JWT (assinatura com as chaves públicas do provedor, emissor, audiência, vencimento) | Alto volume, baixa latência | Não depende de o provedor estar disponível em cada requisição | Não fica sabendo se o token foi revogado depois de emitido |
| Introspecção (RFC 7662): perguntar ao provedor | Tokens opacos, ou ações em que o estado atual importa | Responde se o token continua ativo agora | Acrescenta latência e dependência do provedor |
| Misto | APIs reguladas de alto volume | Validação local para o comum, introspecção para o crítico | É preciso decidir e documentar o que é «crítico» |
Validar localmente não é só «a assinatura passou»: é preciso fixar o emissor esperado, aceitar somente os algoritmos previstos, verificar audiência, vencimento e permissões, e obter as chaves de um lugar confiável, porque o provedor as rotaciona: o serviço guarda em cache as chaves públicas e, quando chega um token assinado com uma chave que não conhece, volta a pedi-las em vez de rejeitá-lo ou de aceitá-lo às cegas [18][19]. E um custo que o CTO assina: com introspecção em cada requisição, o provedor de identidade fica no caminho crítico de todas as operações; se cai ou fica lento, cai ou fica lento tudo. E se o resultado de uma introspecção é guardado em cache, o tempo de cache não pode ser maior que a janela de revogação que o negócio aceita: um cache de cinco minutos contradiz uma promessa de revogação «imediata».
Encerrar a sessão não desativa os tokens já emitidos
Um efeito operacional relevante, que costuma surpreender um comitê de segurança: quando um usuário encerra a sessão, o access token que já tinha continua válido até vencer, para qualquer serviço que o valide localmente. Os mecanismos de encerramento de sessão do OpenID Connect terminam a sessão e avisam as aplicações, mas não invalidam os access tokens que já circulam [20][21]; a documentação do Keycloak alerta sobre isso de forma explícita [17].
Por isso a vigência é desenhada em camadas:
- Access tokens curtos, para que a janela de exposição seja pequena.
- Refresh tokens revogáveis, vinculados ao cliente e, em aplicações públicas, com rotação [3].
- Introspecção nas operações em que o estado atual importa: transferências, mudanças de beneficiário, downloads em massa, ações administrativas.
- Revogação (RFC 7009) quando o provedor a suporta [22].
- Eventos de revogação entre sistemas (OpenID CAEP), que já são padrão final; o suporte nos provedores ainda é desigual [23].
Quanto tempo um token deve durar?
Não existe uma duração «padrão» em nenhuma norma. O OAuth deixa a vida do token a cargo do provedor [4]; o padrão de bearer tokens recomenda uma hora ou menos [24]; e o perfil de segurança do open banking (FAPI 2.0) pede tokens curtos sem fixar um número [25]. O que há são faixas iniciais de projeto —critério editorial, não uma norma—; ajuste-as à exposição, à janela de revogação, à reautenticação e à disponibilidade do provedor:
| Token | Ponto de partida | Comentário |
|---|---|---|
| Access token de uma pessoa | 5 minutos; de 1 a 5 em pagamentos e administração | Somente se o refresh token é rotacionado e vinculado ao cliente; se não, convém uma vida um pouco maior e compensar com introspecção no que é crítico |
| Access token entre empresas (credenciais de cliente) | De 5 a 15 minutos | Renova-se autenticando o sistema de novo |
| Refresh token | O que durar a sessão: inatividade e máximo | Não renovar em silêncio uma sessão inativa |
| Token «offline» (de longa duração) | Somente como exceção aprovada | Com máximo explícito e revogação |
Os valores padrão do Keycloak [provedor] seguem essa linha. Foram verificados diretamente no código-fonte (ramo principal consultado em 6 de outubro de 2026), porque a documentação não os publica por completo [26]. São números do provedor e podem mudar entre versões:
| Ajuste do Keycloak | Valor padrão |
|---|---|
| Vida do access token | 5 minutos (1 minuto no domínio administrativo «master») |
| Sessão: inatividade | 30 minutos |
| Sessão: máximo | 10 horas |
| Sessão offline: inatividade | 30 dias (o máximo vem desabilitado) |
No Keycloak, o refresh token de uma sessão normal vive o que a sessão permitir. Antes de confiar nesses números, convém revisar os da instalação em uso: os ajustes por cliente e as importações os alteram.
Quando é necessário o OpenID Connect?
- O OAuth 2.0 basta quando o que se protege é o acesso de uma aplicação ou de um sistema a uma API: integrações entre empresas, processos internos, permissões por escopo [4].
- O OpenID Connect convém quando a aplicação precisa de identidade autenticada interoperável, claims de autenticação ou acesso único (SSO) (também nível de autenticação, encerramento de sessão e reautenticação para ações sensíveis) [27]. O OAuth por si só não padroniza essa identidade: o OpenID Connect é a camada de identidade sobre o OAuth.
- Um erro frequente: usar o ID token do OpenID Connect para chamar uma API. O ID token é para a aplicação que iniciou a sessão; à API se envia o access token [27].
No open banking, a régua sobe
Se a API cai no mundo do open banking ou de dados financeiros, o perfil FAPI 2.0 (padrão final) sobe a régua: tokens vinculados a quem os usa —com TLS mútuo ou DPoP—, autenticação forte do cliente e parâmetros da requisição protegidos [25][28][29]. Não é obrigatório para todas as APIs nem é, por si só, uma obrigação mexicana: pode ser uma referência técnica útil para APIs de alto valor quando o marco aplicável, um contrato ou a política de risco o adotarem, e não substitui a avaliação das obrigações regulatórias aplicáveis.
Por onde começar
- Classificar as rotas em públicas, com API key e com token, e verificar se cada uma está onde deve.
- Decidir, serviço por serviço, quem valida o token, com as quatro condições acima por escrito.
- Verificar a audiência em cada serviço e eliminar o repasse de tokens às cegas.
- Revisar os valores padrão do provedor de identidade e do gateway.
- Definir a janela de revogação por tipo de operação, e ajustar durações e introspecção a ela.
Quantas das rotas da empresa aguentariam hoje essa revisão? A primeira conversa de diagnóstico é sem custo: a empresa sai com o mapa das rotas por nível de confiança e as lacunas a tratar primeiro. Escreva para nós pelo WhatsApp.
Referências
- OWASP, REST Security Cheat Sheet (API keys). https://cheatsheetseries.owasp.org/cheatsheets/REST_Security_Cheat_Sheet.html
- OWASP, OAuth2 Cheat Sheet. https://cheatsheetseries.owasp.org/cheatsheets/OAuth2_Cheat_Sheet.html
- IETF, RFC 9700, Best Current Practice for OAuth 2.0 Security (2025). https://www.rfc-editor.org/rfc/rfc9700.html
- IETF, RFC 6749, The OAuth 2.0 Authorization Framework, §4.4 client credentials. https://www.rfc-editor.org/rfc/rfc6749.html
- NIST, SP 800-207, Zero Trust Architecture. https://csrc.nist.gov/pubs/sp/800/207/final
- OWASP, API Security Top 10 2023 (API1: Broken Object Level Authorization). https://api-security.owasp.org/editions/2023/en/0xa1-broken-object-level-authorization/
- OWASP, Authorization Cheat Sheet. https://cheatsheetseries.owasp.org/cheatsheets/Authorization_Cheat_Sheet.html
- NIST, SP 800-207A, A Zero Trust Architecture Model for Access Control in Cloud-Native Applications. https://csrc.nist.gov/pubs/sp/800/207/a/final
- NIST, SP 800-204, Security Strategies for Microservices-based Application Systems. https://csrc.nist.gov/pubs/sp/800/204/final
- Apache APISIX, plugins
key-authejwt-auth(hide_credentials). https://apisix.apache.org/docs/apisix/plugins/key-auth/ · https://apisix.apache.org/docs/apisix/plugins/jwt-auth/ - Apache APISIX, plugin
openid-connect(bearer_only, introspecção, JWKS). https://apisix.apache.org/docs/apisix/plugins/openid-connect/ - IETF, RFC 8693, OAuth 2.0 Token Exchange. https://www.rfc-editor.org/rfc/rfc8693.html
- OWASP, Identity Propagation Patterns Cheat Sheet. https://cheatsheetseries.owasp.org/cheatsheets/Identity_Propagation_Patterns_Cheat_Sheet.html
- IETF, RFC 8705, OAuth 2.0 Mutual-TLS Client Authentication. https://www.rfc-editor.org/rfc/rfc8705.html
- IETF, RFC 7519, JSON Web Token, §4.1.3 (aud). https://www.rfc-editor.org/rfc/rfc7519.html
- IETF, RFC 9068, JWT Profile for OAuth 2.0 Access Tokens. https://www.rfc-editor.org/rfc/rfc9068.html
- Keycloak, Server Administration Guide e Securing Applications Guide (audiência, troca de tokens, sessões). https://www.keycloak.org/securing-apps/token-exchange · https://www.keycloak.org/documentation
- OWASP, JSON Web Token Cheat Sheet. https://cheatsheetseries.owasp.org/cheatsheets/JSON_Web_Token_Cheat_Sheet.html
- IETF, RFC 7662, OAuth 2.0 Token Introspection. https://www.rfc-editor.org/rfc/rfc7662.html
- OpenID, Back-Channel Logout 1.0. https://openid.net/specs/openid-connect-backchannel-1_0.html
- OpenID, RP-Initiated Logout 1.0. https://openid.net/specs/openid-connect-rpinitiated-1_0.html
- IETF, RFC 7009, OAuth 2.0 Token Revocation. https://www.rfc-editor.org/rfc/rfc7009.html
- OpenID, CAEP 1.0 (Continuous Access Evaluation Profile). https://openid.net/specs/openid-caep-1_0-final.html
- IETF, RFC 6750, Bearer Token Usage, §5.3. https://www.rfc-editor.org/rfc/rfc6750.html
- OpenID, FAPI 2.0 Security Profile (final). https://openid.net/specs/fapi-security-profile-2_0-final.html
- Keycloak [provedor], código-fonte:
Constants.javaeApplianceBootstrap.java(valores padrão), ramo principal consultado em 6 de outubro de 2026; links para o último commit de cada arquivo nessa data. https://github.com/keycloak/keycloak/blob/55e0a796c7d397027c766efcad1ba47706ba8f72/server-spi-private/src/main/java/org/keycloak/models/Constants.java · https://github.com/keycloak/keycloak/blob/3575af2b5bc19fa16d3f6caf39ad1fc869c3fdda/services/src/main/java/org/keycloak/services/managers/ApplianceBootstrap.java - OpenID, OpenID Connect Core 1.0. https://openid.net/specs/openid-connect-core-1_0.html
- IETF, RFC 9449, OAuth 2.0 Demonstrating Proof of Possession (DPoP). https://www.rfc-editor.org/rfc/rfc9449.html
- OpenID, FAPI 2.0 Message Signing (final). https://openid.net/specs/fapi-message-signing-2_0-final.html
- IETF, RFC 8707, Resource Indicators for OAuth 2.0. https://www.rfc-editor.org/rfc/rfc8707.html
- Controlar quem entra →
- APIs prontas para agentes de IA →
- SSO com SAML 2.0 no Setor Financeiro: Implementação Enterprise →
A operação da empresa enfrenta esses desafios?
Prefere e-mail? Escreva para hola@habil.mx