Lo tienes en la segunda suposición.
La cookie contiene un JSESSIONID. Esa identificación se usa para buscar la HttpSession del usuario en un mapa que el servidor mantiene. Al menos esta es la forma más común. Hay formas más intrincadas de que el servidor pueda implementar esto, pero llevar todo el estado atrás en una cookie no es uno de ellos.
Esto tiene algunas implicaciones. Primero, si el servidor se cae, pierde el estado de la sesión. En segundo lugar, si tiene un clúster de servidores, necesita que el usuario esté conectado al mismo servidor cada vez, o perderán su sesión entre solicitudes posteriores. Por último, el secuestro de sesión se convierte en una posibilidad si alguien encuentra la manera de copiar el JSESSIONID de otra persona y reemplazar el suyo.
Relacionados: http://stackoverflow.com/questions/3106452/java-servlet-instantiation-and-session-variables/3106909#3106909 – BalusC