Token opaco vs JWT
Entender las diferencias entre los tokens opacos y los JWT, sus casos de uso, y cómo se validan en sistemas basados en OIDC.
Entender las diferencias entre los tokens opacos y los JWT, sus casos de uso, y cómo se validan en sistemas basados en OIDC.
En Logto, como una plataforma CIAM integral basada en OIDC, los tokens de autorización juegan un papel crucial en la seguridad de las interacciones de usuario y la gestión del acceso a los recursos. Entre los diversos tipos de tokens utilizados para la autorización, los tokens opacos y los JWTs (JSON Web Tokens) son los más importantes.
Hemos recibido varias preguntas de nuestra comunidad, tales como: ¿Cuál es la diferencia entre un token opaco y un JWT? ¿Por qué no puedo decodificar el token de acceso que recibí, y por qué la longitud del token parece corta? Este artículo de blog tiene como objetivo aclarar estos conceptos y ayudar a entender las distinciones entre los tokens opacos y los JWTs, sus casos de uso, y por qué podrías encontrar diferentes comportamientos al trabajar con ellos.
Un token opaco es un tipo de token de acceso que, como su nombre indica, es opaco o no transparente para el cliente o cualquier parte externa. Esto significa que el propio token no lleva información legible sobre el usuario o la autorización concedida.
Cuando recibes un token opaco, a menudo aparece como una cadena aparentemente aleatoria de caracteres, e intentar decodificarlo no producirá datos significativos.
Aquí hay un ejemplo de un token opaco:
Dado que el contenido real del token solo es conocido por el servidor de autorización que lo emitió, para validar un token opaco, el cliente debe enviarlo de vuelta al servidor, que luego verifica su autenticidad y determina los permisos asociados. Este enfoque asegura que la información sensible permanezca oculta, proporcionando una capa adicional de seguridad, pero también requiere comunicación adicional con el servidor para validar el token.
Pros:
Contras:
En contraste con los tokens opacos, un JWT (JSON Web Token) es un token sin estado y auto-contenido que lleva información en un formato estructurado y legible.
Un JWT se compone de tres partes: un header, un payload, y una signature, cada uno codificado en Base64URL.
Aquí hay un ejemplo de un JWT:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5cheader contiene información sobre el tipo de token y el algoritmo utilizado para firmar. Por ejemplo, { "alg": "HS256", "typ": "JWT"}.payload contiene claims—piezas de información sobre el usuario o la autorización—como el ID del usuario, tiempo de expiración y alcances. Debido a que estos datos están codificados pero no cifrados, cualquiera que tenga el token puede decodificarlo para ver los claims, aunque no pueden alterarlo sin invalidar la firma. Basado en la especificación y configuración del servidor de autorización, varios claims pueden incluirse en el payload. Esto le da al token su naturaleza auto-contenida. Por ejemplo, { "sub": "1234567890", "name": "John Doe", "iat": 1516239022}.signature se genera combinando el header, payload y una clave secreta usando el algoritmo especificado. Esta firma se usa para verificar la integridad del token y asegurar que no se ha alterado.Los JWTs son comúnmente utilizados porque pueden ser verificados localmente por el cliente o cualquier servicio, sin necesidad de interactuar con el servidor de autorización. Esto hace que los JWTs sean particularmente eficientes para sistemas distribuidos, donde múltiples servicios pueden necesitar verificar la autenticidad del token independientemente.
Sin embargo, esta conveniencia también viene con la responsabilidad de asegurar que los claims del token no estén expuestos en exceso, ya que son visibles para cualquiera que tenga acceso al token. Además, los JWTs suelen ser de corta duración, y el tiempo de expiración se incluye en los claims del token para asegurar que el token no sea válido indefinidamente.
Pros:
Contras:
Un token de acceso opaco se valida enviándolo de vuelta al servidor de autorización para su verificación. El servidor de autorización mantiene el estado de los tokens emitidos y puede determinar la validez del token basándose en su almacenamiento interno.
Un token de acceso JWT puede validarse offline por el cliente o cualquier servicio que tenga acceso a la clave pública del token.
En el contexto de OIDC (OpenID Connect), los tokens opacos y los JWTs sirven diferentes propósitos y se utilizan en diferentes escenarios.
Por defecto, cuando un cliente solicita un token de acceso sin especificar un recurso y incluye el alcance openid, el servidor de autorización emite un token de acceso opaco. Este token se utiliza principalmente para recuperar información del perfil de usuario desde el punto final OIDC /oidc/userinfo. Al recibir una solicitud con el token de acceso opaco, el servidor de autorización verifica su almacenamiento interno para recuperar la información de autorización asociada y verifica la validez del token antes de responder con los detalles del perfil del usuario.
Los tokens de actualización están diseñados para ser intercambiados únicamente entre el cliente y el servidor de autorización, sin necesidad de ser compartidos con proveedores de recursos. Como tal, los tokens de actualización suelen ser emitidos como tokens opacos. Cuando el token de acceso actual expira, el cliente puede usar el token de actualización opaco para obtener un nuevo token de acceso, asegurando acceso continuo sin re-autenticar al usuario.
En OIDC, el token ID es un JWT que contiene información del usuario y se utiliza para autenticar al usuario. Típicamente emitido junto con el token de acceso, el token ID permite al cliente verificar la identidad del usuario. Por ejemplo:
El cliente puede validar el token ID para asegurar la identidad del usuario y extraer información del usuario para personalización o propósitos de autorización. El token ID es para un solo uso y no debe ser usado para la autorización de recursos API.
Cuando un cliente solicita un token de acceso con un indicador de recurso específico, el servidor de autorización emite un token de acceso JWT destinado a acceder a ese recurso. El JWT contiene claims que el proveedor de recursos puede usar para autorizar el acceso del cliente. Por ejemplo:
El proveedor de recursos puede validar la solicitud verificando los claims:
iss: Confirma que el token fue emitido por un servidor de autorización de confianza.sub: Identifica al usuario asociado con el token.aud: Asegura que el token está destinado para el recurso específico.scope: Verifica los permisos concedidos al usuario.En resumen, los tokens opacos y los JWTs sirven diferentes propósitos en sistemas basados en OIDC, con los tokens opacos proporcionando un enfoque seguro y con estado para la autorización y los JWTs ofreciendo una alternativa auto-contenida y sin estado. Entender las distinciones entre estos tipos de tokens y sus casos de uso es esencial para diseñar mecanismos de autenticación y autorización seguros y eficientes en tus aplicaciones.
Descubre más características de tokens de acceso en Logto: