Seguridad17 min

Seguridad de APIs para el CTO: identidad, gateway y tokens, sin confiar a ciegas

Por Dorian Chávez · fundador de Hábil y arquitecto de integración ·

Cuándo revalidar el token detrás del gateway, cómo se llaman las APIs entre sí, introspección o validación local, logout y cuánto debe durar un token.

Una arquitectura de seguridad de APIs frecuente hoy tiene tres piezas: un proveedor de identidad que emite los tokens —Keycloak, Microsoft Entra ID, Okta u otro—, un gateway que recibe todo el tráfico —APISIX, Kong, Apigee, Azure API Management u otro— y OAuth 2.0 como el idioma con el que se piden y se presentan permisos. Es una buena arquitectura. El problema aparece en las preguntas que nadie escribió al diseñarla: ¿el servicio que está detrás del gateway vuelve a revisar el token? ¿Qué pasa cuando una API llama a otra? Si el usuario cierra sesión, ¿su token deja de servir? ¿Cuánto debe durar un token?

Este artículo responde esas preguntas para quien tiene que firmar la arquitectura: el CTO de un banco, una fintech, una aseguradora, una cadena de retail o cualquier empresa regulada. Cada respuesta viene con su condición, porque en seguridad casi nunca hay un «siempre».

Tres tipos de ruta, tres niveles de confianza

Antes de hablar de tokens, conviene clasificar cada ruta de la API:

Tres tipos de ruta, tres niveles de confianza
Tipo de rutaPara qué sirveQué pruebaQué no prueba
PúblicaCatálogos, información general, salud del servicioNadaQuién llama
Con API keyIdentificar a un consumidor, medir y limitar su usoQue quien llama tiene la llaveQuién es la persona, qué consintió ni si la llave fue robada
Con token OAuthAcceso con permisos, a nombre de un sistema o de una personaCon access token OAuth configurado para esta API: permite verificar los atributos que el perfil y el proveedor emitan —por ejemplo, emisor, audiencia, vigencia y permisos— mediante validación JWT o introspecciónQue la persona siga autorizada en este momento, si el token es largo

Una API key identifica, pero no autoriza bien: no trae permisos finos, ni a quién va dirigida, ni vencimiento estándar, ni delegación [1][2]. Sirve para consumo simple, medición y cuotas. Para una integración entre empresas (B2B) con datos sensibles, conviene OAuth 2.0 con credenciales de cliente (client credentials): el sistema socio obtiene por API un token de vida corta, con permisos acotados y dirigido a su API [3][4]. Esa vía aplica cuando el sistema actúa por cuenta propia o bajo un acuerdo previo; no sustituye el consentimiento de una persona. Si conserva API keys: una por consumidor y por ambiente, guardadas como secreto, rotadas y nunca en la URL, porque las URL quedan escritas en las bitácoras del gateway, de los proxies y de las herramientas de monitoreo, donde cualquiera con acceso las puede leer [2].

¿El servicio detrás del gateway debe revisar el token?

Es la pregunta que más discusiones genera, y la respuesta corta es: estar detrás del gateway no da confianza por sí solo. Lo dice el marco de confianza cero del NIST: la ubicación en la red no implica confianza, y la zona de confianza implícita debe ser lo más pequeña posible [5].

La respuesta completa separa dos cosas que suelen confundirse:

  • Validar el token (¿es auténtico, lo emitió mi proveedor, es para mí, sigue vigente?).
  • Autorizar la operación (¿esta persona o este sistema puede leer esta cuenta, esta póliza, este pedido?).

La segunda, la autorización fina sobre el objeto, debe evaluarse donde estén disponibles la regla de negocio y la relación con el objeto: normalmente en el servicio o en un componente de política integrado a él. El gateway puede complementar con controles gruesos, pero no sustituye esa regla. Un permiso genérico como «leer pagos» no decide si alguien puede leer el pago de otro cliente. Ese error tiene nombre y es el primero de la lista de riesgos de APIs de OWASP [6][7].

La primera puede delegarse al gateway, pero solo si se cumplen todas estas condiciones [5][8][9]:

  1. El servicio no es alcanzable por ningún otro camino que no sea el gateway: ni desde otra red, ni desde otro servicio vecino, ni por una ruta administrativa.
  2. El canal entre el gateway y el servicio está autenticado, por ejemplo con TLS mutuo.
  3. El gateway borra cualquier encabezado de identidad que llegue de fuera y pone el suyo, firmado (por ejemplo, un token interno) o sobre un canal autenticado, de modo que el servicio pueda verificar que viene del gateway.
  4. La configuración de rutas está inventariada, se prueba y falla cerrada: una ruta sin regla no queda abierta.

