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 입출력 관련한 성능 이슈가 생김