Search

[Java] 웹 세션(Session)의 개념과 서블릿 HttpSession

Session이란?

HTTP는 기본적으로 무상태(statless)이기 때문에 같은 서비스라고 해도 웹페이지 요청마다 어떤 사용자가 보내는 것인 지 구분할 수 없음
따라서 서버에서는 사용자를 구분하기 위해 session ID라는 상태 코드를 발급하고, session ID는 쿠키라는 문자열 형태로 사용자의 브라우저에 저장됨
쿠키는 session 쿠키와 persistance 쿠키로 나뉨. session 쿠키는 브라우저가 종료되거나 사용자가 로그아웃을 하면 삭제되며, session ID가 이 session 쿠키 형태로 발급됨
만료 날짜를 설정하지 않으면 session 쿠키가 됨
쿠키는 HTTP 헤더를 통해 전달되는 단순 문자열로, 세션을 운송할 수 있는 여러 방법 중 하나일 뿐
서버는 사용자의 매 요청마다 이 session ID를 확인해서 어떤 사용자가 보내는 요청인지 구분해서 서비스할 수 있는데, 이렇게 session ID를 통해 사용자의 요청이 구분되는 논리적인 범위를 세션이라고 함
즉, 세션동일한 session ID를 가진 request의 집합이라고 할 수 있음(물론 session ID를 재발급한 경우도 포함)

서블릿 HttpSession 객체

서버의 메모리에는 각각의 SessionID마다 HttpSession 객체가 매핑되어 있음
또한 각각의 HttpSession 객체는 Session Attributes라는 key-value 매핑을 가지고 있어 저장소 내의 저장소 형태를 가지며, 세션별 데이터를 보관하여 상태를 유지함
즉, 세션 ID는 저장소의 ID가 되고, 해당 저장소에 로그인 정보를 비롯한 각종 세션별 정보가 들어있음
세션 얻는 법
HttpSession session = request.getSession(true); //true는 default라 생략 가능
Java
복사
getSession을 하면 통해 현재 요청을 한 사용자의 쿠키에서 sessionID를 찾은 후 sessionID에 해당하는 HttpSession 객체를 반환함
true 옵션: 현재 요청에 세션id가 있으면 해당 세션 객체를 가져오고, 없으면 세션id를 발급하고 새로운 세션 객체를 가져옴
HttpSession session = request.getSession(false);
Java
복사
false 옵션: 현재 요청에 세션id가 있으면 해당 세션 객체를 가져오고, 없으면 null을 반환함

주의점

세션을 메모리에 저장할 경우 세션 저장소에 로그인 등 최소한의 정보만을 저장하도록 해야 함
보통 30분마다 세션 id를 만료시켜서 메모리를 정리하고 보안도 높이는 것을 권장함
세션 저장소는 DB로 대체할 수 있지만, DB 입출력 관련한 성능 이슈가 생김

관련 문서