Seguridad en Tokens JWT: Firma y Encriptación con NextAuth
Clase 12 de 13 • Curso de Next.js: Seguridad Web con OWASP
Resumen
¿Cómo proteger mejor nuestros tokens?
En la era digital actual, la seguridad de los datos es un tema prioritario. Al hablar de JSON Web Tokens (JWT), la seguridad es todavía más esencial. Una de las formas más efectivas para proteger su contenido es mediante la firma y el cifrado. Esto añade capas cruciales de seguridad y limita la exposición de datos. Vamos a explorar cómo NextAuth maneja esto, cómo podemos mejorar su configuración, y por qué la personalización del encriptado es fundamental.
¿Qué sucede cuando hay cambios de configuración?
Uno de los comportamientos peculiares de NextAuth es cómo gestiona los cambios en la configuración. Por ejemplo, al cambiar el tema de "light" a "auto", esto provoca que se cierre la sesión del usuario debido a discrepancias entre la firma del token anterior y el nuevo. Este comportamiento se debe a que la clave de firma de los tokens JWT se genera automáticamente, lo que puede cambiar al hacer ajustes de configuración, generando errores en la validación.
¿Cómo establecer nuestra propia clave secreta?
Un paso clave para mejorar la seguridad es definir manualmente nuestro propio secreto. Este secreto se tiene que configurar dentro de las opciones de JWT, y se recomienda guardarlo como una variable de entorno (environment variable). Para generar esta clave, puedes utilizar herramientas de generación de claves como keygen.io y asegurarte de que tenga un tamaño de 256 bits, preferentemente usando el tipo SHA. Una vez generada, esta clave debe colocarse en tus archivos de ambiente y de configuración local, asegurando así que ningún warning de JWT aparezca en los registros.
// Configurando el secreto en NextAuth
const options = {
jwt: {
secret: process.env.JWT_SECRET,
}
};
¿Cómo crear una llave de firma personalizada?
Una vez que hemos definido nuestro secreto, el siguiente paso es crear una llave de firma para el token. Para esto, podemos utilizar herramientas como node-jose-tools, que se pueden instalar mediante npm. Con estas herramientas, creamos una nueva llave de tipo OCT con el algoritmo HMAC-SHA512, que coincide con los requerimientos por defecto de NextAuth. Esta nueva llave se debe guardar nuevamente en los archivos correspondientes de environment.
npm install -g node-jose-tools
jose newkey --alg=HS512 --opt=256
¿Y qué tal si encriptamos nuestros tokens?
Añadir un paso de encriptación es un avance considerable en la protección de datos. Al habilitar la encriptación en NextAuth, necesitas definir una encryption key
usando nuevamente las herramientas de José, pero esta vez lo haces con un algoritmo simétrico como el A256GCM. Esta llave también se guarda en las variables de entorno y se habilita la encriptación a través de las opciones de configuración de JWT.
// Habilitando encriptación en NextAuth
const options = {
jwt: {
secret: process.env.JWT_SECRET,
// Dar una clave de encriptación personalizada
encryption: true,
encryptionKey: process.env.JWT_ENCRYPTION_KEY,
}
};
¿Cuáles son las diferencias entre los esquemas de encriptación simétrica y asimétrica?
Elegir entre un token simétrico o asimétrico depende principalmente del control que tengas sobre los clientes que utilizan el token. Los tokens simétricos son útiles cuando tienes total control sobre el entorno, como en proyectos internos. Sin embargo, en situaciones donde los detalles del cliente no son claros o cuando necesitas asegurar extremo a extremo, los tokens asimétricos son la mejor opción. Herramientas como Auth0 utilizan tokens asimétricos precisamente por este motivo.
El uso consciente de estas prácticas no solo mejora la seguridad de tus aplicaciones, sino que también te prepara para crear sistemas más fiables. Al mejorar continuamente nuestro entendimiento y manejo de los tokens JWT, garantizamos que nuestras aplicaciones no solo sean funcionales, sino también seguras. ¡Continúa explorando estos conocimientos y aplica lo aprendido para desarrollar una carrera exitosa en desarrollo seguro de aplicaciones!