Los JSON Web Tokens (JWT) son uno de los estándares más usados para autenticación y transmisión de información entre partes de forma compacta. En este artículo verás cómo están hechos, cómo se firman y qué errores conviene evitar.
¿Qué es un JWT?
Un JWT es una cadena de texto con tres partes separadas por puntos (.):
- Header: algoritmo y tipo de token (p. ej. HS256, JWT).
- Payload: claims o “datos” (usuario, rol, expiración, etc.).
- Signature: firma que garantiza que el token no fue modificado.
Cada parte está codificada en Base64URL. Por eso puedes “decodificar” un JWT y leer header y payload sin tener el secreto; la firma es lo único que protege la integridad.
Estructura de un JWT real
Un ejemplo típico se ve así:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6Ikp1YW4gUMOpcmV6IiwiZXhwIjoxNzA2OTAwMDAwfQ.abc123firma
- Primera parte (header):
{"alg":"HS256","typ":"JWT"}. - Segunda parte (payload):
{"sub":"1234567890","name":"Juan Pérez","exp":1706900000}. - Tercera parte: la firma HMAC-SHA256 del contenido de las dos partes anteriores.
No guardes contraseñas ni datos muy sensibles en el payload: cualquiera puede decodificarlo.
Cómo se genera la firma
Con HS256, el servidor usa una clave secreta compartida y aplica HMAC-SHA256 sobre base64(header).base64(payload). Si alguien cambia un byte del payload, la firma deja de coincidir y el token se considera inválido.
Con RS256, el servidor firma con la clave privada y cualquiera con la clave pública puede verificar. Es útil cuando varios servicios tienen que validar el token sin tener el secreto.
Errores habituales de seguridad
- Almacenar secretos en el payload: el payload es legible; no pongas contraseñas ni datos críticos sin cifrado adicional.
- No verificar la firma: siempre validar la firma y el algoritmo (evitar “alg”: “none” o cambios de algoritmo).
- No comprobar exp (expiración): los tokens deben tener fecha de caducidad y el backend debe comprobarla.
- Claves débiles o expuestas: en HS256, una clave corta o filtrada permite falsificar tokens.
Resumen
Un JWT te da un “dato firmado” que el cliente puede enviar en cada petición (p. ej. en el header Authorization) y el servidor solo tiene que verificar la firma y los claims. Es útil para APIs y sesiones stateless, siempre que no guardes información sensible en el payload y uses buenas prácticas de firma y expiración.
Si quieres inspeccionar un token sin programar, puedes usar nuestra herramienta gratuita para decodificar header y payload al instante.