¿Cómo funcionan las sesiones en Express.js con Node.js?


96

Con Express.js , las sesiones son muy simples. Sin embargo, tengo curiosidad por saber cómo funcionan realmente.

¿Almacena alguna cookie en el cliente? Si es así, ¿dónde puedo encontrar esa cookie? Si es necesario, ¿cómo lo decodifico?

Básicamente, quiero poder ver si un usuario está conectado, incluso cuando el usuario no está realmente en el sitio en ese momento (como cuando Facebook sabe que está conectado cuando está en otros sitios). Pero supongo que para entender que primero debo entender cómo funcionan las sesiones.

Respuestas:


43

Nunca he usado Express.js, aunque de acuerdo con su documentación sobre el tema suena así:

  • Las cookies se almacenan en el cliente, con una clave (que el servidor utilizará para recuperar los datos de la sesión) y un hash (que el servidor utilizará para asegurarse de que los datos de las cookies no hayan sido manipulados, por lo que si intenta cambiar un valor que la cookie no será válida)

  • Los datos de la sesión, a diferencia de algunos marcos (por ejemplo, Play Framework !) Se mantienen en el servidor, por lo que la cookie se parece más a un marcador de posición para la sesión que a un contenedor de datos reales de la sesión.

  • A partir de aquí , parece que los datos de esta sesión en el servidor se mantienen de forma predeterminada en la memoria, aunque eso podría modificarse para cualquier forma de almacenamiento que implemente la API adecuada.

Entonces, si desea verificar cosas sin un reqobjeto de solicitud específico , como dijo, solo debe acceder a ese mismo almacenamiento. En la parte inferior de la primera página de documentación, detalla los métodos requeridos que el almacenamiento debe implementar, por lo que si está familiarizado con su API de almacenamiento, tal vez pueda ejecutar un .getAll()si existe algo así, recorrer los datos de la sesión y leer lo que sea valores que desee.


166

Visión general

Express.js usa una cookie para almacenar una identificación de sesión (con una firma de cifrado) en el navegador del usuario y luego, en solicitudes posteriores, usa el valor de esa cookie para recuperar la información de la sesión almacenada en el servidor. Este almacenamiento del lado del servidor puede ser un almacén de memoria (predeterminado) o cualquier otro almacén que implemente los métodos requeridos (como connect-redis ).

Detalles

Express.js / Connect crea una cadena Base64 de 24 caracteres utils.uid(24)y la almacena en req.sessionID. Esta cadena se usa luego como valor en una cookie.

Lado del cliente

Las cookies firmadas siempre se utilizan para las sesiones, por lo que el valor de la cookie tendrá el siguiente formato.

[sid].[signature]

Donde [sid] es el ID de sesión y [firma] se genera firmando [sid] utilizando la clave secreta proporcionada al inicializar el middleware de sesión. El paso de firma se realiza para evitar manipulaciones. Debería ser computacionalmente inviable modificar [sid] y luego volver a crear [firma] sin conocimiento de la clave secreta utilizada. La cookie de sesión sigue siendo vulnerable al robo y la reutilización, si no se requiere modificación de [sid].

El nombre de esta cookie es

connect.sid

Lado del servidor

Si aparece un controlador después del middleware cookieParsery session, tendrá acceso a la variable req.cookies. Contiene un objeto JSON cuyas claves son las claves de la cookie y los valores son los valores de la cookie. Este contendrá una clave nombrada connect.sidy su valor será el identificador de sesión firmado.

A continuación, se muestra un ejemplo de cómo configurar una ruta que verificará la existencia de la cookie de sesión en cada solicitud e imprimirá su valor en la consola.

app.get("/*", function(req, res, next) {

    if(typeof req.cookies['connect.sid'] !== 'undefined') {
        console.log(req.cookies['connect.sid']);
    }

    next(); // Call the next middleware
});

También deberá asegurarse de que el enrutador ( app.use(app.router)) esté incluido después cookieParsery sessionen su sección de configuración.

El siguiente es un ejemplo de los datos almacenados internamente por Express.js / Connect.

{
  "lastAccess": 1343846924959,
  "cookie": {
    "originalMaxAge": 172800000,
    "expires": "2012-08-03T18:48:45.144Z",
    "httpOnly": true,
    "path": "/"
  },
  "user": { 
    "name":"waylon",
    "status":"pro"
  }
}

El usercampo es personalizado. Todo lo demás es parte de la gestión de sesiones.

El ejemplo es de Express 2.5.


1
al imprimir el valor de la cookie con el archivo console.log, da la cookie codificada (firmada). ¿Cómo obtengo la información real?
vsync

¿Qué quiere decir con "La cookie de sesión sigue siendo vulnerable al robo y la reutilización, si no se requiere modificación de [sid]"? dado que SID es generado por expreso, nunca podemos cambiarlo, ¿verdad?
Hrushikesh

2
@WebHrushi Estaba pensando en un ataque Man-in-the-Middle: en.wikipedia.org/wiki/Man-in-the-middle_attack
Waylon Flinn

¿Alguien puede ayudarme con estas preguntas: stackoverflow.com/questions/21982791/…
roundrobin

¿Cómo creo un token para cualquier session_id en particular?
aman verma

9

Sin embargo, tengo curiosidad por saber cómo funcionan realmente.

Trate de mirar esta respuesta y cosas de wiki .

¿Almacena alguna cookie en el cliente?

Sí, suele ser una cookie con un ID de sesión asignado, que debe estar firmado con un secreto para evitar falsificaciones.

Si es así, ¿dónde puedo encontrar esa cookie? Si es necesario, ¿cómo lo decodifico?

No debe meterse con una cookie de sesión en el lado del cliente. Si desea trabajar con sesiones en el lado del servidor, debe consultar express.js relacionados y conectar documentos.


Señor, ¿podemos hablar? Tengo algunas dudas sobre todo esto.
Suraj Jain

0

Además de las ya excelentes respuestas, aquí hay 2 diagramas que he creado para explicar las sesiones Express, su enlace con las cookies y la tienda:

  • galleta de chocolate: chocolate
  • galleta de fresa: fresa
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.