Decodificador de JWT y verificador de firma
Pega un token y obtienes el encabezado, la carga útil y cada claim explicado, con las marcas de tiempo convertidas en fechas reales. Si tienes el secreto o la clave pública, la verificación de la firma también corre aquí: el token no se envía a ningún lado.
Decodificado
Claims
| Claim | Valor | Qué significa |
|---|
Verificar la firma
HS256, HS384 y HS512 toman el secreto como texto plano. Los algoritmos RS, PS y ES toman una clave pública: un bloque PEM que empieza con BEGIN PUBLIC KEY, o un JWK pegado como JSON.
Tres partes, dos de ellas públicas
Un JWT son tres bloques unidos por puntos: encabezado, carga útil y firma. Los dos primeros están en base64url — base64 con - y _ en lugar de + y /, y sin el relleno de =, para que el token pueda viajar dentro de una URL sin romperse.
base64url es una codificación, no un cifrado. Cualquiera que tenga el token puede leer todos sus claims, incluido el usuario en cuyo navegador está guardado. Este es el malentendido más común sobre los JWT, y ya dejó a la vista un montón de IDs internos de usuario, direcciones de correo y roles de usuario. Si un valor tiene que quedar en secreto, no va dentro de un token.
La firma es la única parte que necesita una clave, y lo único que prueba es que el encabezado y la carga útil no cambiaron desde que se firmaron. No dice nada sobre quién tiene el token ahora. Un JWT robado es un JWT válido.
El campo alg es una afirmación, no un hecho
El encabezado nombra el algoritmo que debería usar el verificador, y el encabezado lo pone quien envía el token. De ahí salen dos ataques clásicos.
alg: none. La especificación incluye un modo "sin protección" con la firma vacía. Una librería que confía en el encabezado va a aceptar sin chistar un token que un atacante escribió a mano. Todo token que llega con none queda marcado arriba como sin firma, y ningún verificador de producción debería permitirlo.
RS256 degradado a HS256. Si un servidor está configurado para RS256 y verifica lo que le pida el encabezado, un atacante puede volver a firmar el token con HS256 usando la propia clave pública del servidor como secreto HMAC. La clave pública es pública, así que esto no cuesta nada. El arreglo, en cualquier librería, es fijar el algoritmo esperado en vez de leerlo del token.
Cómo leer las marcas de tiempo
exp, nbf e iat son valores NumericDate: segundos desde el 1 de enero de 1970 UTC. No milisegundos. Pasar Date.now() directamente a exp produce un token que expira alrededor del año 56000, que cualquier verificador acepta y nadie nota. La tabla de arriba marca un valor que parece estar en milisegundos.
exp es cuándo el token deja de ser válido, nbf es cuándo empieza a serlo e iat es cuándo se emitió. Los verificadores suelen permitir una pequeña diferencia de reloj en ambas direcciones, normalmente 60 segundos, porque los relojes de los servidores se desfasan.
Por qué no se puede cancelar un token
Un JWT es autocontenido a propósito: el servidor verifica la firma y las marcas de tiempo, y no necesita consultar ninguna base de datos. Ese es todo el argumento de rendimiento para usar uno. El costo es que cerrarle la sesión a alguien, revocar un rol o bloquear una cuenta no puede surtir efecto hasta que el token expira, porque en el momento de verificar no se consulta nada.
Las respuestas prácticas son todas de compromiso. Una expiración corta con un refresh token mueve la consulta al momento de renovarlo. Una lista de jti revocados vuelve a traer la base de datos que estabas evitando. Un claim de versión de token comparado contra el registro del usuario hace lo mismo. No hay ninguna versión de esto que conserve el carácter sin estado y consiga revocación instantánea.
Hasta dónde llega esta herramienta
No va a buscar las claves del emisor. Un verificador real lee kid del encabezado y trae la clave correspondiente del endpoint JWKS del emisor; esta página no hace ninguna petición de red, así que la clave la tienes que pegar tú. Copiar un objeto de clave de una respuesta JWKS funciona; si pegas el conjunto entero con varias claves, la herramienta lo rechaza en vez de adivinar cuál usar.
Los tokens cifrados quedan fuera de alcance. Un JWE tiene cinco partes en lugar de tres y la carga útil es texto cifrado; la herramienta detecta la forma y lo dice, en vez de mostrarte ruido.
Verificar una firma no es lo mismo que aceptar un token. Aquí nada valida que iss y aud sean los valores que espera tu aplicación, y esas comprobaciones importan: un token perfectamente válido emitido para otra audiencia sigue siendo el token equivocado.
Una trampa con los secretos HMAC. Algunos emisores guardan el secreto codificado en base64 y lo decodifican antes de firmar. Si el texto que pegas no verifica en ningún lado, marca "El secreto está en base64" y prueba de nuevo: los bytes que se hashean son otros, y solo eso ya cambia el resultado.
Preguntas frecuentes
¿Es seguro pegar aquí un token de producción?
El token se queda en tu navegador: esta página son archivos estáticos sin ningún servidor detrás, y tanto la decodificación como la verificación de la firma corren en JavaScript en tu máquina. La advertencia honesta es que un token que pasó por el portapapeles y por el historial del navegador ya es menos privado que uno que se quedó en una cabecera HTTP, así que cuando puedas elegir, usa un token de prueba o uno ya expirado.
¿Se puede decodificar un JWT sin el secreto?
Sí, y cualquier otra persona también puede. El encabezado y la carga útil están codificados en base64url, no cifrados. El secreto solo hace falta para confirmar que el contenido no cambió después de firmarse.
¿Por qué falla la verificación de la firma con el secreto correcto?
Casi siempre porque los bytes son distintos. Un secreto guardado en base64 hay que decodificarlo antes de hashearlo, así que marca la casilla de base64. Revisa también que no se haya colado un salto de línea o un espacio final junto con el secreto, y asegúrate de estar verificando el mismo token, porque volver a firmarlo cambia la tercera parte.
¿Qué algoritmos puede verificar?
HS256, HS384 y HS512 con un secreto compartido, y las variantes RS, PS y ES en 256, 384 y 512 con una clave pública en formato PEM SPKI o como JWK. EdDSA no está soportado, porque los navegadores todavía no lo ofrecen en todas partes a través de la API Web Crypto.
¿Qué significa "expirado" aquí?
Que el claim exp quedó en el pasado según el reloj de tu propio dispositivo. Un servidor puede rechazar igual un token que tu reloj considera fresco, o aceptar uno que expiró hace un minuto, porque la mayoría de los verificadores permite una pequeña diferencia de reloj.
Última actualización 19 de septiembre de 2026