Qué es un JWT y cómo decodificarlo sin filtrar el token (2026)
JSON Web Tokens explicados de forma simple: estructura, qué información llevan, cómo decodificarlos sin enviar el token a un servidor de terceros.
Qué es un JWT
JWT = JSON Web Token. Es un formato estándar (RFC 7519) para transmitir información firmada entre partes. Lo usan APIs, autenticación OAuth, sessions modernas y casi cualquier sistema distribuido.
Un JWT se ve así:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5cTres partes separadas por punto:
- Header (algoritmo + tipo)
- Payload (los datos / claims)
- Signature (firma criptográfica)
Cada parte está codificada en Base64URL (variante de Base64 con caracteres URL-safe).
Cómo decodificarlo
En JavaScript
const token = "eyJ...XYZ";
const [headerB64, payloadB64, sigB64] = token.split(".");
const header = JSON.parse(atob(headerB64));
const payload = JSON.parse(atob(payloadB64));
console.log({ header, payload });En Toolram
JWT Decoder — pegás el token y obtenés header + payload formateados. 100% client-side — el token nunca sale de tu navegador.
Por qué NO usar jwt.io con tokens de producción
jwt.io es la herramienta más popular para decodificar JWTs. Procesa el token en el server. Si pegás un token de producción válido:
- Queda potencialmente en logs del servicio
- Si alguien con acceso al backend de jwt.io quisiera, podría usarlo durante su tiempo de vida
- Si tu token tiene info sensible (email, ID, scope), esa info salió de tu control
Regla: NUNCA decodifiques tokens de producción válidos en herramientas online server-side. Usá client-side (Toolram) o local en tu terminal.
Qué información típica lleva un JWT
Payload típico:
{
"sub": "1234567890", // subject (user ID)
"name": "John Doe",
"email": "john@example.com",
"iat": 1516239022, // issued at
"exp": 1516242622, // expires
"iss": "https://api.example.com", // issuer
"aud": "my-api", // audience
"scope": "read:users write:posts"
}Claims estándar:
iss— issuersub— subject (user ID)aud— audienceexp— expiration timenbf— not beforeiat— issued atjti— JWT ID (unique)
La firma: ¿qué garantiza?
La signature se calcula así:
signature = HMAC-SHA256(
base64(header) + "." + base64(payload),
secret
)Garantiza:
- El token no fue modificado en tránsito
- Solo quien tiene el
secretpudo haberlo firmado
NO garantiza:
- Confidencialidad del payload (todos pueden decodificar y leer)
- Que el token no esté revocado (necesitarías un backend con allowlist/blocklist)
Casos de uso comunes
- Authentication: API issues JWT al login, cliente lo envía en cada request via
Authorization: Bearer <token> - OAuth 2.0 flows
- Single Sign-On (SSO) entre apps
- Webhook signatures (Stripe, GitHub, etc.)
Próximos pasos
- JWT Decoder en Toolram
- Base64 encode/decode — útil para decodificar manualmente partes del JWT
- Hash MD5/SHA — para verificar firmas
- Glosario: ¿Qué es JWT? — definición técnica corta
Preguntas frecuentes
¿Es seguro decodificar JWTs en sitios web?
Solo si son CLIENT-SIDE. Sitios como jwt.io procesan server-side, pueden loggear tokens. Toolram decodifica con JavaScript en tu navegador — el token nunca se envía. Igual: NUNCA pegues tokens válidos de producción en NINGUNA herramienta online — siempre puede haber un MITM o extensión maliciosa.
¿El payload de un JWT está encriptado?
No. Está solo CODIFICADO en Base64URL, que es trivial de decodificar. Cualquiera con el JWT puede leer el contenido. La SIGNATURE garantiza integridad (no fue modificado), no confidencialidad. Si necesitás encriptar, usá JWE (JSON Web Encryption).
¿Cómo verifico la firma de un JWT?
Necesitás el secret (HMAC) o la public key (RSA/EC) del issuer. Recalculás HMAC-SHA256(header + . + payload, secret) y comparás con la signature recibida. Toolram solo DECODIFICA — no verifica firma porque eso requiere acceso al secret, que nunca debería compartirse.