본문으로 바로가기

[TOMCAT] jsession 이란?

category JAVA/라이브러리(API) 2021. 4. 9. 02:04

JSESSIONID란?

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

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

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

 

동작방식에 대해서

1. 브라우저에 최초 접근시 톰캣은 Response 헤더에 다음과 같이 JSESSIONID값이 발급된다.

 

Set-Cookie: JSESSIONID=3CB361E0BE1A9A7DE7DB926DF0772BAE

 

2. 브라우저 재요청시 Response를 통해 받은 JSESSIONID를 Request 헤더의 쿠키에 값을 넣어 서버에 요청한다. 쿠키를 통해 JSESSIONID값을 전달받게 되면 서버는 새로운 JSESSIONID 값을 Response 헤더에 발급하지 않는다.

 

3. 클라이언트로부터 전달받은 JSESSIONID값을 기준으로 서버에서는 세션 메모리 영역에 상태를 유지할 값들을 저장할 수 있게 된다. (HttpSession 등)

 

유지범위

- 동일한 Full 도메인 (서브도메인이 다를 경우 쿠키가 유지되지 않으므로..)

- 포트번호는 달라도 무관하다.

 

쿠키(Cookie)란?

● 요약
 - 쿠키 기본
   1) 기본적으로 클라이언트의 소유
   2) 서버에 요청시 헤더에 자동으로 포함해서 전송됨
   3) 주로 서버단의 필요에 의해 클라이언트에 생성하도록 지시 (Set-Cookie) 
       예:) JSESSIONID
   4) HttpOnly, Secure 속성은 서버→클라이언트로 던져주며, 클라이언트→서버는 값을 주지 않음.
       고로 디버깅 창에서 Response 속성으로만 확인가능

 - Tomcat 8.5 이상 
    1) httpOnly 기본값=true (true이면 JavaScript로 탈취 불가
    2) secure = true 이면 https 로만 전송됨

-  세션 쿠키 vs 영구적 쿠키
    1) 만료시각을 지정하면 영구적 쿠키, 파일 저장
    2) 만료시각이 없으면 세션 쿠키, 메모리 저장, 브라우저 닫으면 삭제됨

 

 

 

문제 :

HttpSession.getAttribute("user")

사용자 A가 접속해도 "user"를 Key로 값을 가져오고,

사용자 B가 접속해도 "user"를 Key로 가져옵니다.

같은 Key를 쓰는데 어떻게 A와 B를 구분해서 가져 오나요?


-> client에서 JSesssion값을 header로 보낼때 쿠키값을 통해 동일한 사용자의 접근인지 판단합니다.
* 상태를 저장하기 위해서 톰캣은 JSESSIONID 쿠키를 클라이언트에게 발급해주고

  이 값을 통해 세션을 유지할 수 있도록 한다.

첫번째 방법은 쿠키가 허용되는 브라우저의 요청 방법이고,

두번째 방법은 쿠키가 허용되지 않는 브라우저의 요청 방법 입니다.


1. 쿠키형태로 전송되는 jsessionid 

- 세션을 생성하고,서버로부터 받은 jsessionid값 입니다.세션이 끊기지 않는 이상 유지되는값 입니다.

- 쿠키가 허용되는 브라우저 이므로 encodeURL 메소드를 사용해도 일반링크와 동일한 URL을 볼 수 있습니다.

- 두가지의 확인을 클릭하더라도 동일한 결과 값을 볼 수 있습니다.

 

         

 

- 서버로 부터 받은 위의 jsessionid 값을 서버에 전달한 후 세션과 비교하여 동일하다면 정보를 유지시킵니다.

- 세션값이 stoneis.pe.kr 이 나오는 모습을 볼 수 있죠. 

 

         

 

- 역시 삭제버튼을 눌렀을 때도 쿠키로 jsessionid 값을 서버에 전송 합니다. 

- 서버에서는 세션을 제거하였기에 보낸 쿠키의 jsessionid 값은 세션영역에 없는 게 됩니다.

- 그리고는 새로운 요청이라고 판단하고 새로운 jsessionid 값을 사용자에게 보냅니다. 

- 세션이 제거됨으로써 새로고침을 계속한다면 새로운 jsessionid 값을 보내옵니다.


         

 

 

 

2. URL과 함께 전송되는 jsessionid

- 쿠키가 허용되지 않는 브라우저에서 일반링크와 encodeURL 메소드를 사용한 링크가 다른 값을 보여줍니다.

- 서버로 부터 jsessionid 값을 받아 URL뒤에 ;jsessionid=xxxx 를 생성하게 됩니다.

- 이 URL로 세션정보를 유지하게 되며, 값이 변경될 시에는 세션정보를 불러오지 못합니다.

 

 

- URL 주소창에서 보시면 jsessionid 값을 서버에 요청한 걸 볼 수있고, 이와 일치하는 세션영역에서 정보를 가져와  세션값을 표시하게 됩니다.

- 역시나 일반링크와 encodeURL 메소드를 사용한 URL은 다릅니다. 



- 세션이 제거된 후 새로운 jsessionid 값을 가져오게 됩니다. 

- 세션이 제거되었기 때문에 URL 뒤에 jsessionid 값이 붙지 않습니다.


         



- 세션 생성 후 일반링크를 통해 세션확인 페이지로 갔을 시에 jsessionid 파라미터가 없기에 세션값을 불러오지 못합니다. 

 

 

 

출처: https://pshcode.tistory.com/114 [박성훈의 웹개발]

출처: m.blog.naver.com/PostView.nhn?blogId=musasin84&logNo=60189962819&proxyReferer=https:%2F%2Fwww.google.com%2F

'JAVA > 라이브러리(API)' 카테고리의 다른 글

[JAVA] 자주 사용되는 Lombok 어노테이션  (0) 2021.05.20