2011-02-08 16 views
9

He estado observando los identificadores de sesión más de peticiones secuenciales y observaron algunas cosas que no puedo explicar:La confusión sobre los identificadores de sesión utilizando Conectar

1) Al llamar req.sessionID vs req.cookies["connect.sid"] los valores son diferentes (que aparece la request.sessionID está devolviendo mágicamente el SID de su respuesta asociada, lo cual me parece imposible).

Desde mi comprensión del código fuente de Connect, req.sessionID es sinónimo de la clave de la cookie, ¿por qué la diferencia?

2) La primera vez que realizo una solicitud desde el servidor de nodos, el navegador recibe un SID (llamemos a este SID1). La próxima vez que me conecto, el navegador se emite SID2. La tercera y subsecuente veces me vuelven a emitir SID2. ¿Por qué node + Connect emite dos ID de sesión antes de establecerse?

+0

Creo que encontré una solución, explicación a continuación en las respuestas. – Matt

Respuesta

8

Así que esto es lo que he llegado a la conclusión:

1) A medida que la petición está pasando por middleware/módulos, sólo puedo asumir el SID se fija a la solicitud antes de iniciar patadas en. Esta sería una explicación parcial de por qué req.sessionID podría contener SID2, cuando req.cookies["connect.sid"] contiene el SID1 anterior.

Algunas advertencias:

  • Este fenómeno sólo está presente cuando el navegador se conecta por primera vez a una nueva instancia del servidor de nodo.

  • El navegador debe haberse conectado a una instancia previa del servidor de nodos, que emitió una cookie con el mismo valor de clave (por ejemplo, connect.sid).

2) Después de leerlo alrededor del código fuente tanto de sésamo y Conectar me he dado cuenta de que mantener un registro de todos los identificadores de sesiones que hayan expedido - hasta ahora desconocidas para mí. Sospecho que esto es un paso para evitar la fijación de la sesión.

Teniendo esto en cuenta, me di cuenta de que el SID1 enviado en la solicitud durante una conexión inicial era sobrante de una cookie de sesión anterior. Connect buscaría una sesión en su tienda de sesiones que coincida con el SID1 que envió la cookie, pero como era una instancia nueva del servidor de nodos (solo sesiones de memoria aquí, sin sesiones persistentes ATM), no podría encontrarla, de ahí un nuevo SID (SID2) se emitirá - este para pegar. Debería haber pensado en esto antes. :)

TL; DR El comportamiento esperado. Las cookies de las sesiones anteriores no se vuelven a utilizar por razones de seguridad.

3

El req.sessionID es el mismo que req.cookies["connect.sid"].

Sin embargo, si usó supervisor o nodemon, el servidor se reinicia cuando modifica los archivos. Cuando el servidor se reinicie, se eliminarán todas las sesiones almacenadas por el servidor, pero el cliente no eliminó el ID de sesión anterior almacenado en la cookie. Entonces puedes obtener diferentes ID de sesión.

Ver this answer para más.

Cuestiones relacionadas