Si una condición no se cumple, documente otro punto de aplicación de política que valide de forma verificable la identidad del llamador y el contexto; si no existe, el servicio deberá hacerlo. Y hay casos en que conviene que lo valide aunque se cumplan las cuatro: cuando maneja dinero o datos personales, cuando decide con datos del token, o cuando atiende a varios clientes o dominios.

Un detalle de configuración que vale oro: en algunos gateways, los plugins que validan API keys o JWT reenvían la credencial original al servicio de atrás salvo que se configure lo contrario, y el de OpenID Connect, con bearer_only en false, no exige estrictamente un token portador [10][11]. Son los valores documentados en APISIX 3.19 [proveedor]; confirme la versión instalada y la configuración efectiva. Revisar esos valores por defecto es parte de la arquitectura, no un detalle.

Cuando una API llama a otra

Dentro de la arquitectura, un servicio necesita llamar a otro. Hay cinco patrones frecuentes, y cada una sirve para algo distinto [12][13][14]:

Cuando una API llama a otra
¿Hay un usuario detrás?PatrónÚselo cuandoRiesgo si se usa mal
SíReenviar el token del usuarioEl servicio destino está declarado como destinatario del tokenEl intermediario tiene en la mano un token que sirve para otros servicios
SíIntercambiar el token (token exchange, RFC 8693)El destino necesita saber quién es el usuario, pero con un token propio, reducido y dirigido a élQue el intercambio permita pedir cualquier permiso para cualquier destino
NoCredenciales del propio servicioTrabajo técnico, procesos por lote, eventos, conciliación: no hay un usuario detrásAtribuirle a un usuario una acción que hizo el sistema
SíToken interno de vida cortaEl gateway cambia el token externo por uno interno, válido solo dentroCrear sin querer un segundo proveedor de identidad sin gobierno
NoSolo TLS mutuo entre serviciosBasta saber qué servicio llamaEl certificado prueba el servicio, no el permiso del usuario

Una regla que reduce el riesgo de reutilización indebida: cada servicio verifica que el token iba dirigido a él. El campo que lo dice se llama audiencia (aud), y si el servicio no está ahí, el token se rechaza [15][16]; para restringir el destino al pedirlo, existen los indicadores de recurso (RFC 8707) [30]. Así se evita el error de «reenviar a ciegas» (token passthrough) y su consecuencia más conocida, el confused deputy: un servicio que, con un token ajeno, hace algo que el usuario nunca autorizó. Por ejemplo, un servicio de reportes que recibe un token emitido para el servicio de pagos y, con él, termina pudiendo ejecutar pagos.

Para la cadena «A llama a B a nombre del usuario», el patrón recomendado es el intercambio de tokens: A cambia el token que recibió por uno nuevo, dirigido a B y con menos permisos [12]. En Keycloak, la función estándar V2 viene habilitada por defecto, pero el cliente solicitante debe ser confidencial y tener habilitado Standard token exchange; el intercambio estándar opera entre clientes del mismo realm [17]. Y el NIST propone algo parecido para microservicios: cambiar el token externo en la entrada por uno interno de vida corta, y verificarlo en cada salto [8].

¿Confiar en el token o preguntarle al proveedor?

Hay dos formas de saber si un token es bueno:

¿Confiar en el token o preguntarle al proveedor?
MétodoConviene cuandoVentajaLímite
Validación local del JWT (firma con las llaves públicas del proveedor, emisor, audiencia, vencimiento)Alto volumen, baja latenciaNo depende de que el proveedor esté disponible en cada peticiónNo se entera si el token fue revocado después de emitido
Introspección (RFC 7662): preguntarle al proveedorTokens opacos, o acciones donde el estado actual importaResponde si el token sigue activo ahoraAgrega latencia y dependencia del proveedor
MixtoAPIs reguladas de alto volumenValidación local para lo común, introspección para lo críticoHay que decidir y documentar qué es «crítico»

Validar localmente no es solo «la firma pasó»: hay que fijar el emisor esperado, aceptar solo los algoritmos previstos, revisar audiencia, vencimiento y permisos, y obtener las llaves de un lugar confiable, porque el proveedor las rota: el servicio guarda en caché las llaves públicas y, cuando llega un token firmado con una llave que no conoce, las vuelve a pedir en lugar de rechazarlo o de aceptarlo a ciegas [18][19]. Y un costo que el CTO firma: con introspección en cada petición, el proveedor de identidad queda en la ruta crítica de todas las operaciones; si se cae o se alenta, se cae o se alenta todo. Y si se guarda en caché el resultado de una introspección, el tiempo de caché no puede ser mayor que la ventana de revocación que el negocio acepta: una caché de cinco minutos contradice una promesa de revocación «inmediata».

Cerrar sesión no apaga los tokens ya emitidos

