서블릿에서 HTTP 세션을 어떠한 방식으로 만들어줄까?
하나의 HTTP 요청이 들어왔을 오고 이후 로직에서 세션 생성 요청이 있다면, 서블릿 컨테이너에서 세션을 만들고JSessionId를 부여해준다.
이렇게 만들어진 JSessionId 만 알고 있다면 만들어진 세션에 접근하여 원하는 정보들을 저장하거나 삭제할 수 있다.
그리고 요청이 끝난 뒤에도 해당 세션을 서블릿 컨테이너에서 관리하고 있다가 JSessionId를 쿠키로 가진 HTTP 요청이 들어올 경우, 서블릿 컨테이너에서 JSessionId 로 가지고 있는 세션들 중 일치하는 세션ID가 있는지 확인한다.
만약 일치하는 세션이 있다면 해당 요청에서 접근할 수 있도록 설정해준다.
위와 같은 방식으로 서블릿은 세션을 편하게 생성하고 사용할 수 있게끔 만들어 놓았다.
하지만 세션 방식에는 문제점이 있다.
첫번째는 메모리 문제이다.
서블릿 HTTP 세션의 경우 요청마다 세션을 생성할 수 있기에, 만약 설정을 잘못하거나 제대로 세션을 지워주지 않는다면 메모리 고갈이 일어날 수 있다. 그리고 세션을 제대로 지워주게 설정했더라도 세션의 라이프 타임이 길게 설정되어 있다면 이 상황에도 메모리 고갈이 일어날 수 있다.
두번째는 서버간 세션정보 공유 문제이다.
만약 서비스가 여러 개의 서버를 운영하여 부하를 줄여나가려고 할 때 문제가 될 수 있다. 세션의 경우 서블릿 컨테이너에서 관리되기 때문에 서버마다 기억하고 있는 세션의 정보가 다르다.
따라서 사용자 입장에서는 이전과 다른 서버로 요청이 갈 때마다, 세션을 만드는 인증 작업을 다시 해야하는 불편함이 있을 수 있다.