Tema 9

9. OAuth2, OpenID Connect, JWT y manejo seguro de tokens

En arquitecturas distribuidas los tokens suelen convertirse en la evidencia práctica de identidad y autorización. Entender qué resuelve OAuth2, qué agrega OpenID Connect y cómo manejar JWT de forma segura es clave para evitar confianza mal delegada, fuga de privilegios y sesiones difíciles de controlar.

Objetivo Usar tokens e identidades con criterio
Enfoque Protocolos, claims y ciclo de vida
Resultado Reducir riesgos de autenticación mal implementada

9.1 Introducción

En muchos sistemas modernos la identidad ya no se representa mediante sesiones de servidor tradicionales, sino mediante tokens. Esos tokens viajan entre clientes, gateways, APIs y servicios internos como prueba de autenticación o como evidencia de autorización delegada.

El problema es que con frecuencia se usan sin comprender bien qué significan. Se habla de OAuth, JWT y OpenID Connect como si fueran lo mismo, cuando en realidad resuelven problemas diferentes y se combinan con propósitos distintos. Esa confusión lleva a diseños inseguros, claims mal interpretados, privilegios demasiado amplios y dificultades para revocar o controlar acceso.

Este tema busca separar conceptos y establecer prácticas concretas para manejar tokens de forma segura en arquitecturas distribuidas.

9.2 Qué es OAuth2

OAuth2 es un marco de autorización delegada. Su objetivo principal no es autenticar usuarios, sino permitir que un cliente obtenga acceso limitado a un recurso protegido bajo ciertas condiciones. La pregunta que intenta resolver es: cómo autorizo a este cliente a acceder a este recurso sin entregarle credenciales permanentes del usuario.

Por eso OAuth2 se usa mucho cuando una aplicación necesita acceder a APIs en nombre de un usuario o en nombre propio, siempre bajo permisos definidos y tokens emitidos por una autoridad confiable.

OAuth2 trata de autorización delegada. No fue diseñado originalmente para decir quién es el usuario como propósito principal.

9.3 Qué es OpenID Connect

OpenID Connect, u OIDC, se construye sobre OAuth2 y agrega una capa de identidad. Permite que un cliente no solo obtenga autorización, sino también información verificable sobre la autenticación del usuario.

Gracias a OIDC aparece el concepto de ID Token, que representa información sobre la autenticación del usuario y su identidad en el contexto del proveedor. Esto vuelve a OIDC especialmente útil para login federado y para aplicaciones que necesitan saber quién es el usuario autenticado de manera estándar.

9.4 Qué es un JWT

JWT, o JSON Web Token, es un formato de token. No es un protocolo de autenticación ni de autorización por sí mismo. Puede usarse en muchos contextos, incluidos OAuth2 y OIDC, para transportar claims firmados digitalmente.

Esto significa que:

  • OAuth2 no implica necesariamente JWT.
  • OIDC frecuentemente usa JWT para el ID Token.
  • Un JWT puede ser seguro o inseguro según cómo se emita, valide y utilice.

9.5 Tipos de tokens más comunes

Tipo Para qué sirve Riesgo principal
Access Token Acceder a recursos protegidos Si se filtra, habilita uso no autorizado hasta expirar
ID Token Representar autenticación e identidad del usuario Usarlo como si fuera access token
Refresh Token Obtener nuevos access tokens Mayor impacto si se compromete por su vida más larga

Distinguirlos es fundamental. Usar un token para algo distinto de su propósito suele abrir errores de seguridad difíciles de detectar.

9.6 Claims y significado

Los tokens suelen transportar claims: afirmaciones sobre identidad, audiencia, emisor, alcance, vigencia o atributos del actor. El problema no es solo técnico, sino semántico. Un claim mal interpretado puede abrir accesos indebidos aunque la firma sea válida.

Algunos claims frecuentes son:

  • iss: quién emitió el token.
  • aud: para quién está destinado.
  • sub: sujeto o identidad principal.
  • exp: fecha de expiración.
  • scope o equivalentes: alcance autorizado.

Validar estos claims correctamente es tan importante como validar la firma.

9.7 Validaciones mínimas obligatorias

Un token no debería aceptarse solo porque tiene formato correcto o porque parece bien firmado. También debe verificarse que realmente corresponde a ese contexto y a ese recurso.

  • Verificar firma o mecanismo criptográfico equivalente.
  • Validar emisor esperado.
  • Validar audiencia correcta para el servicio receptor.
  • Verificar expiración y, cuando aplique, tiempo de emisión.
  • Corroborar que el alcance o claims sirvan para la acción pedida.
Un token bien firmado pero emitido para otra audiencia sigue siendo inválido para tu servicio.

9.8 Tokens autoconclusivos versus tokens de referencia

