Necesito un token CSRF, para una aplicación determinada que envía un formulario con POST
. Idealmente, me gustaría no realizar una llamada de base de datos para cada envío, para evitar el almacenamiento y el tráfico de base de datos y amp; estado latente. Para este fin, OWASP "CSRF Prevention Cheat Sheet" dice,
Overview
El Patrón de Token Encriptado aprovecha un método de encriptación, en lugar de una comparación, de validación de Token. Después de una autenticación exitosa, el servidor genera un token único que comprende la ID del usuario, un valor de marca de tiempo y un nonce, utilizando una clave única disponible solo en el servidor. Este token se devuelve al cliente y se incrusta en un campo oculto. […] Las solicitudes basadas en formularios no AJAX persistirán implícitamente el token en su campo oculto. Al recibir esta solicitud, el servidor lee y descifra el valor del token con la misma clave utilizada para crear el token. […]
Validación
En el desencriptado exitoso del token, el servidor tiene acceso a los valores analizados, idealmente en forma de reclamaciones.
La primera línea de "Validación" dice, para mí, como la definición misma de un JWT . Tampoco veo por qué la información en el token debe estar encriptada: parece que simplemente necesita ser autenticada de que proviene del servidor (a diferencia de un atacante que intenta falsificar un token CSRF).
¿Hay alguna razón en particular para cifrar tokens CSRF? Si no, ¿es suficiente un JWT?
Además, el patrón de token anterior incluye un nonce. ¿Cuál es el punto del nonce? (El objetivo de este patrón es no almacenar ningún servidor del estado. Si no estoy almacenando el estado, ¿cómo puedo usar el nonce durante la validación de cualquier manera material?)
Mi principal razón para buscar JWT aquí es que hay un soporte de biblioteca decente, probablemente los querré para su autenticación tarde o temprano, y en gran parte me mantiene alejado de la implementación de criptografía.
Mi comprensión de JWTs es que si tuviera JWTs para la autenticación completa de usuarios, podría almacenarlos en localStorage
, y simplemente agregarlos a un campo con JS antes de enviar el formulario. Desafortunadamente, la aplicación utiliza autenticación basada en cookies, y no puedo cambiar ese aspecto en este momento.