¿Qué es un JWT?
Un JWT (JSON Web Token, estándar RFC 7519) es un token que una aplicación entrega al usuario cuando inicia sesión, y que este envía en cada petición para demostrar quién es, normalmente en la cabecera Authorization: Bearer …. Tiene tres partes separadas por puntos:
- Cabecera: el tipo de token y el algoritmo de la firma, por ejemplo
{"alg": "HS256", "typ": "JWT"}. - Contenido (payload): los datos, llamados claims o reclamaciones: quién es el usuario, cuándo caduca el token, sus permisos…
- Firma: garantiza que nadie ha cambiado las dos partes anteriores.
Las dos primeras partes son JSON codificado en Base64url, por eso se pueden leer sin ninguna clave.
Reclamaciones registradas
iss: quién emitió el token.sub: a quién se refiere, normalmente el identificador del usuario.aud: para quién es el token.exp,nbfeiat: cuándo caduca, desde cuándo es válido y cuándo se emitió. Son segundos desde el 1 de enero de 1970 (puedes convertirlos con el conversor de timestamp).jti: un identificador único del token.
Un JWT no es secreto
La firma impide que alguien modifique el token, pero no oculta su contenido: cualquiera que lo tenga puede leerlo, como acabas de hacer. Por eso nunca hay que guardar en un JWT contraseñas ni datos privados, y hay que tratar el token como una contraseña mientras sea válido.
HS256, RS256, ES256…
Los algoritmos HS (HMAC) firman y comprueban con la misma clave secreta, que deben compartir quien emite el token y quien lo verifica. Los RS (RSA) y ES (curvas elípticas) usan una clave privada para firmar y una pública para comprobar, así que cualquiera puede verificar el token sin poder fabricar otros. Un token con "alg": "none" no lleva firma y nunca debería aceptarse.