¿Qué es un JWT?
Un JWT (JSON Web Token) es una cadena compacta y segura para URL que se usa para representar afirmaciones (claims) entre dos partes. Consta de tres secciones codificadas en Base64URL separadas por puntos: un encabezado, un payload y una firma. La firma permite al receptor verificar que el contenido no ha sido manipulado.
Las tres partes
Encabezado (header): especifica el algoritmo usado para firmar el token y el tipo de token.
Payload: contiene claims, es decir, datos sobre el usuario y la sesión, como el ID de usuario, los roles y el tiempo de expiración.
Firma (signature): un hash criptográfico del encabezado y el payload que demuestra que el token no ha sido modificado.
Claims comunes
El payload suele incluir: sub (el sujeto, normalmente un ID de usuario), iat (emitido en), exp (marca de tiempo de expiración), iss (emisor) y aud (audiencia prevista).
Decodificar vs. verificar
Cualquiera puede decodificar un JWT: el payload solo está codificado, no cifrado. Usa nuestro decodificador JWT para inspeccionar el encabezado y el payload de cualquier token durante el desarrollo. La verificación (comprobar la firma) requiere la clave secreta y ocurre en tu servidor.
Errores de seguridad comunes que debes evitar
- Nunca aceptes tokens con
"alg": "none": esto desactiva por completo la verificación de la firma - Guarda los tokens en cookies httpOnly, no en el localStorage del navegador (vulnerable a cross-site scripting)
- Valida siempre el claim
exp: los tokens expirados deben rechazarse - Nunca pongas contraseñas ni datos personales sensibles en el payload: cualquiera con el token puede leerlos
Preguntas frecuentes
- ¿Cómo inspecciono un JWT sin escribir código?
- Pega el token en nuestro decodificador JWT. Divide el token en sus tres secciones, decodifica cada una y muestra el payload completo, incluidos todos los claims y el tiempo de expiración.
- ¿El payload de un JWT está cifrado?
- No: el payload está codificado en Base64URL, que cualquiera puede decodificar. Nunca guardes contraseñas, números de tarjeta de crédito ni otros datos sensibles en el payload de un JWT.
- ¿Cuál es la diferencia entre un JWT y una clave API?
- Una clave API es una cadena opaca: el servidor debe buscarla en una base de datos para saber qué permisos otorga. Un JWT es autocontenido: el servidor puede verificarlo y leer los permisos del payload sin consultar una base de datos.