JWT (JSON Web Token o token web de JSON) es un protocolo de uso extendido para la transmisión segura de datos como objetos JSON que se verifican mediante una firma digital. Se suele emplear para la autenticación, la autorización, la protección de API y el inicio de sesión único (SSO). La estructura compacta y la validación criptográfica de JWT lo convierten en una gran opción para proteger las comunicaciones entre dos partes.
JSON (JavaScript Object Notation) es un formato de texto abierto e independiente del lenguaje que se utiliza para almacenar y transmitir datos. Gracias a su simplicidad, facilita tanto el análisis como la generación a las máquinas y la comprensión a los seres humanos, por lo que resulta ideal para aplicaciones web y API.
Los tokens son credenciales digitales que almacenan la identidad y los permisos de un usuario en un formato seguro y compacto. Desempeñan un papel fundamental en los sistemas de autenticación modernos porque se aseguran de que solo los usuarios autorizados puedan acceder a los recursos protegidos.
Un JWT está compuesto por un encabezado, una carga útil y una firma. El encabezado especifica el algoritmo hash y el tipo de token, la carga útil contiene la información o las notificaciones del usuario y la firma garantiza la integridad del token. Veamos cómo funciona.
Proceso de creación de JWT: cuando un usuario inicia sesión con su nombre y su contraseña, el servidor genera un JWT y lo codifica con la información pertinente. A continuación, el token se firma mediante una clave secreta o un par de claves (una pública y otra privada) para impedir su manipulación.
Transmisión del token: una vez creado el JWT, este se le envía como un encabezado HTTP o en el cuerpo de la respuesta al cliente, que puede guardarlo en una cookie de solo HTTP o en el almacenamiento local del navegador. El token se puede utilizar para acceder a recursos protegidos, ya sea enviándolo como una cookie o incluyéndolo en el encabezado de autorización de las siguientes peticiones.
Validación del token: cada vez que el servidor recibe una petición con un JWT, primero decodifica el token y después recrea la firma utilizando la carga útil y la clave secreta para verificar la autenticidad del token. El servidor comprueba las notificaciones (como el emisor, los destinatarios y el vencimiento) para asegurarse de que el token no se haya alterado y, por tanto, sea válido.
Autenticación sin estado: a diferencia de lo que ocurre en la autenticación convencional basada en sesiones, el servidor no necesita enviar una consulta a la base de datos para validar a un usuario cuando se emplean JWT. Como el token contiene toda la información necesaria, la autenticación sin estado que caracteriza a JWT mejora el rendimiento y la escalabilidad, ya que cualquier servidor con una clave secreta puede verificar el token por su cuenta.
Vencimiento del token: por norma general, a los JWT se les asigna un periodo de vencimiento dentro de la carga útil. Esto aporta un extra de seguridad, ya que reduce el plazo durante el cual se puede utilizar un token en riesgo. Durante el proceso de validación, el servidor comprueba el periodo de vencimiento del token y, si lo ha superado, le pide al cliente que lo renueve.
JWT resulta muy útil para el intercambio de información entre distintos sistemas, independientemente de que se encuentren dentro de una gran empresa o pertenezcan a servicios no relacionados. Esto permite intercambiar datos delicados con seguridad y sin intervención directa por parte del emisor y el destinatario. Esta descentralización está detrás de la flexibilidad y la escalabilidad de JWT, que hace que la comunicación entre diferentes tecnologías sea más accesible. Veamos algunas de sus principales ventajas.
Seguridad mejorada: la firma de un JWT se genera mediante una clave secreta, por lo que los datos están protegidos frente a manipulaciones durante su transmisión.
Autenticación sin estado: al utilizar JWT, toda la información necesaria se codifica en el token, por lo que no hacen falta bases de datos en el lado del servidor. Como resultado, este tipo de autenticación mejora el rendimiento y facilita la escalabilidad de los sistemas al cliente.
Compatibilidad con CORS: implementar el intercambio de recursos de origen cruzado (CORS) con JWT es muy sencillo porque permite el intercambio de recursos entre varios dominios. Esta funcionalidad es de gran utilidad para los clientes que quieran integrar servicios de terceros en sus sistemas.
Rendimiento superior: con JWT no hace falta que un servidor consulte una base de datos para autenticar a los usuarios, lo cual contribuye a reducir los tiempos de respuesta y mejorar el rendimiento de las aplicaciones.
Flexibilidad: los tokens web se integran con distintas plataformas y son compatibles con varios lenguajes de programación, así que es fácil hacerles un hueco en todo tipo de entornos y stacks tecnológicos.
Integridad de los datos: como cualquier intento de manipular un token invalida la firma, JWT garantiza la integridad y la autenticidad de los datos.
Autenticación descentralizada: esta tecnología admite microservicios al permitir la verificación entre distintos servicios sin necesidad de una base de datos central, lo que mejora la resiliencia y la escalabilidad de los sistemas.
Las ventajas de JWT, como las mejoras en la seguridad y la flexibilidad, lo convierten en una opción ideal para distintos tipos de autenticación. Entre otras cosas, permite que las aplicaciones en los lados del cliente y el servidor identifiquen a los usuarios e intercambien datos importantes sin enviar una consulta para cada petición a una base de datos. Veamos algunos de los usos de JWT más habituales.
Inicio de sesión único (SSO): esta tecnología simplifica la autenticación en varias plataformas. Cuando un usuario se autentica, puede acceder a distintos servicios sin necesidad de iniciar sesión una y otra vez, por lo que disfruta de una experiencia superior.
Autenticación de API: casi todas las API REST utilizan JWT para proteger las peticiones. La autenticación del cliente se lleva a cabo con eficiencia al incluir el token en los encabezados de las peticiones. De esta forma, solo los usuarios autorizados pueden interactuar con la API.
Intercambio de información: la naturaleza unificada de JWT permite a los tokens contar con toda la información necesaria, lo cual garantiza la seguridad de las comunicaciones.
Autorización: los tokens permiten codificar las funciones y los permisos de los usuarios para controlar los accesos. Gracias a JWT, una aplicación puede tomar decisiones relativas a la autorización utilizando la información proporcionada por el token, así se controla el acceso a los recursos.
Autenticación en aplicaciones móviles: la autenticación sin estado hace que JWT sea ideal para aplicaciones móviles. Como es muy fácil almacenar los tokens y utilizarlos para futuras peticiones de API, la experiencia de uso va como la seda.
Identidad federada: JWT permite intercambiar identidades entre sistemas y terceras partes de confianza de manera segura, lo cual agiliza la experiencia de uso en diferentes dominios.
Implementar JWT con seguridad es clave para proteger los datos de los usuarios y velar por la integridad de los procesos de autenticación. Seguir las recomendaciones que aparecen a continuación puede ayudar a reducir los riesgos, cumplir las normativas y aumentar la resiliencia de las aplicaciones.
Proteger la transmisión de JWT mediante HTTPS garantiza la confidencialidad de los tokens y su protección ante ataques o intentos de intercepción por parte de intermediarios.
Conviene almacenar las claves secretas en un entorno seguro y utilizar una diferente para cada entorno, como el de desarrollo y el de producción. Cambiar las claves con frecuencia puede contribuir a reducir los riesgos.
Hay que verificar todas las notificaciones que contiene un token. Esto incluye comprobar el periodo de vencimiento, la firma, el emisor y los destinatarios para garantizar la autenticidad y la validez de dicho token.
Aunque los periodos de vencimiento son muy importantes para la seguridad, hay que encontrar un equilibrio entre ellos, la seguridad y la experiencia de uso. Los periodos más cortos refuerzan la seguridad, pero empeoran la experiencia de uso al requerir autorizaciones más frecuentes.
Nunca se debe almacenar información delicada en una carga útil de JWT. Aunque la firma del token vela por su integridad, sus contenidos pueden quedar expuestos si alguien lo intercepta.
Es buena idea crear estrategias para invalidar los tokens en caso necesario. Por ejemplo, cuando se produce una violación de la seguridad en el sistema o un usuario cierra sesión. También hay que crear y mantener listas negras de tokens que se han revocado.
Siempre hay que utilizar algoritmos criptográficos robustos para firmar los tokens. Cuanto mejores son los algoritmos, mayor es la protección, sobre todo en entornos descentralizados donde la seguridad es de suma importancia.
Los tokens web JSON son fundamentales para proteger los sitios web, sobre todo en lo relativo a las operaciones de autenticación y autorización. Estos tokens tienen muchas ventajas, pero para utilizarlos de forma segura hay que disponer de una infraestructura a la altura y planificar hasta el último detalle.
Compute de Fastly es la solución ideal para implementar API seguras con autenticación mediante JWT. Gracias a su funcionalidad de aislamiento con bajo consumo de recursos, la plataforma permite escribir lógica de autenticación en cualquier lenguaje. Consulta nuestro tutorial para decodificar JWT con Compute de Fastly.
Da el siguiente paso para optimizar el proceso de autenticación y la seguridad de tu aplicación. Comienza tu prueba gratuita de Compute de Fastly hoy mismo y pon todo el poder de la informática en el edge al servicio de tus aplicaciones.