Comprendiendo los tokens de acceso, los tokens de actualización y los tokens de ID en el protocolo OpenID Connect (OIDC)
El Protocolo OpenID Connect (OIDC) se ha convertido en un estándar ampliamente adoptado para la gestión de identidades. Pero, ¿realmente entiendes los roles y atributos de estos tokens?
OIDC, OAuth 2.0, y tokens
El Protocolo OpenID Connect, también conocido como OIDC, se ha convertido en un estándar ampliamente adoptado para proporcionar un marco fundamental para la gestión de identidades. Es una capa de autenticación construida sobre el conocido protocolo OAuth 2.0. Mientras que OAuth 2.0 es simplemente para la autorización de recursos, OIDC es el protocolo que estandariza y fortalece la autenticación del cliente, con la ayuda del nuevo token de ID introducido.
Espera... ¿Has escuchado sobre los tokens de acceso y los tokens de actualización en la era de OAuth, y ahora viene el nuevo concepto en OIDC? ¿Realmente entiendes las diferencias entre estos tokens?
¿Qué son los tokens de acceso, los tokens de actualización y un token de ID en OIDC?
Comencemos con un escenario práctico.
Imagina que estás desarrollando una aplicación cliente-servidor típica, y se comunican entre sí a través de APIs RESTful. Deseas mantener la mayoría de tus APIs privadas, permitiendo solo a clientes autorizados acceder. Necesitarás un mecanismo para autenticar al cliente y autorizar las solicitudes de API a tu servidor.
Idealmente, tus APIs RESTful deberían ser sin estado, lo que significa que el servidor no debería almacenar ninguna información de sesión del cliente. Siempre que llegue una solicitud válida, el servidor debería simplemente responder con los datos solicitados. Aquí es donde entran en juego los tokens. Entonces, ¿qué tipo de token deberías usar en tal caso?
Los tokens de acceso se usan para proteger tus APIs
En OAuth 2.0 y OIDC, cada API protegida se trata como un recurso. El token de acceso es el token que el cliente transmite al servidor cuando solicita un recurso de API, típicamente a través del encabezado de la solicitud y en formato JWT.
En el lado del servidor, siempre que llega una solicitud, el servidor solo necesita validar si la solicitud entrante lleva un token de acceso válido. El proceso de validación usualmente incluye decodificar el token JWT, verificar la firma y el tiempo de expiración, así como la reclamación de alcance para asegurar que el cliente tiene los permisos necesarios.
Sin embargo, podrías preguntarte: Si mi aplicación cliente puede tener un token de acceso válido después de un inicio de sesión exitoso, y usar el token de acceso para solicitar las APIs del servidor, ¿no es eso suficiente? ¿Por qué necesito los otros tokens?
Efectivamente, es una pregunta válida, y vamos a explicarlo paso a paso.
¿Por qué necesitamos tokens de actualización?
Aunque técnicamente los tokens de acceso cumplen con los requisitos mínimos para hacer que el sistema funcione, debido a preocupaciones de seguridad la validez de los tokens de acceso suele ser muy corta (típicamente una hora). Entonces imagina si solo tenemos tokens de acceso, los usuarios finales tendrán que volver a autenticarse cada vez que el token de acceso expire. Para aplicaciones web de una sola página modernas (SPAs) y especialmente aplicaciones móviles, cerrar sesión frecuentemente es una experiencia de usuario bastante dolorosa, aunque solo estamos tratando de proteger su seguridad.
Por lo tanto, necesitamos un equilibrio de seguridad de tokens y conveniencia del usuario. Por eso se introducen los tokens de actualización.
¿Por qué los tokens de actualización pueden tener una vida más larga?
Los tokens de acceso se usan para acceder a recursos de API, por lo que su naturaleza de corta duración ayuda a mitigar el riesgo de ser filtrados o comprometidos. Por otro lado, dado que los tokens de actualización solo se usan para intercambiar nuevos tokens de acceso, no se usan tan frecuentemente como los tokens de acceso y por tanto el riesgo de exposición se reduce. Por lo tanto, tener un período de validez más largo se considera aceptable para los tokens de actualización.
Asegurando la seguridad de los tokens de actualización
Dado que el token de actualización también se almacena en el lado del cliente, asegurar que no se comprometan es un desafío, especialmente para clientes públicos como aplicaciones web de una sola página (SPA) y aplicaciones móviles.
En Logto, los tokens de actualización tienen un mecanismo de rotación automático habilitado por defecto, lo que significa que el servidor de autorización emitirá un nuevo token de actualización una vez que cumpla con los criterios:
- Aplicaciones de una sola página: Reconocidas como clientes no restringidos por el remitente, estas aplicaciones requieren rotación de tokens de actualización. No se puede especificar el tiempo de vida del token de actualización.
- Aplicaciones nativas y aplicaciones web tradicionales: La rotación de tokens de actualización está habilitada de manera inherente, renovándose automáticamente al alcanzar el 70% de su tiempo de vida. Aprender más
Aunque aún tienes la opción de deshabilitar la rotación de tokens de actualización en la página de detalles de la aplicación en la consola de administración, se recomienda encarecidamente mantener esta medida de protección.
¿Qué es un token de ID y por qué es importante?
El token de ID es una característica única de OIDC que proporciona información de identidad sobre el usuario autenticado.
Mientras que los tokens de acceso se usan para acceder a recursos protegidos y los tokens de actualización se usan para obtener nuevos tokens de acceso, los tokens de ID se usan típicamente para almacenar en caché información del usuario en el lado del cliente, reduciendo la necesidad de hacer solicitudes adicionales al servidor de autorización para datos del usuario. En la mayoría de los casos, es incluso seguro decir que tener el token de ID es equivalente a que el usuario esté autenticado.
Mejores prácticas para manejar tokens
- Usa HTTPS: Siempre usa HTTPS para asegurar la comunicación entre el cliente y el servidor de autorización. Esto previene que partes no autorizadas intercepten y roben tokens.
- Establece un tiempo de expiración adecuado para los tokens: Los tokens de acceso deben tener una vida corta para minimizar el riesgo de exposición. Los tokens de actualización pueden tener un período de validez más largo.
- Habilita la rotación de tokens de actualización: Implementa la rotación de tokens de actualización para mitigar el riesgo de fuga de tokens de actualización.
- Usa control de acceso detallado: Usa alcances detallados para limitar los permisos de los tokens de acceso. S ólo solicita los permisos necesarios para la aplicación cliente. Evita usar los alcances "todos" o "administrador" para eludir la mayoría de las verificaciones de permisos a menos que sea absolutamente necesario.
Resumen: Diferencias clave de los tokens de acceso, tokens de actualización, y tokens de ID en OIDC
En el protocolo OIDC, los tokens de actualización, tokens de acceso y tokens de ID trabajan juntos para proporcionar autenticación de usuario segura y sin interrupciones.
- Los tokens de acceso proporcionan autorización para acceder a recursos protegidos.
- Los tokens de actualización eliminan la intervención del usuario para nuevos tokens de acceso.
- Los tokens de ID proporcionan información de usuario en caché en el cliente, mejorando el rendimiento.
Entender el rol y la importancia de estos tokens es crucial para los desarrolladores que implementan autenticación OIDC en sus aplicaciones.