JSON Web Token (JWT)
Es un estándar abierto (RFC 7519) que define un formato compacto y autónomo para representar información de manera segura entre partes. JWT se utiliza para transmitir información entre dos entidades de manera segura, utilizando firmas digitales o encriptación.
Componentes de un JWT
Un JWT está compuesto por tres partes codificadas en Base64Url, separadas por puntos:
- Header (Encabezado): Indica el tipo de token y el algoritmo de firma utilizado.
- Payload (Carga Útil): Contiene las declaraciones (claims) que transportan la información.
- Signature (Firma): Asegura que el token no ha sido alterado y valida su autenticidad.
Estructura de un JWT
eyJhbGciOiAiSFMyNTYiLCAidHlwIjogIkpXVCJ9.eyJzdWIiOiAiMTIzNDU2Nzg5MCIsICJuYW1lIjogIkpvaG4gRG9lIiwgImVtYWlsIjogImpvaG5AZXhhbXBsZS5jb20iLCAiZXhwIjogMTYyNzE5MzU1NH0.V92jOk6FeC0f47wIk5ZoMx7S-p7h3AQvtdlRGq-E5z8Los puntos dividen las tres partes que se mencionó anteriormente.
1. Header
El encabezado generalmente contiene dos partes:
- alg (Algorithm): El algoritmo de firma utilizado (por ejemplo, HMAC SHA256 o RSA).
- typ (Type): El tipo de token, que es
JWT.
2. Payload
El payload contiene las claims o declaraciones, que pueden ser de tres tipos:
- Registered Claims: Claims predefinidas por el estándar JWT, como
iss(emisor),exp(fecha de expiración),sub(sujeto), entre otras. - Public Claims: Claims definidas por usuarios para compartir información pública.
- Private Claims: Claims personalizadas, utilizadas entre las partes que comparten el token.
3. Signature
La firma se genera tomando el encabezado codificado en Base64Url y el payload codificado en Base64Url, y luego firmando estos con el algoritmo especificado en el encabezado usando una clave secreta o una clave privada.
Un ejemplo de decodificador de JWT con Python
jwt_token = "eyJhbGciOiAiSFMyNTYiLCAidHlwIjogIkpXVCJ9.eyJzdWIiOiAiMTIzNDU2Nzg5MCIsICJuYW1lIjogIkpvaG4gRG9lIiwgImVtYWlsIjogImpvaG5AZXhhbXBsZS5jb20iLCAiZXhwIjogMTYyNzE5MzU1NH0.V92jOk6FeC0f47wIk5ZoMx7S-p7h3AQvtdlRGq-E5z8"
header, payload, signature = jwt_token.split('.')
decoded_header = base64.urlsafe_b64decode(header + '==').decode('utf-8')
print("Header:", decoded_header)
decoded_payload = base64.urlsafe_b64decode(payload + '==').decode('utf-8')
print("Payload:", decoded_payload)
print("Signature:", signature)Igual puedes codificar o decodificar en esta página: https://www.jwt.io/
Cómo Funciona JWT
- Generación del Token: Un servidor o entidad emite un JWT después de verificar las credenciales de un usuario. El JWT incluye un encabezado, un payload con información relevante, y una firma generada con una clave secreta.
- Transmisión del Token: El JWT se transmite entre el cliente y el servidor, normalmente en un encabezado HTTP
Authorization: Bearer <token>. - Verificación del Token: El receptor del token (como un servidor) lo decodifica para leer el encabezado y el payload, y verifica la firma para asegurarse de que el token no ha sido alterado.
Aplicaciones Comunes de JWT
- Autenticación de Usuarios: JWT se usa para autenticación, donde el servidor emite un token al usuario después de una correcta autenticación, que luego el cliente usa para acceder a recursos protegidos.
Ejemplo:
- Un usuario se autentica en una aplicación web.
- El servidor genera un JWT con el
userIDdel usuario y lo envía al cliente. - El cliente incluye el JWT en los encabezados de solicitudes futuras.
- Autorización: JWT se usa para verificar permisos de acceso a diferentes recursos o funcionalidades basadas en el contenido del token.
Ejemplo:
- Un JWT puede contener roles de usuario, como
adminouser, que el servidor verifica para determinar el acceso a ciertos recursos.
- Un JWT puede contener roles de usuario, como
- Intercambio de Información: JWT puede ser utilizado para transmitir información entre diferentes sistemas o microservicios de manera segura.
Ejemplo:
- Un servicio A genera un JWT con información que un servicio B necesita para procesar una solicitud.
- Sistemas Distribuidos: JWT es común en arquitecturas de microservicios para autenticar y transmitir información entre servicios.
Ejemplo:
- Un servicio central emite un JWT que los microservicios pueden usar para validar solicitudes.
Ejemplos de Librerías para Trabajar con JWT
Aquí tienes algunas librerías populares para trabajar con JWT en diferentes lenguajes de programación:
- JavaScript/Node.js:
jsonwebtoken,auth0/node-jsonwebtoken - Python:
PyJWT,python-jose - Java:
jjwt,nimbus-jose-jwt - PHP:
firebase/php-jwt,lcobucci/jwt - Ruby:
jwt