MiServe DevTools

Tus pegatinas

Fija aquí tus herramientas. Se guardan en este navegador.

Decodificador, verificador y firmador de JWT

Decodifica un JSON Web Token, lee sus claims y su expiración, verifica la firma con un secreto o una clave pública y firma tokens HMAC.

Funciona en tu navegador. Nada de lo que pegas se sube.

Acerca de esta herramienta

Qué es un JWT

Un JSON Web Token firmado (RFC 7519) son tres cadenas Base64URL unidas por puntos: un header, un payload y una firma. El header indica cómo se firma el token (alg). El payload es un objeto JSON de claims, afirmaciones como de quién trata el token (sub), quién lo emitió (iss) y cuándo expira (exp). La firma se calcula sobre las dos primeras partes.

Decodificar no es verificar. El header y el payload solo están codificados, no cifrados: cualquiera que tenga un token puede leerlo, como hace esta página sin ninguna clave, y cualquiera puede escribir un token con los claims que quiera. Nunca pongas un secreto en el payload de un JWT, y nunca te fíes de un claim antes de verificar la firma.

Verificar la firma

HS256, HS384 y HS512 son HMAC: el mismo secreto firma y verifica, así que todo el que puede verificar también puede falsificar. RS256, PS256 y ES256 y sus variantes 384 y 512 son asimétricos: el emisor firma con una clave privada y tú verificas con la clave pública, que a menudo se publica como un JWK Set en el jwks_uri del emisor.

Pega el secreto, o la clave pública como PEM, como certificado X.509 o como JWK. La comprobación la hace la Web Crypto API de tu navegador. El resultado es uno de tres: la firma es válida, no es válida o no se pudo comprobar. En el último caso la página dice por qué: no hay clave, la clave tiene un tipo o una curva incorrectos, el algoritmo no es compatible, o el header dice "alg": "none", lo que significa que el token no está firmado en absoluto.

Una firma válida es necesaria, pero no suficiente. Un servicio real también debe comprobar la expiración, el emisor y la audiencia, y debe decidir por sí mismo qué algoritmo acepta en lugar de creer lo que dice el header del token.

Fechas, el token de ejemplo y la firma

exp, nbf e iat son timestamps Unix en segundos. La tabla de claims los muestra como fechas en tu zona horaria, y el indicador de encima dice si el token ha expirado, si aún no es válido o cuánto tiempo le queda de validez, según el reloj de tu dispositivo.

La página se abre con un token de ejemplo que se crea en tu navegador, emitido ahora y válido durante una hora. Está firmado con HS256 y el secreto de ejemplo devtools-sample-secret-not-for-production, y por eso se verifica. Ese secreto es público: no lo uses para nada real.

Firmar crea un token a partir del header y el payload que editas y de un secreto HMAC. Úsalo para pruebas y desarrollo local. Los tokens, secretos y claves que escribes se quedan en esta pestaña: no se envía, guarda ni registra nada.

Preguntas

¿Es seguro pegar un JWT aquí?

El token se decodifica y se verifica con JavaScript en tu navegador y no se envía a ningún servidor. Aun así, un token que no ha expirado es una credencial que funciona, así que ten cuidado con cualquier herramienta que te pida uno y usa preferiblemente tokens expirados o de prueba.

¿Cualquiera puede leer el contenido de un JWT?

Sí. El header y el payload son JSON codificado en Base64URL, no cifrado, así que cualquiera que tenga el token puede leerlos sin clave. La firma no oculta nada: solo demuestra que el token lo creó alguien que tiene la clave de firma y que no se alteró después.

¿Qué diferencia hay entre HS256 y RS256?

HS256 usa un único secreto compartido para firmar y para verificar, así que cualquier parte que verifica también podría crear tokens. RS256 usa una clave privada para firmar y una clave pública para verificar, lo que permite que muchos servicios verifiquen tokens que solo el emisor puede crear.

¿Por qué mi token aparece como expirado?

Su claim exp es un momento del pasado según el reloj de tu dispositivo. Algunos servidores toleran una pequeña diferencia de reloj, pero un token expirado hay que sustituirlo, iniciando sesión de nuevo o usando un refresh token.

Más herramientas de Codificación