Un efecto operativo relevante, que suele sorprender a un comité de seguridad: cuando un usuario cierra sesión, el access token que ya tenía sigue siendo válido hasta que vence, para cualquier servicio que lo valide localmente. Los mecanismos de cierre de sesión de OpenID Connect terminan la sesión y avisan a las aplicaciones, pero no invalidan los access tokens que ya circulan [20][21]; la documentación de Keycloak lo advierte de forma explícita [17].

Por eso la vigencia se diseña en capas:

  1. Access tokens cortos, para que la ventana de exposición sea chica.
  2. Refresh tokens revocables, ligados al cliente y, en aplicaciones públicas, con rotación [3].
  3. Introspección en las operaciones donde el estado actual importa: transferencias, cambios de beneficiario, descargas masivas, acciones administrativas.
  4. Revocación (RFC 7009) cuando el proveedor la soporta [22].
  5. Eventos de revocación entre sistemas (OpenID CAEP), que ya son estándar final; su soporte en los proveedores todavía es desigual [23].

¿Cuánto debe durar un token?

No existe una duración «estándar» en ninguna norma. OAuth deja la vida del token al proveedor [4]; el estándar de tokens portadores recomienda una hora o menos [24]; y el perfil de seguridad de la banca abierta (FAPI 2.0) pide tokens cortos sin fijar una cifra [25]. Lo que sí hay son rangos iniciales de diseño —criterio editorial, no una norma—; ajústelos a la exposición, la ventana de revocación, la reautenticación y la disponibilidad del proveedor:

¿Cuánto debe durar un token?
TokenPunto de partidaComentario
Access token de una persona5 minutos; de 1 a 5 en pagos y administraciónSolo si el refresh token está rotado y atado al cliente; si no, conviene una vida algo mayor y compensar con introspección en lo crítico
Access token entre empresas (credenciales de cliente)De 5 a 15 minutosSe renueva autenticando de nuevo al sistema
Refresh tokenLo que dure la sesión: inactividad y máximoNo renovar en silencio una sesión inactiva
Token «offline» (de larga duración)Solo como excepción aprobadaCon máximo explícito y revocación

Los valores de fábrica de Keycloak [proveedor] van en esa línea. Los verificamos directamente en su código fuente (rama principal consultada el 6-oct-2026), porque la documentación no los publica completos [26]. Son cifras del proveedor y pueden cambiar entre versiones:

¿Cuánto debe durar un token?
Ajuste de KeycloakValor por defecto
Vida del access token5 minutos (1 minuto en el dominio administrativo «master»)
Sesión: inactividad30 minutos
Sesión: máximo10 horas
Sesión offline: inactividad30 días (su máximo viene deshabilitado)

En Keycloak, el refresh token de una sesión normal vive lo que la sesión permita. Antes de confiar en estos números, revise los de su instalación: los ajustes por cliente y las importaciones los cambian.

¿Cuándo hace falta OpenID Connect?

  • OAuth 2.0 basta cuando lo que se protege es el acceso de una aplicación o un sistema a una API: integraciones entre empresas, procesos internos, permisos por alcance [4].
  • OpenID Connect conviene cuando la aplicación necesita identidad autenticada interoperable, claims de autenticación o inicio de sesión único (también nivel de autenticación, cierre de sesión y reautenticación para acciones sensibles) [27]. OAuth por sí solo no estandariza esa identidad: OpenID Connect es la capa de identidad encima de OAuth.
  • Un error frecuente: usar el ID token de OpenID Connect para llamar a una API. El ID token es para la aplicación que inició sesión; a la API se le manda el access token [27].

En banca abierta, la vara sube

Si su API cae en el mundo de la banca abierta o de datos financieros, el perfil FAPI 2.0 (estándar final) sube la vara: tokens atados a quien los usa —con TLS mutuo o DPoP—, autenticación fuerte del cliente y parámetros de la solicitud protegidos [25][28][29]. No es obligatorio para todas las APIs ni una obligación mexicana por sí mismo: puede ser una referencia técnica útil para APIs de alto valor cuando el marco aplicable, un contrato o la política de riesgo la adopten, y no sustituye la evaluación de las obligaciones regulatorias aplicables.

Por dónde empezar

  1. Clasifique sus rutas en públicas, con API key y con token, y revise que cada una esté donde debe.
  2. Decida, servicio por servicio, quién valida el token, con las cuatro condiciones de arriba por escrito.
  3. Verifique la audiencia en cada servicio y elimine el reenvío de tokens a ciegas.
  4. Revise los valores por defecto de su proveedor de identidad y de su gateway.
  5. Defina su ventana de revocación por tipo de operación, y ajuste duraciones e introspección a ella.

