Generador JWT
Crear JSON Web Token con Header y Payload personalizados
¿Qué es JWT?
El generador JWT crea JSON Web Tokens a partir de un header, un payload y ajustes de firma. Un JWT tiene tres partes codificadas en Base64URL y se usa a menudo para transportar claims como ID de usuario, roles, expiración, emisor y audiencia entre servicios. La herramienta sirve para pruebas de API, desarrollo local, aprendizaje, depuración y creación rápida de tokens de ejemplo. Un token generado solo es confiable si la gestión de claves, el algoritmo, la expiración y la validación del servidor son correctos. No conviene pegar secretos en ejemplos públicos, algoritmos débiles o vidas demasiado largas son riesgosos, y datos sensibles no deberían ir en un payload sin cifrar.
Cómo usar
Flujo de generación de JWT
- Selecciona el algoritmo de firma (predeterminado HS256)
- Introdúcelo o haz clic en Generate para crear un secreto de firma
- Edita el JSON del Payload y usa los botones rápidos para añadir claims estándar
- Establece el tiempo de emisión (iat) y expiración (exp)
- Haz clic en el botón Generate JWT Token
- Copia el Token generado para pruebas o desarrollo
Seguridad del Token
- Usa secretos fuertes para algoritmos HMAC y protege las claves privadas para algoritmos RSA/ECDSA.
- Establece claims realistas de exp, iat, issuer y audience; un JWT sintácticamente válido aún puede ser inseguro o rechazado por tu servicio.
Casos de uso
Principio técnico
El generador y el parser de JWT son procesos inversos: el parser separa las tres partes y el generador las arma. El núcleo es calcular el segmento de Signature. Flujo de armado: 1) Construye el Header JSON, p. ej. {"alg":"HS256","typ":"JWT"}; 2) Construye el Payload JSON con claims estándar y privados; 3) Codifica Header y Payload por separado en Base64URL para obtener h_b64 y p_b64; 4) Une h_b64 y p_b64 con un punto para formar input = h_b64 + '.' + p_b64; 5) Calcula la firma según alg: HMAC-SHA256/384/512(secret, input); 6) Codifica el resultado de la firma en Base64URL; 7) El token final es input + '.' + sig_b64. Firma HMAC-SHA256: usa el secreto como clave (>= 32 bytes) y ejecuta HMAC sobre input. Internamente HMAC corre dos rondas de SHA-256: primero deriva claves ipad/opad del secreto y luego calcula SHA256(secret XOR ipad || msg) XOR opad. Fuerza de clave: la longitud del secreto determina la seguridad. RFC 7518 exige claves HS256 >= 256 bits (32 bytes). En producción usa siempre un RNG criptográficamente seguro (p. ej. crypto.randomBytes); nunca uses cadenas como 'secret', 'password' o '123456'. Errores comunes: 1) Ataque de sustitución de alg: el servidor debe validar alg estrictamente y no debe tomar alg del header del token para despachar al algoritmo correspondiente; 2) Claves débiles: un secreto corto se rompe por fuerza bruta; 3) Manipulación del payload: HMAC garantiza integridad — si un atacante cambia el payload, la verificación falla; 4) Filtración del token: los JWT no son revocables, así que una vez fuera solo queda esperar el exp. Alcance de esta herramienta: solo se generan HS256/HS384/HS512. Algoritmos asimétricos como RS256 (RSA) y ES256 (ECDSA) requieren una clave privada en el emisor y los produce un servicio de firma en el backend o un SDK específico, no esta página.
- Núcleo de firma HMAC-SHA256: HMAC(secret, header_b64 + '.' + payload_b64), produce una firma de 256 bits y la codifica en Base64URL.
- La longitud de la clave HS256 debe ser >= 32 bytes (256 bits); se recomienda generar con crypto.getRandomValues o crypto.randomBytes: las claves cortas son vulnerables a ataques de diccionario.
- Esta herramienta solo genera tokens con firma HMAC (HS256/HS384/HS512). Algoritmos asimétricos como RS256 o ES256 requieren que el emisor custodie una clave privada y no se producen aquí; usa un servicio de firma en el backend o un SDK específico para esos casos.
- iat/exp/nbf son marcas de tiempo Unix en segundos (no milisegundos); los servidores normalmente requieren exp > ahora(), nbf <= ahora() e iat <= ahora().
- Ataque alg=none: mantener una lista blanca de algoritmos permitidos en el lado del servidor (p. ej. ['HS256']); nunca elegir el algoritmo dinámicamente desde el header del token. Muchas librerías JWT históricamente permitían alg=none por defecto: esa es una vulnerabilidad conocida.
- Un JWT no se puede revocar una vez emitido: el único recurso es esperar a exp. Para revocación activa, mantener una lista negra de jti o usar un token de acceso de corta duración más un token de actualización.
Ejemplos
Ejemplo básico HS256
Header: {"alg":"HS256","typ":"JWT"}
Payload: {"sub":"user-123","name":"Alice","role":"admin","iat":1705312800,"exp":1705399200}
Secret: my-super-secret-key-32-bytes-long
Token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ1c2VyLTEyMyIsIm5hbWUiOiJBbGljZSIsInJvbGUiOiJhZG1pbiIsImlhdCI6MTcwNTMxMjgwMCwiZXhwIjoxNzA1Mzk5MjAwfQ.7Hk2L9oP3qR1mN4vK8xJ2wE5yT6sB0fA9cZ1dG3hI4UVencimiento personalizado con iat y exp
Header: {"alg":"HS256","typ":"JWT"}
Payload: {"iss":"https://auth.example.com","sub":"user-456","aud":"api.example.com","iat":1705312800,"exp":1705316400}
Secret: another-strong-secret-32-bytes-long
La página codifica el header y el payload en Base64URL, los une con un punto y aplica HMAC-SHA256 con el secreto compartido. El campo Token muestra la cadena final de tres segmentos lista para pegar en cabeceras Authorization.Claims personalizados
Header: {"alg":"HS256","typ":"JWT"}
Payload: {
"sub": "user-789",
"name": "Bob",
"role": "editor",
"tenant": "acme-corp",
"permissions": ["read:docs", "write:docs"],
"scope": "docs.read docs.write",
"iat": 1705312800,
"exp": 1705399200,
"jti": "550e8400-e29b-41d4-a716-446655440000"
}Preguntas frecuentes
¿El JWT se genera localmente?
Sí. La cabecera, el payload y la firma se calculan en tu navegador usando la Web Crypto API. El secreto de firma o la clave privada nunca salen de la página. Trata el token en sí como datos que pueden registrarse o exponerse, sobre todo si lo pegas en un servicio real.
¿Qué algoritmos de firma se admiten?
Esta herramienta genera HS256, HS384 y HS512 (HMAC con secreto compartido). Los algoritmos asimétricos como RS256/RS384/RS512 (RSA) y ES256/ES384/ES512 (ECDSA) no se producen aquí; usa un servicio de firma en el backend o un SDK específico si tu validador los exige. Evita alg=none en producción: cualquier validador sensato rechaza tokens sin firmar.
¿Qué va en el payload?
Reclamos estándar como sub, iss, aud, exp, iat, nbf más cualquier reclamo personalizado que use tu servicio. Mantén el payload pequeño: los JWT viajan en cabeceras y crecen en cada petición. Nunca pongas contraseñas, números completos de tarjeta de crédito ni otros secretos dentro; el payload está en Base64URL, no cifrado.
¿Cómo establezco el tiempo de expiración?
Establece exp como la marca de tiempo Unix (segundos, no milisegundos) en la que el token debe dejar de ser válido. Los tokens sin exp son técnicamente legales, pero la mayoría de los servicios de producción exigen uno. Los valores habituales son de 5 a 60 minutos para tokens de acceso y de 7 a 30 días para tokens de refresco.
¿Por qué falla la verificación de mi JWT generado?
Causas habituales: el alg de la cabecera no coincide con el que espera el verificador; el secreto/clave es distinto; los reclamos del payload (iss, aud) no coinciden con la configuración del servidor; la diferencia de reloj entre emisor y verificador supera el margen permitido (típicamente ±60 s); una edición manual rompió la codificación Base64URL (no añadas saltos de línea).
¿Se envía mi secreto o clave privada a un servidor?
No. La firma ocurre íntegramente en el navegador mediante Web Crypto. Dicho esto, nunca pegues una clave de firma de producción en ninguna herramienta web: prueba con una clave que no sea de producción y luego firma en tu backend real.
¿Debería usar HS256 o RS256?
HS256 necesita que ambos lados compartan un secreto, así que solo encaja cuando el mismo servicio emite y verifica el token. RS256 (o ES256) permite que el emisor guarde una clave privada mientras cada consumidor verifica con la clave pública: la elección correcta para OAuth/OIDC y cualquier arquitectura multiservicio. Esta herramienta solo genera tokens de la familia HS; para RS256/ES256, usa un servicio de firma en el backend o un SDK específico.