Qué contiene un JWT
Un JWT tiene tres partes separadas por puntos: una cabecera (el algoritmo de firma, por ejemplo HS256 o RS256), un payload con los «claims» (identificador en sub, caducidad en exp, emisor en iss, audiencia en aud…) y una firma. Cabecera y payload solo están codificados en base64url, no cifrados: cualquiera que tenga el token puede leerlos.
Decodificar no es verificar
Esta página no comprueba la firma, porque hace falta el secreto (HS256) o la clave pública del emisor (RS256, ES256). Por tanto, un token decodificado puede estar falsificado. Tu servidor debe verificar siempre la firma y los claims exp, nbf, iss y aud con una biblioteca JWT. Un token con "alg": "none" no tiene firma y debe rechazarse.
Por qué decodificar en local
Un token de acceso es una credencial: pegarlo en una web que lo envía a un servidor puede dar acceso a tu cuenta o a tu API. Aquí la decodificación es JavaScript en tu pestaña y no se envía ni se registra nada. Los tokens cifrados (JWE, cinco partes) no se pueden leer sin la clave, y la herramienta lo indica.
Ejemplo
El token de ejemplo público de la documentación de JWT. La marca iat se muestra como fecha; la firma se indica pero no se verifica.
Entrada
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
Resultado
Header:
{
"alg": "HS256",
"typ": "JWT"
}
Payload:
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
Dates (UTC):
iat: 2018-01-18T01:30:22Z
Signature: 43 characters, NOT verified