¿Cómo invalidar una sesión en el cierre del navegador?

3

Tengo una aplicación web donde la sesión web debe caducar después de un período de tiempo estipulado. Sin embargo, capturar un evento de cierre del navegador no es una buena idea para invalidar una sesión de usuario.

¿Cuál puede ser una solución alternativa para invalidar una sesión de usuario en el cierre del navegador?

    
pregunta ABC 26.09.2012 - 13:39
fuente

2 respuestas

5

La validación de sesión (en) es generalmente un concepto de servidor: una sesión es "válida" siempre que el servidor lo considere válido, es decir, concede acceso a los datos y funcionalidades definidos para que estén basados en la sesión.

Lo que normalmente se hace es:

  • El servidor tiene un tiempo de espera de sesión. Si no se oye nada del cliente durante algún tiempo, la sesión desaparece.
  • Se proporciona un botón de "cierre de sesión" explícito, cuando los usuarios desean activar un fin de sesión temprano.

Por su pregunta, supongo que desea que el "cierre" del navegador actúe como un botón de cierre de sesión. Si puedes capturar un evento de cierre, entonces eso es bueno. De lo contrario, puede usar un tiempo de espera corto (por ejemplo, dos minutos) y tener un poco de Javascript ejecutándose en el fondo de la página para realizar alguna actividad habitual de "mantener viva" con el servidor (por ejemplo, cada 90 segundos) siempre que la pestaña correspondiente / la ventana está abierta.

De cualquier manera, depende del servidor hacer cumplir un tiempo de espera. No puede manejarlo de manera confiable solo en el lado del cliente, solo porque el cliente puede desaparecer bruscamente sin dejar rastro (la batería del portátil del usuario está vacía, el usuario está viajando en un automóvil / tren y se sale del alcance de una estación, la máquina del usuario o el navegador se bloquea) , el usuario es malo y mata su navegador solo para molestarte ... las posibilidades son infinitas).

    
respondido por el Thomas Pornin 26.09.2012 - 14:50
fuente
2

Si no establece un tiempo de caducidad para la cookie de sesión, el navegador lo eliminará cada vez que se cierre el navegador.

Set-Cookie: SessionId=1ogf87b04oajp1lvkrid2iciskd2acug; path=/; HttpOnly

Esto te deja con la cuestión de la expiración de la sesión.

Esto debe hacerse mediante una verificación del lado del servidor: en cada solicitud (válida), almacene el tiempo de solicitud en / para esta sesión. Siempre que se realice una solicitud posterior, verifique la hora actual con la hora de la solicitud anterior. Si la última actividad fue hace más de X minutos, considere que la sesión ha caducado y expire explícitamente la cookie de la sesión estableciendo un tiempo de caducidad muy atrás. Establecer una fecha de caducidad de la cookie en el pasado (1971-01-01, por ejemplo) le dirá al cliente que puede recolectar la cookie de la sesión, mientras se asegura de que está caducando en el servidor.

Set-Cookie: SessionId=false; expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/

No debe confiar en ningún script de cliente o similar, no es necesario para la administración de la sesión (y no puede implementarse de manera confiable).

Editado para agregar:
Algunos marcos tienen una buena implementación de sesión, mientras que la mayoría hace un trabajo OK-ish. Sin embargo, algunos (te estoy mirando Zend Framework) están totalmente equivocados. Trate de asegurarse de que comprende qué se envían las cookies y no confunda la cookie de la sesión con, por ejemplo, una cookie "recordarme".

    
respondido por el Jacco 26.09.2012 - 17:23
fuente

Lea otras preguntas en las etiquetas