JWTs son tokens autocontenidos que pueden ser usados para transmitir información de sesión de forma segura. Es un estándar abierto, ofreciendo información para cualquier desarrollador o creador de librerías que quiera usarlos.
Estructura JWT
Un JWT consta de 3 componentes cada uno encodeado en base64 y separado por puntos.
- Header: El header normalmente indica el tipo de token, que es JWT, y el algoritmo usado para la firma.
- Payload: El payload es el cuerpo del token que contiene las afirmaciones. Estas son piezas de información ofrecidas para una entidad específica. En JWTs, hay afirmaciones registradas, las cuales son predefinidas por el estándar JWT, y públicas o privadas, las cuales son definidas por el desarrollador.
- Signature: La firma es la parte del token que ofrece un método para verificar la autenticidad de dicho token. La firma se crea usando un algoritmo especificado en el header.
Algoritmos de Firmado
Aunque hay varios algoritmos diferentes definidos en el estándar JWT, sólo nos importan 3:
- None: El algoritmo None significa que no se utiliza ningún algoritmo para la firma. De manera efectiva, es un JWT sin firma, significando que la verificación de las afirmaciones no puede ser hecha a través de la firma.
- Symmetric Signing: Un algoritmo de firmado simétrico, como HS256, crea la firma añadiendo un valor secreto al header y body del JWT antes de generar un valor hash. La verificación del token puede ser realizada por cualquier sistema conocedor de dicho secreto.
- Asymmetric Signing: Un algoritmo de firmado asimétrico, como RS256, crea la firma usando una clave privada para firmar el header y cuerpo del JWT. Se crea generando el hash y luego encriptando el hash usando la clave privada. La verificación la puede realizar cualquier sistema conocedor de la clave pública asociada a la clave privada utilizada para crear la firma.
Seguridad en la Firma
Los JWT pueden ser encriptados (llamados JWEs), pero la fuerza principal de los JWTs viene de la firma. Una vez que se firma el JWT, puede mandarse al cliente, quien puede usarlo cuando lo necesite. Podemos tener un servidor de autentificación centralizado que cree los JWTs usados en varias aplicaciones. Cada aplicación puede verificas la firma.
