Estás de suerte! Hace aproximadamente 2 semanas me hicieron la misma pregunta y, después de rascarme la cabeza, se me ocurrió lo siguiente. Tenga en cuenta que esto no está bien revisado por pares, así que veremos cómo van los comentarios y las votaciones. Personalmente, creo que es una buena técnica.
1. Primera solicitud
Una vez que reciba la primera solicitud para cargar su aplicación, genere un identificador aleatorio seguro y guárdelo en una variable de sesión en el servidor, luego envíelo al cliente. Lo incrusté en la página justo antes de </body>
.
<script>setToken('<% print SESSION[TOKEN] %>');</script>
</body>
Tu setToken()
asignaría el valor del token a la variable en la que mantendrías el token.
2. Solicitudes posteriores
Con cada solicitud, agregarías ese token a la lista de parámetros, como token=TOKEN
, y el servicio lo compararía con el almacenado en la variable de sesión.
3. Actualizar el token
No es realmente obligatorio, pero es una buena idea actualizar el token de vez en cuando, por ejemplo, 15 minutos. Cuando recibe una solicitud después de que caduque el token (tiene el tiempo de caducidad en la variable de sesión), responde a ella normalmente (actúe de manera optimista) pero en la respuesta le dice al cliente que el token anterior ha caducado y debería comenzar a usar el uno nuevo.
El cliente reacciona a eso diciéndole al servidor que ahora conoce el nuevo token, una vez que el servidor recibe esa solicitud, comienza a usar el nuevo token y responde al cliente con un mensaje OK, una vez que el cliente recibe 200 OK
significa que ambos están sincronizados y el cliente comienza a usar el nuevo token.
Nota: Un elemento clave en el proceso es el uso de HTTPS. No quieres que un hombre en el medio huela la ficha. Pero, de nuevo, un MitM podría detectar las cookies y secuestrar la sesión de todos modos.