Autenticación con JSON Web Tokens: Creación y Verificación
Clase 8 de 20 • Curso de Backend con Node.js: Autenticación con Passport.js y JWT
Resumen
¿Qué son los JSON Web Tokens y por qué son revolucionarios en la autenticación?
La autenticación es un componente crucial en la seguridad web, y la llegada de los JSON Web Tokens (JWT) ha revolucionado cómo manejamos las sesiones y accesos entre el front-end y el back-end. A diferencia de las cookies tradicionales que dependen del almacenamiento de sesiones en el servidor, los JWT son stateless, lo que significa que no necesitas guardar información en memoria o bases de datos. Este enfoque no solo resuelve problemas comunes en sistemas distribuidos, sino que también permite una escalabilidad sin precedentes.
¿Cómo se manejaba la autenticación antes de los JWT?
Históricamente, la autenticación en web se gestionaba con sesiones que se almacenaban en el servidor. Aquí te dejamos un esquema sencillo de cómo se hacía:
- Cliente (Front-end): Aplicaciones en Angular, React o cualquier otro cliente que se conecta a nuestro back-end.
- Sesión: Se guardaba una sesión en cookies que se transmitían al back-end.
- Back-end: Mantenía la sesión en memoria o en la base de datos, y comprobaba la autenticidad de la sesión.
Sin embargo, este método presenta problemas cuando necesitamos escalar, especialmente si requerimos distribuir nuestra API en múltiples servidores alrededor del mundo. La sesión se vinculaba a un servidor particular, lo que causaba problemas de disponibilidad y fallos en el manejo de sesiones.
¿Qué beneficios ofrecen los JSON Web Tokens?
Los JWT se destacan por ser una tecnología sin estado (stateless), permitiendo que toda la información necesaria para autenticar se incluya directamente en el token:
- Escalabilidad y Distribución: Al no depender del almacenamiento en el servidor, los JWT permiten la creación de sistemas distribuidos con balanceo de carga en diferentes nodos y servidores.
- Compatibilidad Multi-Plataforma: A diferencia de las cookies, que son eficaces solamente dentro de navegadores, los JWT son ideales para aplicaciones móviles y otros tipos de cliente.
- Seguridad: Los tokens pueden ser firmados y verificados, asegurando que solo quienes tengan la clave secreta puedan validarlos.
Comprendiendo la estructura de un JSON Web Token
Un JWT tiene una estructura clara que facilita su uso en múltiples aplicaciones. Esta se compone de tres partes separadas por puntos:
- Header: Contiene la información sobre el algoritmo de encriptación utilizado (como HS256) y el tipo de token.
- Payload: Es el corazón del JWT, donde se almacena la información esencial como el sub (subject), que identifica al usuario, y otros atributos personalizados.
- Signature: Es una firma que combina el header y el payload usando una clave secreta. Solo aquel con la clave podrá verificar la autenticidad del token.
¿Cómo se utiliza el header en un JWT?
El header de un JWT especifica tanto el algoritmo de encriptación como el tipo de token. Por lo común, estos parámetros no se modifican y garantizan que los receptores del token sepan cómo procesar la información que sigue.
{
"alg": "HS256",
"typ": "JWT"
}
¿Qué información se incluye en el payload?
La sección de payload puede incluir cualquier tipo de claims, como la identidad del usuario, roles, permisos y cualquier otra información relevante que necesites para autenticar y autorizar peticiones. Todo esto sucede sin comprometer la seguridad porque estos datos son parte de un token firmado.
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
¿Cómo asegura la signature la integridad del JWT?
La signature es vital para garantizar que el token no ha sido alterado. Este se genera en el back-end combinando el header y el payload con una clave secreta conocida solo por el back-end. Esto permite que el servidor verifique si el token ha sido manipulado.
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret
)
La adopción de JSON Web Tokens transformó profundamente las estrategias de autenticación y seguridad en aplicaciones modernas. Gracias a su flexibilidad, compatibilidad y enfoque sin estado, los JWT representan una herramienta poderosa para desarrollar sistemas seguros y escalables en diversas plataformas.