세션(Session)은 네트워크상에서 클라이언트와 서버간의 통신을 유지하는 기술이다.
세션은 보통 클라이언트와 서버간의 상태 정보를 저장하는 데 사용된다.
예를 들어, 로그인 정보나 쇼핑몰에서 선택한 제품 등의 정보를 세션에 저장하고, 이후에 클라이언트가 서버에 요청을 보낼 때마다 해당 정보를 참조하여 처리할 수 있다.
세션은 일정 시간이 지나면 만료되거나, 클라이언트가 명시적으로 세션을 종료하는 등의 조건에 따라 종료된다.
둘 다 상태 유지 관리 기술이다.
Http는 지속적인 자원 낭비를 막기 위해 응답 후 연결이 해제된다. 이를 stateless라고 한다.
하지만 로그인 정보 등과 같이 클라이언트와 서버가 연결 상태를 유지해야 하는 문제가 발생하기 때문에 해당 개념이 등장하였다.
즉, 클라이언트 단위로 상태 정보를 유지해야 하는 경우 쿠키와 세션이 사용된다.
쿠키 : 사용자 클라이언트에 저장
세션 : 사용자 정보가 서버 쪽에 저장
세션은 서버 자원 내에서 사용할 수 있다. 즉, 서버의 일정 가용치 미만의 정보만 저장할 수 있다.
수강신청 과정에서 접근이 막히거나 다시 시도하라는 이유가 이것 때문이다. 일정한 숫자의 계정 용량만 할당하였기 때문이다.
세션은 서버에서 정보를 저장하기에, 가용 용량에 명확한 한계치가 있다.
누군가 로그인 정보를 유지한다면, 그만큼 서버 내에서 용량을 차지하는 것이다.
톰캣 서버에서는 일반적으로 세션의 만료 기한을 30분으로 둔다. 요청이 발생하면 이를 갱신한다.
서버에서는 이걸 어떻게 알까? 각각의 사용자마다 고유한 아이디값을 주고, 요청 발생 시 이를 보내게 한다.
Tomcat Server의 경우
JSESSIONID
라는 명칭으로 붙어서 전송된다.
JSESSIONID
의 경우 별도의 프로그래밍 없이도 웹 브라우저에서 자동으로 설정되어 전송된다.
반대로 서버에서 보낸
JSESSIONID
는 클라이언트 브라우저에서 저장된다. 이를 쿠키를 활용한 세션이라고 한다.
Q. 그러면 쿠키를 활용한 세션은 쿠키와 뭐가 다른가요?
A. 해당 쿠키에는 핵심 정보가 없다. 키값만 존재하고 핵심 정보는 서버에 존재한다. 이 부분이 쿠키와 다르다.
그리고 이런 JSESSIONID의 경우 사용자 클라이언트에 존재할 수도 있기 때문에 탈취되어 악용될 수 있다.