Tengo una aplicación pesada frontend con una api de descanso en node.js. La aplicación y el backend están en diferentes hosts. Además, se puede acceder a la aplicación con http y https. La razón por la cual se trata de contenido mixto: los usuarios de la aplicación cargan sus propios sitios web en iframes y, si un sitio web es http, no funcionará, los https rojos rotos en el mejor de los casos, no se cargarán en el peor de los casos. Bastante irónico que algo que se supone que mejora la seguridad web, me obliga a permitir el uso de conexiones no seguras. Pero ese no es el punto. Entonces, digamos que tengo mi interfaz en http (s): //app.mydomain.com y backend en enlace
Y quiero hacerlo lo más seguro posible, teniendo en cuenta que mis usuarios a veces usarán conexiones inseguras. Sé que no puedo protegerme de la manipulación, pero al menos puedo proteger el token de autenticación. Así que uso JWT. También quiero que me recuerden la funcionalidad. localStorage / sessionStorage permitiría que se leyera el token en una página http insegura, por lo que estaba pensando en configurar una cookie para enlace en el servidor. De esta manera, la interfaz nunca puede leer el token debido a CORS. Y me saltearía todas estas cosas de token de actualización. Habría solo una ficha para ser usada para todo. Por lo tanto, si un usuario inicia sesión, el servidor configurará la cookie del token y la configurará para que caduque cuando finalice la sesión del navegador, el token se configurará para que caduque en 1 día. Si el usuario lo marca, recuérdeme, la cookie se establecerá durante un año y el token caducará en un año. Ahora me gustaría preguntarte si es una forma segura de hacerlo. ¿Estoy pensando correcto?
Otra cosa obviamente es CSRF. Estaba pensando solo en revisar el remitente y dejarlo así, pero escuché que podría bloquear a los usuarios legítimos detrás de los proxies que eliminan al remitente de la solicitud. Así que estaba pensando en usar JWT como nonces. Básicamente, en el inicio, cuando el usuario inicia sesión / se autentica, el servidor devuelve un token nuevo y luego el token se almacena en la memoria del cliente y se envía con cada solicitud al servidor para su verificación.
Aquí hay un resumen del proceso:
the frontend is at http(s)://app.mydomain.com
the server is at https://api.mydomain.com
0. make an ajax call to check if the user is logged in
1. send username and password to log in
2. the server sets the cookie at https://api.mydomain.com containing the auth token
cookie is set to expire when browser session ends, token is set to expire in 1 day
if remember me: both cookie and token is set to expire in 1 year
3. the server also generates a different token to serve as a nonce and returns it
4. the app stores the nonce token in memory and uses it for every call
If the user is logged in, skip to step 3.
¿Qué piensas? ¿Es seguro?