¿Cuántas de sus rutas aguantarían hoy esa revisión? La primera conversación es sin costo: sale con el mapa de sus rutas por nivel de confianza y las brechas que conviene atender primero. Escríbanos por WhatsApp.

Referencias

  1. OWASP, REST Security Cheat Sheet (API keys). https://cheatsheetseries.owasp.org/cheatsheets/REST_Security_Cheat_Sheet.html
  2. OWASP, OAuth2 Cheat Sheet. https://cheatsheetseries.owasp.org/cheatsheets/OAuth2_Cheat_Sheet.html
  3. IETF, RFC 9700, Best Current Practice for OAuth 2.0 Security (2025). https://www.rfc-editor.org/rfc/rfc9700.html
  4. IETF, RFC 6749, The OAuth 2.0 Authorization Framework, §4.4 client credentials. https://www.rfc-editor.org/rfc/rfc6749.html
  5. NIST, SP 800-207, Zero Trust Architecture. https://csrc.nist.gov/pubs/sp/800/207/final
  6. OWASP, API Security Top 10 2023 (API1: Broken Object Level Authorization). https://api-security.owasp.org/editions/2023/en/0xa1-broken-object-level-authorization/
  7. OWASP, Authorization Cheat Sheet. https://cheatsheetseries.owasp.org/cheatsheets/Authorization_Cheat_Sheet.html
  8. 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
  9. NIST, SP 800-204, Security Strategies for Microservices-based Application Systems. https://csrc.nist.gov/pubs/sp/800/204/final
  10. Apache APISIX, plugins key-auth y jwt-auth (hide_credentials). https://apisix.apache.org/docs/apisix/plugins/key-auth/ · https://apisix.apache.org/docs/apisix/plugins/jwt-auth/
  11. Apache APISIX, plugin openid-connect (bearer_only, introspección, JWKS). https://apisix.apache.org/docs/apisix/plugins/openid-connect/
  12. IETF, RFC 8693, OAuth 2.0 Token Exchange. https://www.rfc-editor.org/rfc/rfc8693.html
  13. OWASP, Identity Propagation Patterns Cheat Sheet. https://cheatsheetseries.owasp.org/cheatsheets/Identity_Propagation_Patterns_Cheat_Sheet.html
  14. IETF, RFC 8705, OAuth 2.0 Mutual-TLS Client Authentication. https://www.rfc-editor.org/rfc/rfc8705.html
  15. IETF, RFC 7519, JSON Web Token, §4.1.3 (aud). https://www.rfc-editor.org/rfc/rfc7519.html
  16. IETF, RFC 9068, JWT Profile for OAuth 2.0 Access Tokens. https://www.rfc-editor.org/rfc/rfc9068.html
  17. Keycloak, Securing Applications Guide, «Token exchange» (intercambio estándar V2) y Server Administration Guide (sesiones). https://www.keycloak.org/securing-apps/token-exchange · https://www.keycloak.org/documentation
  18. OWASP, JSON Web Token Cheat Sheet. https://cheatsheetseries.owasp.org/cheatsheets/JSON_Web_Token_Cheat_Sheet.html
  19. IETF, RFC 7662, OAuth 2.0 Token Introspection. https://www.rfc-editor.org/rfc/rfc7662.html
  20. OpenID, Back-Channel Logout 1.0. https://openid.net/specs/openid-connect-backchannel-1_0.html
  21. OpenID, RP-Initiated Logout 1.0. https://openid.net/specs/openid-connect-rpinitiated-1_0.html
  22. IETF, RFC 7009, OAuth 2.0 Token Revocation. https://www.rfc-editor.org/rfc/rfc7009.html
  23. OpenID, CAEP 1.0 (Continuous Access Evaluation Profile). https://openid.net/specs/openid-caep-1_0-final.html
  24. IETF, RFC 6750, Bearer Token Usage, §5.3. https://www.rfc-editor.org/rfc/rfc6750.html
  25. OpenID, FAPI 2.0 Security Profile (final). https://openid.net/specs/fapi-security-profile-2_0-final.html
  26. Keycloak [proveedor], código fuente: Constants.java y ApplianceBootstrap.java (valores por defecto), rama principal consultada el 6-oct-2026; enlaces al último commit de cada archivo a esa fecha. 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
  27. OpenID, OpenID Connect Core 1.0. https://openid.net/specs/openid-connect-core-1_0.html
  28. IETF, RFC 9449, OAuth 2.0 Demonstrating Proof of Possession (DPoP). https://www.rfc-editor.org/rfc/rfc9449.html
  29. OpenID, FAPI 2.0 Message Signing (final). https://openid.net/specs/fapi-message-signing-2_0-final.html
  30. IETF, RFC 8707, Resource Indicators for OAuth 2.0. https://www.rfc-editor.org/rfc/rfc8707.html