Un JWT firmado suele ser autoconclusivo: contiene información suficiente para ser validado localmente sin consultar a la autoridad emisora en cada request. Esto mejora performance y desacople, pero también complica revocación inmediata y control fino de cambios de política.

Los tokens de referencia, en cambio, suelen requerir introspección o consulta a un servidor de autorización. Esto mejora control central, pero introduce dependencia y latencia.

Modelo Ventaja Desventaja
Autoconclusivo Validación local rápida Revocación y cambios inmediatos más difíciles
Referencia Control central más directo Mayor dependencia del servidor de autorización

9.9 Expiración y vida útil

La vida útil del token es una decisión de riesgo. Un token muy largo mejora comodidad, pero aumenta impacto si se filtra. Un token muy corto reduce ventana de abuso, pero exige mecanismos adecuados de renovación y puede afectar experiencia o complejidad operativa.

En general conviene:

  • Mantener access tokens relativamente cortos.
  • Reservar refresh tokens para contextos que realmente lo necesiten.
  • Aplicar controles más estrictos a tokens de mayor duración.
  • Evitar credenciales estáticas disfrazadas de tokens renovables.

9.10 Refresh tokens y rotación

Los refresh tokens permiten obtener nuevos access tokens sin reautenticar al usuario en cada ocasión. Son útiles, pero sensibles. Como suelen vivir más tiempo, su compromiso puede tener impacto mayor que el de un access token breve.

Por eso es recomendable:

  • Aplicar rotación cuando el proveedor y el caso lo permiten.
  • Detectar reutilización sospechosa.
  • Almacenarlos en lugares más protegidos que los access tokens.
  • Revocarlos explícitamente cuando cambia el riesgo o finaliza la sesión.

9.11 Manejo seguro del almacenamiento

Un token es una credencial. Tratarlo como un dato cualquiera es un error frecuente. El lugar donde se guarda y la forma en que se transporta influyen directamente en el riesgo de robo o abuso.

  • Evitar exponer tokens en logs, URLs o mensajes de error.
  • Proteger el almacenamiento según tipo de cliente y sensibilidad.
  • Reducir persistencia cuando no es necesaria.
  • Separar claramente tokens de usuario de secretos de servicio.

9.12 Propagación de tokens entre servicios

No siempre conviene reenviar el token original del usuario a todos los microservicios. A veces alcanza con que un servicio derive contexto mínimo o actúe con su propia identidad técnica. Propagar tokens sin criterio tiende a ampliar superficie de ataque y a confundir responsabilidades de autorización.

Antes de propagar un token, conviene preguntarse:

  • El servicio siguiente realmente necesita conocer la identidad original.
  • Necesita todos los claims o solo un subconjunto.
  • Sería mejor emitir un token delegado con alcance más acotado.
  • Cómo se registrará esa cadena de identidad para auditoría.

9.13 Errores comunes con JWT

  • Usar un ID Token como access token.
  • No validar audiencia o emisor.
  • Confiar en claims sin validar firma y vigencia.
  • Incluir demasiada información sensible en el payload.
  • Asumir que JWT significa automáticamente seguridad moderna.
Un JWT no cifra por defecto la información de negocio. Si contiene datos sensibles, cualquiera que lo vea puede leerlos si el formato es solo firmado y no cifrado.

9.14 OAuth2 y flujos apropiados

No todos los clientes deberían usar el mismo flujo. El diseño debe considerar si se trata de una aplicación interactiva, un backend confidencial, una integración máquina a máquina o un cliente con distinta capacidad de proteger secretos.

Elegir mal el flujo o tratar todos los clientes igual suele terminar en exposición innecesaria de credenciales, dificultad para revocar y trazabilidad deficiente.

9.15 Qué debes recordar de este tema

  • OAuth2, OIDC y JWT no son lo mismo y resuelven problemas distintos.
  • OAuth2 trata autorización delegada; OIDC agrega identidad; JWT es un formato de token.
  • Los tokens deben validarse por firma, emisor, audiencia, vigencia y alcance.
  • La vida útil, revocación y almacenamiento de tokens son decisiones críticas de seguridad.
  • Propagar tokens sin criterio amplía superficie de ataque y confunde responsabilidades.

9.16 Conclusión

El uso de tokens puede simplificar autenticación y autorización en arquitecturas distribuidas, pero solo cuando se entienden bien sus límites y significados. Separar protocolo, formato y propósito es fundamental para evitar errores de diseño que luego se convierten en privilegios mal otorgados o sesiones imposibles de controlar.

En el próximo tema estudiaremos la gestión de secretos, claves, certificados y rotación segura para profundizar cómo se protege el material sensible que sostiene identidad, cifrado y acceso entre componentes.