JWT decoder online: cómo analizar un token sin liarla en producción
Un JWT (JSON Web Token) es una cadena compacta formada por tres partes separadas por puntos:
header.payload.signature. En el día a día (microservicios, APIs, SPA, mobile) los JWT se usan para
transportar claims (usuario, roles, expiración, audiencia) de forma verificable.
El problema: cuando algo falla en producción, necesitas un jwt decoder online rápido para ver qué contiene
el token, si está caducado o si la firma coincide con tu secret.
Esta herramienta te ayuda en 3 pasos: 1) decodificar header y payload, 2) validar expiración y 3) verificar firma (si introduces el secret). Todo ocurre en tu navegador: no se envía el token a servidores externos. Aun así, como buena práctica, evita pegar tokens reales con datos sensibles si estás en un equipo compartido.
1) Decodificar header y payload
El header suele incluir alg (algoritmo de firma) y typ.
El payload contiene claims como sub, iat, exp, aud, iss.
La herramienta te muestra ambos en JSON legible y te permite copiarlos.
Si el JSON te da dudas, puedes contrastarlo con el
Validador de JSON
o revisar si el token viene envuelto/transportado en Base64 con el
Conversor Base64.
2) Validar expiración (exp) con tolerancia
La claim exp es un timestamp (segundos desde epoch). Si exp ya pasó, el token debe considerarse inválido.
En sistemas distribuidos es normal tener desfase de reloj (clock skew). Por eso incluimos un campo de tolerancia
(por defecto 60s). Si tu API rechaza tokens “válidos” a veces, revisa NTP y considera tolerancia en validación.
3) Verificar firma (HS256/HS384/HS512) introduciendo el secret
Para algoritmos HMAC (HS256/384/512), la firma se calcula con tu secret y el contenido
base64url(header) + '.' + base64url(payload). La herramienta recalcula la firma y compara con la del token.
Si no coincide, suele ser por: secret incorrecto, token alterado, algoritmo distinto, o encoding base64url mal aplicado.
Tabla comparativa rápida
| Enfoque | Ventajas | Riesgos / límites | Cuándo usar |
|---|---|---|---|
| JWT stateless | Escala fácil, no requiere sesión en servidor | Revocación más compleja, tamaño en headers | APIs, microservicios, mobile |
| Sesión server-side | Revocación simple, control centralizado | Escalado requiere store compartido | Apps monolíticas, backoffice |
| JWT + refresh token | Balance entre UX y seguridad | Más piezas (rotación, storage seguro) | SPAs y apps con login persistente |
Ejemplos prácticos
Node.js (jsonwebtoken) — verificar HS256
import jwt from 'jsonwebtoken';
const token = process.env.TOKEN;
const secret = process.env.JWT_SECRET;
try {
const payload = jwt.verify(token, secret, { algorithms: ['HS256'] });
console.log('OK payload:', payload);
} catch (e) {
console.error('JWT inválido:', e.message);
}
PHP — verificar con firebase/php-jwt
use Firebase\JWT\JWT;
use Firebase\JWT\Key;
$token = $_GET['token'];
$secret = getenv('JWT_SECRET');
try {
$decoded = JWT::decode($token, new Key($secret, 'HS256'));
var_dump($decoded);
} catch (Exception $e) {
echo 'JWT inválido: ' . $e->getMessage();
}
Python (PyJWT) — validar exp y aud
import jwt, os, time
token = os.environ['TOKEN']
secret = os.environ['JWT_SECRET']
payload = jwt.decode(
token,
secret,
algorithms=['HS256'],
audience='api-mi-servicio',
options={'require': ['exp']}
)
print(payload)
Tip para depurar: si estás generando secrets o claves, apóyate en el Generador de Password Segura y, si necesitas comparar firmas o checksums, usa el Generador de Hash. Para inspeccionar estructuras XML/JSON alrededor del auth (por ejemplo, gateways que envuelven claims), tienes Validador XML y Validador JSON.
Checklist de seguridad (rápido)
- No guardes JWT en
localStoragesi puedes evitarlo; considera cookies httpOnly + CSRF. - Valida
iss,aud,expy el algoritmo permitido (lista blanca). - Evita tokens excesivamente largos (headers) y no metas datos sensibles en el payload.
- Rota secrets y usa refresh tokens con rotación si necesitas sesiones largas.