Decodificador y codificador de JWT: decodifica, verifica y firma JSON Web Tokens
Decodifica la cabecera y el payload de un JWT, lee la caducidad en lenguaje claro, verifica firmas HS, RS, PS y ES o firma un token nuevo. Nada sale de tu navegador.
{
"alg": "HS256",
"typ": "JWT"
}{
"sub": "user_42",
"name": "Ada Lovelace",
"role": "admin",
"iat": 1757320000,
"exp": 1788856000
}| sub | Sujeto | user_42 |
| name | Ada Lovelace | |
| role | admin | |
| iat | Emitido | 1757320000 |
| exp | Caduca | 1788856000 |
El token de ejemplo está firmado con el secreto demo-secret-do-not-use.
Decodificar nunca comprueba la firma: cualquiera puede leer un JWT, solo la firma demuestra quién lo emitió. Los tokens HS* necesitan el secreto compartido; RS*, PS*, ES* y EdDSA necesitan la clave pública del emisor (PEM, certificado, JWK o el JWKS de su /.well-known/jwks.json, elegido por kid). No pegues secretos ni claves privadas de producción en ninguna página web, tampoco en esta; usa claves de prueba.
Los tokens y las claves se procesan en tu navegador con WebCrypto y nunca se envían a ningún sitio; aun así, trata un token o una clave de producción pegados como una credencial. Ver todas las herramientas gratis.
¿Encontraste un problema o algo que podría mejorar? Leemos todos los mensajes y lo arreglamos rápido.
Este decodificador de JWT gratis muestra la cabecera, el payload y los claims de un JSON Web Token, convierte exp, iat y nbf en fechas legibles con un resultado claro de válido o caducado, verifica la firma (HMAC con un secreto, o RSA, RSA-PSS, ECDSA y Ed25519 con una clave pública, un certificado o un JWK) e incluye un codificador que firma tokens nuevos para hacer pruebas. Todo ocurre en tu navegador, y aquí eso importa más que en la mayoría de las herramientas: un token pegado suele ser una credencial activa, y no debería enviarse al servidor de nadie, tampoco al nuestro.
Un JWT son tres secciones Base64URL separadas por puntos: una cabecera que indica el algoritmo, un payload de claims y una firma. Las dos primeras no están cifradas, solo codificadas, así que cualquiera puede leerlas; la firma es lo que demuestra quién emitió el token y que no se ha modificado. Por tanto, decodificar no es lo mismo que confiar, y la página deja esa distinción a la vista.
Cómo usarla
- Pega el token. Si empieza por “Bearer ” porque viene de una cabecera Authorization, no pasa nada: se quita.
- Lee la línea de estado: cuánto tiempo sigue siendo válido, desde cuándo está caducado o si todavía no es válido.
- Revisa el payload y la tabla de claims. Los claims de tiempo se muestran como fechas locales junto a los segundos Unix originales.
- Para verificar, pulsa Verificar después de introducir la clave: el secreto compartido para HS256/384/512, o para los tokens RS, PS, ES y EdDSA la clave pública del emisor en PEM, certificado, JWK o el JWKS completo (la clave se elige por el kid del token).
- Para crear un token, cambia a Codificar y firmar, elige el algoritmo, edita el JSON de la cabecera y del payload e introduce un secreto o pega una clave privada PKCS#8 (o genera un par de claves de prueba). Firma y ábrelo en el decodificador para verificarlo.
- Copia el payload o la cabecera como JSON formateado si lo necesitas para un informe de error o unos datos de prueba.
Preguntas frecuentes
¿Es seguro pegar aquí un token real?
El token se decodifica con JavaScript en tu navegador y nunca se transmite; puedes desconectarte de internet y la página sigue funcionando. Dicho esto, trata un token de producción como una contraseña: no lo pegues en ninguna página en la que no confíes y, cuando puedas, usa mejor un token de prueba de corta duración.
¿Por qué puedo leer el payload sin el secreto?
Porque los JWT están firmados, no cifrados. El payload es JSON codificado en Base64URL que cualquiera puede decodificar. El secreto (o la clave privada) solo hace falta para crear o verificar la firma. No pongas nunca datos sensibles en el payload de un JWT a menos que uses JWE, la variante cifrada, que esta herramienta no decodifica.
¿Qué significan exp, iat y nbf?
Son marcas de tiempo Unix en segundos. exp es cuándo caduca el token; iat es cuándo se emitió; nbf (not before) es el primer momento en que es válido. Un verificador debe rechazar un token después de exp o antes de nbf. La línea de estado de esta página aplica las dos reglas a la hora actual.
¿Cómo verifico un token RS256 o ES256?
Necesitas la clave pública del emisor, nunca la privada. Los proveedores de identidad la publican como un JWKS en una URL como https://issuer/.well-known/jwks.json (Auth0, Okta, Cognito, Azure AD y Google lo hacen). Pega el JWKS completo y se usará la clave cuyo kid coincida con la cabecera del token, o pega un único JWK, una clave pública PEM (BEGIN PUBLIC KEY) o un certificado X.509. La página no descarga nada por su cuenta, así que copia el JWKS desde tu navegador.
¿Puedo crear y firmar un JWT aquí?
Sí. Codificar y firmar toma el JSON de la cabecera y del payload y firma con HS256/384/512 y un secreto, o con RS, PS, ES o EdDSA y una clave privada en formato PEM PKCS#8 (BEGIN PRIVATE KEY). Los archivos antiguos BEGIN RSA PRIVATE KEY son PKCS#1; conviértelos con openssl pkcs8 -topk8 -nocrypt -in key.pem. Usa solo claves de prueba: una clave de firma de producción pegada en cualquier página web debe considerarse comprometida.
¿Qué significa “alg: none” y por qué aparece el aviso?
Declara que el token no tiene firma. Algunas bibliotecas aceptaban antes esos tokens como válidos, lo que permitía a los atacantes falsificar cualquier payload. Un verificador bien configurado rechaza alg none directamente. Si lo ves en un sistema real, es un hallazgo de seguridad, no una curiosidad.
Anatomía de un JWT
Cabecera: {"alg":"HS256","typ":"JWT"} indica al verificador qué algoritmo firmó el token. Payload: los claims, un objeto JSON con lo que el emisor haya decidido incluir, más los claims registrados (iss, sub, aud, exp, nbf, iat, jti) que entienden los verificadores. Firma: un HMAC o una firma digital sobre base64url(header).base64url(payload). Cambia un solo carácter del payload y la firma deja de coincidir, que es justo de lo que se trata.
Errores habituales con JWT
• Confiar en el payload sin verificar la firma, o verificar con el algoritmo que indica el token en lugar del que espera el servidor (confusión de algoritmo).
• Tokens de acceso de larga duración. Mantén exp corto (de minutos a una hora) y usa un token de actualización para sesiones más largas.
• Poner datos personales o secretos en el payload; cualquiera que tenga el token puede leerlos.
• Guardar tokens en localStorage en un sitio con cualquier exposición a XSS. Una cookie httpOnly es más segura para las sesiones en el navegador.
• Olvidar comprobar aud e iss, lo que permite reutilizar contra otro servicio un token emitido para uno distinto.
• Secretos HMAC demasiado cortos o elegidos por una persona. HS256 necesita al menos 256 bits (32 bytes aleatorios); un secreto adivinable se puede descifrar por fuerza bruta sin conexión a partir de un único token.
Qué algoritmo de firma elegir
• HS256 (HMAC-SHA256): un único secreto compartido sirve para firmar y verificar. Sencillo y rápido, pero cualquier servicio que verifica también puede emitir tokens. Está bien dentro de un mismo backend.
• RS256 (RSA PKCS#1 v1.5 con SHA-256): la opción asimétrica más compatible; el emisor guarda la clave privada y todos los demás verifican con la clave pública. Las firmas ocupan 256 bytes con una clave de 2048 bits.
• PS256 (RSA-PSS): las mismas claves que RS256 con un esquema de relleno más moderno; úsalo cuando todos los consumidores lo admitan.
• ES256 (ECDSA P-256): claves mucho más pequeñas y firmas de 64 bytes con una seguridad comparable; habitual en sistemas más recientes y obligatorio en algunos (Apple, APIs cercanas a WebAuthn).
• EdDSA (Ed25519): firmas rápidas y deterministas, cada vez más admitidas por las bibliotecas; llegó a los navegadores más tarde que los demás.
Herramientas gratis relacionadas
- Codificador / decodificador Base64 — Codifica texto o archivos en Base64, convierte imágenes en data URI con fragmentos CSS e <img>, y decodifica Base64 a un archivo con vista previa. Nada sale de tu navegador.
- Formateador JSON — Formatea, minifica y valida JSON, con los errores de análisis localizados por línea y columna. En tu navegador, sin subir nada.
- Generador de contraseñas — Genera una contraseña aleatoria segura, una frase de contraseña fácil de recordar o un PIN. Funciona por completo en tu navegador: no se envía ni se guarda nada.