En un esquema de cookie-to-header para enviar los tokens xsrf / csrf , el servidor establece un número pseudoaleatorio criptográficamente seguro como una cookie en la máquina del cliente. Se espera que el código de script java en la máquina cliente lea este código de la cookie, asegurando así con la misma política de origen del navegador que el script es de la misma página que el token. Luego, el script toma el token y lo agrega al encabezado de solicitud http con el nombre xsrf-token o algo así.
Mientras tanto, se supone que el servidor debe mantener un registro persistente del token xsrf emitido. Cuando llega la solicitud, toma el token del encabezado, lo compara con el registro, si coincide, ¡estamos dentro!
Aquí es donde comienza mi confusión. Dado que estamos almacenando la información en la cookie, inevitablemente se enviará con cada solicitud al servidor cuando se realice la solicitud http. Entonces, en el extremo del servidor no solo tenemos una, sino dos copias de la misma información. ¿Por qué no podemos hacer coincidir uno con el otro y aceptar la validez de la solicitud? ¿No vale la pena todo este ejercicio solo porque confiamos en que el navegador realice sus comprobaciones de origen cruzado? ¿No confiamos en las cookies? Para mi ingenuidad, al menos esto parece algo que podría funcionar. Por supuesto, podría estar muy equivocado y confiaría en usted para que me llame en caso de que me esté perdiendo algo básico.
Supongo que me estoy perdiendo algo. Así que aquí está el esquema que estoy implementando actualmente para mi sitio. Estoy utilizando tokens JWT para establecer y asegurar la identidad del usuario en una cookie httponly. Lo que propongo es emitir un token JWT separado (que contiene solo un número pseudoaleatorio) firmado por una clave completamente diferente y almacenarlo en una cookie de sesión. El código del lado del cliente lo lee, lo envía en el encabezado. El servidor lee el campo de cookie y encabezado y ve que son iguales. Luego, el servidor autentica el token JWT y ve que de hecho fue firmado por la clave en el servidor.
Mi pregunta es, ¿puede funcionar esto? Con esto no me refiero solo a la que involucra los tokens de JWT. También me refiero a la que no tiene ningún tipo de verificación para verificar que el servidor fue el emisor, es decir, el que solo tiene un número pseudoaleatorio y solo una única verificación para coincidir con la cookie. Cualquier sugerencia constructiva es bienvenida, incluso informarme sobre cómo estoy siendo un simple idiota. ¿Cuáles son algunas vulnerabilidades que se encuentran en este esquema? ¿Hay potencial para seguir investigando esto? ¿Es este un esquema suficientemente bueno para protegerse contra CSRF?