Un JWT (JSON Web Token) aparece en casi cualquier API moderna: lo ves en la cabecera Authorization: Bearer ..., en cookies de sesión o en tokens de terceros (OAuth, SSO). Y aun así, mucha gente nunca ha mirado qué hay dentro de uno.
Las tres partes
Un JWT es tres bloques en Base64URL separados por puntos: header.payload.signature.
- Header — el algoritmo de firma (
HS256,RS256...) y el tipo de token. - Payload — los claims: datos como
sub(usuario),exp(expiración),iat(emitido en), y cualquier campo custom que añada el backend. - Signature — el hash que garantiza que el header y el payload no se han modificado desde que se firmó.
Pégalo en el decodificador de JWT y verás el header y el payload ya parseados a JSON legible, con la fecha de expiración convertida a algo humano en vez de un timestamp Unix en crudo.
Decodificar no es verificar
Esto es lo que más confunde: cualquiera puede decodificar un JWT, porque el header y el payload solo están codificados en Base64URL, no cifrados. Abrirlos no requiere la clave secreta.
Lo que sí requiere la clave (o la clave pública, en RS256) es verificar la firma — comprobar que el token no ha sido alterado y que lo emitió quien dice haberlo emitido. Un decodificador online te enseña el contenido, pero nunca deberías confiar en un JWT ajeno sin que tu backend verifique la firma primero.
Por qué caduca
El claim exp es una fecha de expiración en segundos desde el epoch Unix. Si tu sesión "se cierra sola" cada cierto tiempo, es casi siempre esto: el token expiró y el cliente no lo refrescó a tiempo. Compáralo con el conversor de timestamp Unix si necesitas hacer el cálculo a mano.
Cuándo desconfiar de un token
- Si el
algdel header esnone— indica que el emisor no está firmando nada, una vulnerabilidad clásica si el backend no lo rechaza explícitamente. - Si no hay
exp— el token no caduca nunca, lo cual rara vez es intencional. - Si el payload contiene datos sensibles en claro (contraseñas, tarjetas) — el JWT no es un contenedor cifrado, no debería llevar nada que no pueda verse.
La regla corta: usa el decodificador para depurar y entender, pero la validación real de un JWT siempre pasa por tu servidor.

