Decodificar un JWT
Mira el encabezado, las claims y la expiración de un JSON Web Token. Un token es una credencial válida, así que aquí nada se envía a ningún lugar ni se guarda, nunca.
- Nunca se guarda
- Sin filas ni esperas
- Sin registro, sin marca de agua
Tu token nunca sale de esta página. Se decodifica aquí mismo, sin ninguna solicitud a un servidor, y eso importa, porque un JWT suele ser una credencial válida. Desactiva el wifi cuando la página haya cargado y seguirá decodificando: no se envía nada.
El prefijo “Bearer ” no es problema: se ignora.
Cómo funciona
Pega el token
Con o sin el prefijo “Bearer ”. Se queda en esta página; no se hace ninguna solicitud.
Lee las tres partes
Encabezado, payload y firma, cada uno decodificado y formateado. Las marcas de tiempo se convierten en fechas reales y se te dice cuánto tiempo queda.
Revisa los avisos
Los tokens vencidos, la falta de expiración, el algoritmo “none” y otros problemas se señalan junto con lo que significan.
Qué se comprueba y qué solo se lee
Todo en esta página, salvo dos comparaciones de fechas, es transcripción. El encabezado y el payload se decodifican desde Base64URL y se muestran; la firma se copia tal cual y nunca se toca, porque aquí no hay ninguna clave y no se ejecuta ninguna criptografía. Los dos juicios que sí hace la página son aritmética contra el reloj de tu propio dispositivo: la claim de expiración comparada con el momento actual, y la claim de no antes de comparada con el momento actual. No se deja margen para el desfase de reloj, cuando un servidor que comprueba el mismo token normalmente admite uno o dos minutos. Una laptop que va cinco minutos adelantada te mostrará como vencido un token vigente, y el token estará perfectamente bien.
Dos detalles del análisis deciden lo que ves en realidad. Las claims de tiempo se leen solo cuando llegan como números JSON: un token cuya expiración se escribió como la cadena “1699999999” se trata como si no tuviera expiración, y recibe el aviso de que nunca expira por sí solo, justo lo contrario de la verdad. Y el payload se analiza con el analizador JSON propio del navegador, no con el que conserva los dígitos detrás de nuestras herramientas de JSON, así que una claim numérica de 64 bits, como un ID de usuario tipo snowflake en el sujeto, se muestra con los últimos dígitos redondeados. Los identificadores de un JWT suelen ser cadenas justamente por eso; cuando uno no lo es, léelo del payload sin procesar y no de la tabla de claims.
Un token con cinco secciones se rechaza como JWE cifrado, y ese juicio se basa solo en la cantidad de secciones, sin leer el encabezado: acierta en la práctica, y conviene saber que es un atajo. Todo lo que no tenga tres secciones se rechaza directamente, igual que un payload que se decodifica como un array JSON o una cadena suelta en lugar de un objeto. Se muestran avisos para el algoritmo “none” y para la familia HS, donde la clave de firma es un secreto compartido y no una clave pública. Los tokens firmados con RS, ES o PS no generan ningún aviso, así que el silencio de esta página significa que no hay ninguna forma conocida como problemática, no que el token esté aprobado.
Si buscas otra cosa
Aquí no se guarda nada, que es la única razón por la que esta página puede existir razonablemente, y aun así no es el hábito que conviene formar. Una afirmación sobre privacidad no se comprueba leyéndola: desconéctate después de que cargue la página y mira cómo el decodificador sigue funcionando, que es precisamente lo que no puede hacer una herramienta con un servidor detrás. Y si un token que pegaste en algún lugar que no puedes auditar sigue siendo válido, cámbialo en lugar de darle vueltas. Cambiarlo es un minuto de trabajo. La alternativa es una larga discusión contigo mismo sobre una credencial que todavía abre la puerta. Para leer un token en tu computadora en lugar de en una pestaña, el payload es una línea de shell: corta el segundo campo separado por puntos, pásalo por base64 -d y luego por jq.
Cuando la pregunta es si un token es auténtico y no qué dice, esta es la página equivocada por diseño, igual que cualquier otro decodificador en línea. La verificación va donde ya está la clave: la biblioteca de JWT de tu propio lenguaje, en tu servidor, comprobando contra el JWKS publicado por el emisor. Son unas pocas líneas, es la única respuesta que significa algo, y cualquier sitio que se ofrezca a hacerlo por ti te está pidiendo el único secreto que nunca deberías darle a un sitio web.
Preguntas frecuentes
¿Se envía mi token a algún lugar?
No, y en esta página eso es todo el sentido, no una función más. Un JWT suele ser una credencial válida: quien lo tenga puede actuar en tu nombre hasta que expire. Pegarlo en un decodificador en línea que lo envía a un servidor es entregar una llave que funciona, y ninguna promesa de no registrarlo puede deshacer eso. Este decodificador es JavaScript simple en la página que estás viendo. No se guarda nada, no se registra nada y no se hace ninguna solicitud. Una vez que la página haya cargado, desactiva el wifi y funciona exactamente igual. Es la forma más sencilla de comprobar por ti mismo lo que decimos sobre privacidad, en lugar de creernos.
¿Esto verifica la firma?
No, y ningún decodificador en línea puede hacerlo honestamente sin tu clave de firma. Decodificar y verificar son operaciones completamente distintas. Decodificar solo deshace el Base64 del token: cualquiera puede hacerlo con cualquier token, y no demuestra absolutamente nada sobre si el token es auténtico. Verificar significa volver a calcular la firma con el secreto o la clave pública que la creó, y esa clave nunca debería pegarse en un sitio web. Lo que ves aquí es lo que el token DECLARA. Si esas declaraciones son confiables es una pregunta que solo tu servidor, que tiene la clave, puede responder.
¿Alguien puede leer un JWT que le envío?
Sí, por completo, y esto sorprende a mucha gente. Un JWT está firmado, no cifrado. El encabezado y el payload son Base64, que es una codificación sin ningún secreto, así que cualquiera que intercepte el token puede leer todas las claims que contiene. La firma impide que lo MODIFIQUEN; no hace nada para impedir que lo LEAN. Nunca pongas nada confidencial en el payload de un JWT: ni contraseñas, ni números de tarjeta, ni datos personales que no escribirías en una postal.
¿Qué significa el aviso del algoritmo “none”?
Que el token dice que no está firmado, y es uno de los hallazgos más graves que informa esta página. `alg: none` es una forma documentada de saltarse la autenticación: un atacante toma un token real, cambia el payload para decir que es administrador, pone el algoritmo en “none”, quita la firma, y una biblioteca que confía en el encabezado lo acepta. Todas las bibliotecas de JWT serias ya lo bloquean por defecto, pero todavía existen implementaciones que confían en `alg`. Un token que llega con `alg: none` debe tratarse como un ataque hasta que se demuestre lo contrario.
¿Cómo leo la expiración?
Se hace por ti. `exp`, `iat` y `nbf` son marcas de tiempo Unix (segundos desde 1970), ilegibles como números en bruto. Cada una se muestra como una fecha real en tu propia zona horaria, con cuánto tiempo hace o cuánto falta, y un token vencido se indica claramente en lugar de dejar que lo calcules tú. También se señala un token sin `exp`: un JWT que nunca expira no se puede revocar por vencimiento, y sigue siendo válido mientras lo sea la clave de firma.
Mi token tiene cinco partes, no tres
Entonces es un JWE, cifrado y no solo firmado, y su contenido realmente no se puede leer sin la clave de descifrado. La página reconoce la forma y te lo dice en lugar de mostrarte basura. Cinco partes significa que el payload es texto cifrado de verdad; no hay nada que decodificar.
¿Cuáles son las claims estándar?
Las registradas son: `iss`, quién lo emitió; `sub`, sobre quién es (normalmente un ID de usuario); `aud`, para quién es; `exp`, cuándo expira; `nbf`, no válido antes de; `iat`, cuándo se emitió; y `jti`, un ID único del token. Todo lo demás es propio de quien construyó el sistema. En el resultado, cada claim registrada lleva una etiqueta con su significado, así que no necesitas recordar qué abreviatura de tres letras es cuál.
Conviene saber: Esto decodifica; no verifica. La firma de un JWT demuestra que el token no se alteró, y comprobarla requiere el secreto o la clave pública del emisor, que nunca deberías pegar en una página web. Trata todo lo que ves aquí como declarado, no como demostrado, y verifícalo en tu servidor.
Agrega esta herramienta a tu sitio web
Gratis para cualquier blog, página de clase o artículo de ayuda. Pega un fragmento de código y tus visitantes podrán usarla directamente en tu página.
Más Herramientas para desarrolladores
Decodificar Base64
Convierte Base64 de nuevo en texto o en un archivo
Formatear JSON
Convierte un JSON ilegible en uno legible
Generador de hash
MD5, SHA-1, SHA-256, SHA-384 y SHA-512
Codificar Base64
Convierte texto o un archivo a Base64
Generador de UUID
v4 para secretos, v7 para claves de base de datos
Validar JSON
Descubre exactamente dónde falla tu JSON