Skip to Content
SNS Docs
Web

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:

  1. Header (Encabezado): Indica el tipo de token y el algoritmo de firma utilizado.
  2. Payload (Carga Útil): Contiene las declaraciones (claims) que transportan la información.
  3. Signature (Firma): Asegura que el token no ha sido alterado y valida su autenticidad.

Estructura de un JWT

eyJhbGciOiAiSFMyNTYiLCAidHlwIjogIkpXVCJ9.eyJzdWIiOiAiMTIzNDU2Nzg5MCIsICJuYW1lIjogIkpvaG4gRG9lIiwgImVtYWlsIjogImpvaG5AZXhhbXBsZS5jb20iLCAiZXhwIjogMTYyNzE5MzU1NH0.V92jOk6FeC0f47wIk5ZoMx7S-p7h3AQvtdlRGq-E5z8

Los 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

  1. 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.
  2. Transmisión del Token: El JWT se transmite entre el cliente y el servidor, normalmente en un encabezado HTTP Authorization: Bearer <token>.
  3. 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

  1. 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 userID del usuario y lo envía al cliente.
    • El cliente incluye el JWT en los encabezados de solicitudes futuras.
  2. 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 admin o user, que el servidor verifica para determinar el acceso a ciertos recursos.
  3. 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.
  4. 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

On this page