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".