기존에 진행하던 프로젝트를 수정하는 과정에서 JESSIONID에 대한 이야기가 나와서, 한번 깔끔하게 정리하고자 포스팅해보고자 한다. (그냥 가볍게 java의 SessionID 아니려나? 라는 생각도 들었으나... 오늘 우테코에서 메타 인지 이야기도 나온 김에...)
1. JSESSIONID 란?
톰캣 컨테이너에서 세션을 유지하기 위해 발급하는 키이다.
즉, 세션에서 사용되는 쿠키이름이다. 쿠키는 클라이언트에 그리고 세션은 서버에 저장되는 걸로 알고있는게 일반적이고, 그러므로 쿠키보단 세션이 보안에 좋다고 이전에 공부했다. 하지만 세션 또한, 쿠키 형태로 서버와 클라이언트간에 주고 받는다.
HTTP 프로토콜은 기본적으로 stateless(무상태)하다. 즉, 상태정보를 유지하지 않기 때문에, 톰캣은 JSESSIONID 쿠키를 클라이언트에게 발급해주고 이 값을 통해 세션을 유지 할 수 있게 한다. 사실 이 방법 외에도 , URL Rewritng, 세션 방법을 사용한다.
2. 동작방식
기본적으로 쿠키 형태로 전송되는 것과 URL과 함께 전송되는 두가지 방법이 있는 것으로 알고 있으나, URL로 함께 전송하는 방식보다는 쿠키를 더 많이 사용하는 것 같아서, 쿠키에 대한 정보만 정리하고자 한다.
1. 브라우저에 최초 접근시 톰캣은 Response 헤더에 다음과 같이 JSESSIONID값이 발급된다.
Set-Cookie: JSESSIONID=3CB361E0BE1A9A7DE7DB926DF0772BAE
2. 브라우저 재요청시 Response를 통해 받은 JSESSIONID를 Request 헤더의 쿠키에 값을 넣어 서버에 요청한다. 쿠키를 통해 JSESSIONID값을 전달받게 되면 서버는 새로운 JSESSIONID 값을 Response 헤더에 발급하지 않는다.
3. 클라이언트로부터 전달받은 JSESSIONID값을 기준으로 서버에서는 세션 메모리 영역에 상태를 유지할 값들을 저장할 수 있게 된다. (HttpSession 등)
출처 : https://pshcode.tistory.com/114
3. 한계
톰캣 컨테이너를 2대 이상 사용하게 될 경우 세션을 유지할 수 없다. 유지가 되기 위해서는 세션 클러스터링 환경을 구축하여야 한다.
SessionID값이 유의미한 정보를 가지고 있지는 않으나, 탈취하여서 보안상 문제가 될 수도 있다고 한다. (하이재킹)
출처: https://dmobi.tistory.com/136
4. 번외- Postman
개인적으로 api 검사를 사용할 때, postman을 사용하는데, JSESSIONID를 어디에 세팅해야 되는지 초반에 헤멨던 기억이 남아있어서, 추가적으로 설명하고자 한다.
Postman의 send 버튼 아래의 Cookies를 클릭하면,
다음과 같은 창이 뜨는데, 아래에 Type a domain name에 domain 명 (http://localhost:8080)을 작성한 후, 쿠키값을 설정한다.
이런식으로 하면 세션 로그인이 필요한 부분에서도 편하게 포스트맨으로 확인해볼 수 있다 :)
'프로그래밍 공부 > Spring' 카테고리의 다른 글
[Spring] @Controller와 @RestController (0) | 2022.04.22 |
---|---|
[Spring] @RequestMapping (8) | 2022.04.20 |
스프링 스터디 기본편 -7 (0) | 2021.05.02 |
스프링 스터디 기본편 -6 (0) | 2021.04.26 |
스프링 스터디 기본편 -5 (0) | 2021.04.25 |