¿Qué es un JWT?
Un JSON Web Token (JWT) es un estándar abierto (RFC 7519) que define una forma compacta y autocontenida de transmitir información entre partes como un objeto JSON. La información puede verificarse porque está firmada digitalmente, ya sea con un secreto (HMAC) o con un par de claves pública/privada (RSA o ECDSA).
Un JWT tiene la forma xxxxx.yyyyy.zzzzz, donde cada sección está codificada en Base64URL y separada por un punto.
¿Para qué se usa?
- Autenticación: tras el login, el servidor emite un JWT que el cliente adjunta en cada petición para demostrar su identidad, sin consultar la base de datos en cada request.
- Autorización: el token puede incluir roles y permisos del usuario para que el servidor decida qué recursos puede acceder.
- Intercambio de información: al estar firmado, cualquier sistema receptor puede verificar que el contenido no fue alterado en tránsito.
- Single Sign-On (SSO): su pequeño tamaño y portabilidad lo hacen ideal para sistemas federados donde múltiples servicios comparten autenticación.
Las tres partes
Header
Indica el tipo de token (JWT) y el algoritmo de firma usado (HS256, RS256, etc.).
Payload
Contiene los claims: datos del usuario y metadatos del token como iat (emitido), exp (expiración) y sub (sujeto).
Signature
El resultado de firmar base64(header) + "." + base64(payload) con la clave secreta. Garantiza integridad.
Beneficios
Sin estado
El servidor no necesita almacenar sesiones. Toda la info viaja en el token.
Escalable
Ideal para microservicios y arquitecturas distribuidas donde múltiples servidores deben autenticar.
Multiplataforma
Funciona en web, móvil e IoT. JSON es universal; Base64URL es seguro para URLs.
Seguro
La firma criptográfica garantiza que el contenido no puede alterarse sin invalidar el token.
Claims estándar
| Claim | Significado |
|---|---|
| iss | Issuer — quién emitió el token |
| sub | Subject — identificador del usuario o entidad |
| aud | Audience — destinatario(s) para quien fue emitido |
| exp | Expiration time — cuándo expira (Unix timestamp) |
| nbf | Not before — no válido antes de esta fecha |
| iat | Issued at — cuándo fue emitido (Unix timestamp) |
| jti | JWT ID — identificador único del token |
Datos curiosos
- No es cifrado, es firmado. El payload de un JWT es solo Base64URL, cualquiera puede leerlo. Nunca guardes contraseñas o datos sensibles en él sin cifrar.
- Se pronuncia "jot". El RFC 7519 lo establece explícitamente. Decir "jay-double-u-tee" es técnicamente incorrecto (aunque todos lo entiendan).
- No se pueden invalidar fácilmente. Al ser stateless, revocar un JWT antes de su expiración requiere implementar una lista negra (blocklist), lo que añade estado al servidor.
- El algoritmo
noneexiste y es peligroso. Algunas librerías antiguas aceptaban tokens con"alg": "none"sin firma, permitiendo ataques de suplantación. - El tamaño importa. Un JWT típico pesa entre 200 y 500 bytes. Se envía en cada request, así que un payload muy grande puede degradar el rendimiento perceptiblemente a escala.