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 NextAuthconst 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.
npminstall -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 NextAuthconst options ={jwt:{secret: process.env.JWT_SECRET,// Dar una clave de encriptación personalizadaencryption: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!
Seguridad en Tokens JWT: Firma y Encriptación con NextAuth
Se crea un secreto y una llave de autenticación para poder generar el JWT.
Para le encriptación se puede generar otra llave.
Cifrados
Simétrico (HMAC): De una sola llave.
Asimétrico (RSA): De dos llaves (ejemplo ssh).
¿Cuándo usar uno u otro?
Cuándo se requiere tener acceso a la desencriptación desde el front end o cuando no se tiene gobierno del front y el back end a la vez, se recomienda el uso de cifrados asimetricos (para solo exponer la llave publica y no la privada).
Si no se requiere desencriptar en el front es suficiente con un cifrado simétrico.
Algo muy curioso que me paso con este curso en particular
es que yo en cursos anteriores actualice todas las dependencias a la ultima version
next13, react18
materialui a la version 5 etc
me costo un poco pero logre que funcionara
pero con next-auth 4
el inicio de sesion no funcionaba apropiadamente y justo despues de implementar los jwt token en esta clase todo empezo a funcionar perfectamente
es algo curioso la verdad
Hola profesor y compañeros, no me queda muy claro el concepto de cuando nos referimos a "control de los clientes" , ¿hay algún otro ejemplo o explicación para poder entenderlo?
Si yo tengo una API fuera de nextjs, ¿Puedo enviar este token encriptado y validarlo con el mismo secreto en dicha API y así poder manejar la autorización de endpoints externos y usar Server Side rendering?