Backend/Http+Servlet

JSESSIONID

findmypiece 2021. 3. 29. 10:30
728x90

지금은 이렇게들 안하지만 내가 Jsp 로 개발할때는 로그인 처리시 Session을 활용했다.

로그인에 성공하면 Session에 아이디 값을 저장하고 추후 페이지 접근시 마다

Session에 해당 아이디 값이 있는지에 따라 로그인 여부를 체크했다.

 

이때 아이디 값을 저장하고 읽어오는 방법은 아래와 같았다.

Session의 키값은 당연히 동일했다.

request.getSession().setAttribute("id", "user01");
request.getSession().getAttribute("id");

 

저장하는 구조를 보면 대략 Map과 비슷하고

우리가 아는 Map은 key, value 구조로 되어 있고 key가 중복될 수 없다.

 

그런데 A유저는 PC브라우저에서 로그인하고 B유저는 모바일브라우저에서 로그인 했다고 가정해보자.

두 유저 모두 Session의 "id"라는 동일한 키에 아이디 값을 저장하게 될텐데

위 코드가 어떻게 문제없이 동작하는 걸까?

 

이게 가능한 이유는 JSESSIONID 때문인데

위와 같이 Session을 저장할 경우 실제로는 서버에 아래와 같이 저장된다고 보면 된다.

Map<JSESSIONID, Map<String, Object>>

 

JSESSIONID 는 Tomcat 같은 서블릿 컨테이너에서 자동으로 생성하는 값으로

접속한 클라이언트를 구분하는 유니크한 값이다.

클라이언트 단위로 구분되는 값이기 때문에 해당 클라이언트의 요청은 기본적으로

모두 동일한 JSESSIONID 가 할당되어야 하는데 

http 프로토콜은 요청할때마다 새로운 연결이 생성되어 상태를 유지할 수 없기 때문에

아래와 같은 방식으로 JSESSIONID를 유지하게 된다.

 

1. 클라이언트에서 최초 접근시 서버에서는 Response Header에 JSESSIONID 쿠키 셋팅

2. 클라이언트에서는 이후 요청부터 Request Header에 JSESSIONID 값을 넣어서 보내줌.

3. 서버에서는 Request Header에 JSESSIONID 값이 존재할 경우 그 값을 활용

728x90