준준의 기록일지

[Session] JSESSIONID 본문

개발 전체

[Session] JSESSIONID

junjunwon 2021. 8. 9. 10:09

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."




고객사 포털 구축 작업 중 로그인 관련 수정 요청을 팀에서 받았다.

 로그인 / 로그아웃 시 JSESSIONID 파기 ,발급 시점 조정에 관한 부분으로 관련 요청 사항을 봤을때 부끄럽게도 JSESSIONID가 뭔지 몰랐다.. 세션인가??근데 J는 뭐지?  (검색해도 나오지는 않는듯..)

 

요청사항

- 로그인 성공 직후에 기존 세션 파기 , 새 세션 발급

- 로그아웃 직후에 기존 세션 파기, 새 세션 발급

 

 

이에 작업된 내역을 확인해보니, 

1
2
3
4
5
6
7
if(session != null) {
 
    session.invalidate();
    session = request.getSession(true);
    session.setAttribute("account", account);
 
}
 
cs

 

request.getSession(true)

  • HttpSession이 존재하면 현재 HttpSession을 반환하고 존재하지 않으면 새로운 세션을 생성한다.

 

request.getSession(false)

  • HttpSession이 존재하면 현재 HttpSession을 반환하고 존재하지 않으면 새롭게 생성하지 않고 그냥 null을 반환한다.

 

session.isNew()

  • 세로 생성된 세션인지 check

 

Session ID를 쿠키에 저장한다? Session Id ? Session Cookie?

Session Cookie (브라우저가 닫히면 만료됨)

 세션 식별정보를 쿠키로 저장하는 정책을 사용할 경우 클라이언트의 쿠키로 저장된 세션 데이터 전체(JSESSIONID, PHPSESSIONID 등)를 의미하고, 세션 ID는 그 쿠키에 저장되어 있는 값을 의미한다.

 

Session ID ( 쿠키에 종속된 속성으로 session의 id값을 가진다.)

서버에서 로그인 된 사용자의 세션을 식별하는 값을 의미한다. (사용자가 동일해도 여러개의 세션을 가질 수 있다? HOW?)

 

즉, 서버가 클라이언트에 세션ID를 부여하는 방법 중 하나가 쿠키를 이용하는 것이다. 세션Id를 클라이언트에 저장하기 위해 쿠키를 이용하는 것!!

서버는 JSESSIONID라는 이름으로 세션ID를 클라이언트에 저장해놓으면 클라이언트는 앞으로 모든 요청 헤더에 이 쿠키값을 포함시켜 보내고 서버가 이를 식별할 수 있다.

쿠키의 만료시간이 되면 클라이언트 측 쿠키는 소멸되기 때문에 동일한 클라이언트가 보낸 요청이라고 해도 서버는 새로운 클라이언트로 인식하게 된다. 하지만 이전에 서버측에 생성된 세션 정보는 유지될 수 있고, 아직 "Invalidate"가 되지 않았을 것. 

 

 

JSESSIONID

톰캣 컨테이너에서 세션을 유지하기 위해 발급하는 키.

HTTP 프로토콜은 stateless하다. 요청시마다 새로운 연결이 생성되고 응답후 연결은 끈히게 되므로 상태를 유지할 수 없다.

따라서 상태를 저장하기 위해서 톰캣은 JSESSIONID 쿠키를 클라이언트에게 발급해주고 이 값을 통해 세션을 유지할 수 있도록 한다.

 

동작 방식

  1. 브라우저에 최초 접근 시 톰캣은 Response 헤더에 다음과 같이 JSESSIONID값이 발급된다.
    • Set-Cookie : 
  2. 브라우저 재요청시 Response를 통해 받은 JSESSIONID를 Request 헤더의 쿠키에 값을 넣어 서버에 요청한다. 쿠키를 통해 JSESSIONID 값을 전달받게 되면 서버는 새로운 JSESSIONID 값을 Response 헤더에 발급받지 않는다.
  3. 클라이언트로부터 전달받은 JSESSIONID값을 기준으로 서버에서는 세션 메모리 영역에 상태를 유지할 값들을 저장할 수 있게 된다. (HttpSession 등)

 

유지 범위

  • 동일한 Full 도메인 ( 서브도메인이 다를 경우 쿠키가 유지되지 않기 때문)
  • 포트번호는 달라도 무관하다.

 

한계

  • 톰캣 컨테이너를 2대 이상 사용하게 될 경우 세션을 유지할 수 없다. 유지가 되기 위해서는 세션 클러스터링 환경을 구축하여야 한다.

 

 

 

 

출처 

https://dmobi.tistory.com/136

https://july1012.tistory.com/entry/getSession-getSessiontrue-getSessionfalse-%EC%B0%A8%EC%9D%B4%EC%A0%90

 

getSession(), getSession(true), getSession(false) 차이점

1. getSession(), getSession(true)  - HttpSession이 존재하면 현재 HttpSession을 반환하고 존재하지 않으면 새로이 세션을 생성합니다 2. getSession(false)  - HttpSession이 존재하면 현재 HttpSession을..

july1012.tistory.com

 

[Tomcat] JSESSIONID 란? 쿠키란?

JSESSIONID란? - 톰캣 컨테이너에서 세션을 유지하기 위해 발급하는 키 - HTTP 프로토콜은 stateless하다. 요청시마다 새로운 연결이 생성되고 응답후 연결은 끊기게 되므로 상태를 유지할 수 없다. - 따

dmobi.tistory.com