Hay un montón de artículos que explican qué es CSRF y que debo usar un token de CSRF para evitar CSRF. Algunos de ellos mencionan detalles como el uso de SHA256 sobre MD5. Sin embargo, ninguno de ellos explica cómo implementar la protección CSRF en relación con el flujo de usuarios. Por ejemplo, ¿se supone que debo almacenar el token CSRF en una base de datos o puede ser autónomo? Así es como creo que voy a implementar la protección CSRF, avíseme si hay algún problema:
-
El usuario llega a la página e inicia sesión. Reciben una cookie solo de http que contiene un JWT.
-
Genero un valor aleatorio de 128-512 bits (longitud fija, decidiré cuánto tiempo es). Luego, concatino el valor y la ID del usuario y HMAC SHA256 procesan el resultado con una clave privada. Inserto tanto el valor aleatorio como el hash en el HTML.
-
Cada vez que el usuario realiza una solicitud de API, el valor aleatorio y el hash se agregan como encabezado, variable GET o variable POST (¿no hay una diferencia en el derecho de seguridad?).
-
El servidor concatina el valor dado con la ID del usuario y lo compara con el hash dado. Si coinciden, entonces la parte CSRF está hecha.
¿Es correcta esta implementación? Algunos motivos de preocupación son que el usuario recibe un nuevo token CSRF cada vez que realiza una carga completa de la página. También pueden tener varios tokens válidos si tienen varias pestañas abiertas. Aunque no creo que esto cause problemas.
Editar: Un día entero de leer sobre CSRF más tarde, me di cuenta de que solo puedo poner el JWT en el encabezado de solicitud de la API y eso es todo.