Decodificar un Token JWT Expirado
Decodificar un JWT expirado revela el mismo payload que un token válido. La estructura del token no cambia; el claim exp solo contiene una hora Unix en el pasado. Esto es útil para depurar errores de autenticación, verificar que claims se emitieron y saber cuando expiro un token sin acceder a los logs del servidor.
Token Decodificado
El token en este ejemplo se decodifica así:
{
"header": {
"alg": "HS256",
"typ": "JWT"
},
"payload": {
"sub": "1234567890",
"name": "Alice",
"iat": 1600000000,
"exp": 1600003600,
"iss": "auth.example.com",
"aud": "api.example.com"
}
}
iat es 1600000000 (13 de septiembre de 2020, 12:26:40 UTC). exp es 1600003600, exactamente una hora después. Ambos son horas Unix en segundos. Este token expiro en septiembre de 2020.
Claims de Tiempo y sus Significados
iat (issued at)
La hora Unix en que se emitió el token. Se usa para detectar tokens emitidos antes de una rotación de claves o un cambio de contraseña del usuario. Algunos sistemas rechazan tokens con un iat anterior al último cambio de contraseña del usuario, aunque tecnicamente no hayan expirado.
exp (expires at)
La hora Unix en que el token debe ser rechazado. Los servidores verifican current_time > exp y devuelven 401 si es verdadero. La verificación es estricta: un token con exp == current_time ya se considera expirado en la mayoría de las implementaciones.
nbf (not before)
Menos comun. La hora Unix antes de la cual el token no debe ser aceptado. Útil cuando emites un token para uso futuro o cuando quieres un período de espera antes de que el token se active después de la emisión.
Relación entre los tres
issued at (iat) --> valid from (nbf) --> valid until (exp)
En la práctica, iat y nbf suelen ser el mismo valor, o nbf se omite. La mayoría de los tokens solo usan iat y exp.
Problemas Comunes con la Expiración de JWT
Desviación del reloj del servidor
El reloj del servidor emisor esta adelantado respecto al servidor validador. Un token emitido en T con expiración de 5 minutos es válido hasta T+5 minutos según el emisor. Si el validador tiene el reloj 10 minutos atrasado, ve el token como válido hasta T+5d+10d. Si el validador tiene el reloj 10 minutos adelantado, rechaza el token inmediatamente después de la emisión. Monitorea la desviación del reloj en todos los servidores que emiten o validan JWT.
Confusión de zona horaria
Los claims exp e iat son siempre horas Unix en segundos UTC. No son cadenas de fecha formateadas. La confusión surge cuando los desarrolladores registran estos valores y los interpretan como hora local, o cuando crean JWT manualmente usando hora local en lugar de epoch UTC. Para convertir un valor exp a hora legible: new Date(exp * 1000).toISOString() en JavaScript, datetime.fromtimestamp(exp, tz=timezone.utc) en Python.
Depuración con un decodificador de tokens
Pega cualquier JWT, incluso expirado, y ve el valor exacto de exp. Usa el Convertidor de Tiempo Unix para convertirlo a fecha legible. Comparalo con iat para ver la vida útil prevista del token y con la hora actual para ver hace cuanto expiro.