javascript - cookie - node js express-session example
¿Cómo funcionan las sesiones en Express.js con Node.js? (3)
Sin embargo, tengo curiosidad por cómo funcionan en realidad.
Intenta ver this respuesta y las cosas de wiki .
Almacena algunas cookies en el cliente?
Sí, generalmente es una cookie con una identificación de sesión asignada, que debe estar firmada con un secreto para evitar falsificaciones.
Si es así, ¿dónde puedo encontrar esa cookie? Si es necesario, ¿cómo lo decodifico?
No deberías meterse con una cookie de sesión en el lado del cliente. Si desea trabajar con sesiones del lado del servidor, debe consultar here relacionados y connect documentos.
Usando Express.js , las sesiones son muy simples. Sin embargo, tengo curiosidad por cómo funcionan en realidad.
Almacena algunas cookies 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 (por ejemplo, cómo Facebook sabe que has iniciado sesión cuando estás en otros sitios). Pero supongo que entiendo que primero debería entender cómo funcionan las sesiones.
Visión de conjunto
Express.js utiliza 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, utiliza 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 otra tienda que implemente los métodos necesarios (como connect-redis ).
Detalles
Express.js / Connect crea una cadena Base64 24 caracteres utilizando utils.uid(24)
y la almacena en req.sessionID
. Esta cadena se usa luego como el valor en una cookie.
Lado del cliente
Las cookies firmadas siempre se usan 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] usando 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 el conocimiento de la clave secreta utilizada. La cookie de sesión sigue siendo vulnerable al robo y la reutilización, si no se requiere una modificación de [sid].
El nombre de esta cookie es
connect.sid
Lado del servidor
Si se produce un controlador después del cookieParser
y session
middleware de session
, tendrá acceso a la variable req.cookies
. Este contiene un objeto JSON cuyas claves son las claves de las cookies y los valores son los valores de las cookies. Esto contendrá una clave llamada connect.sid
y su valor será el identificador de sesión firmado.
Aquí hay 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 a 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 de cookieParser
y la session
en 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 campo de user
es personalizado. Todo lo demás es parte de la administración de la sesión.
El ejemplo es de Express 2.5.
Nunca he usado Express.js, aunque de acuerdo con su documentación sobre el tema, parece que:
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 la cookie no hayan sido manipulados, por lo que si intenta cambiarlos) 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 es más como un marcador de posición para la sesión que un titular de los datos de la sesión real.
Desde here , parece que los datos de esta sesión en el servidor se guardan por defecto en la memoria, aunque eso podría modificarse a cualquier forma de almacenamiento que implemente la API adecuada.
Por lo tanto, si desea verificar las cosas sin un objeto de solicitud de solicitud específico, como ha dicho, solo tiene que acceder al mismo almacenamiento. En la parte inferior de la primera página de documentación, detalla los métodos necesarios que el almacenamiento necesita implementar, por lo que si está familiarizado con su API de almacenamiento, tal vez podría ejecutar un .getAll()
si algo así existe, y recorrer la sesión datos y lea los valores que desee.