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.
Preguntas frecuentes
¿Quién puede leer el contenido de mi JWT?
Cualquiera que tenga el token, ya que header y payload solo están codificados en Base64. Por eso no debe contener datos confidenciales. Si necesitas ocultar el contenido, existe JWE (JWT cifrado).
¿Qué diferencia hay entre HS256 y RS256?
HS256 usa una clave secreta compartida para firmar y verificar. RS256 usa un par de claves: se firma con la privada y cualquiera puede verificar con la pública, algo útil cuando varios servicios validan tokens que emite uno solo.
¿Cuánto debe durar un token de acceso?
Lo habitual son entre 5 y 60 minutos, junto con un token de refresco de mayor duración que se guarda de forma más segura. Un token de larga duración que se filtra supone un riesgo mayor.
¿Cómo invalido un JWT antes de que caduque?
Al ser autónomos, no se pueden revocar sin estado en el servidor. Las estrategias habituales son tiempos de vida cortos, una lista de revocación o un identificador de sesión (jti) comprobado en cada petición.

