자바 서블릿 게시판 프로젝트를 만들며 로그인을 세션 방식으로 구현했다. 그렇다면 이 세션은 무엇인지 알 필요가 있다는 생각이 들어 정리해본다.
세션이란?
- Session은 영구적이고 상호작용적인 정보 교환을 전제하는 둘 이상의 통신 장치나 컴퓨터와 사용자 간의 대화나 송수신 연결상태를 의미하는 보안적인 다이얼로그(dialogue) 및 시간대를 가리킨다. - 위키 백과 -
- == 클라이언트-서버 간 연결 상태를 의미한다.
- == 클라이언트가 브라우저에 접속해 서버와 접속이 종료하기 전 상태
HTTP 통신 구조는 HTTP 통신의 이해 를 참고할 수 있다.
세션 동작 과정
HTTP 같은 클라이언트-서버 프로토콜에서 세션은 세 가지 과정으로 이루어진다.
- 클라이언트가 (TCP) 연결을 수립한다.
- 클라이언트는 요청을 전송한 뒤 응답을 기다린다.
- 서버는 요청을 처리하고 데이터와 상태 코드를 돌려보낸다.
- (HTTP/1.1부터는 이 과정 이후 연결을 닫지않는다. == 2, 3번 과정이 몇 번에 걸쳐 일어난다.)
이를 로그인 과정에 대입한다면, (연결 수립 전제)
- 클라이언트는 로그인을 요청한다. - 요청
- WAS에서는 DB에 사용자 정보를 확인, 검증한다.
- 검증이 된 경우 세션저장소 에서 회원정보 세션을 생성하고 세션ID(키)를 발급한다.
- 세션ID를 쿠키에 담아 클라이언트로 전송한다. - 응답
- 이후 클라이언트가 서버에 재요청하게 될 때 세션 ID를 헤더쿠키에 넣어 데이터를 요청한다.
- 서버는 세션ID를 통해 클라이언트(회원정보)를 구별하여 알맞게 응답한다.
자바 SevletContext 내에서의 세션
- 서블릿 컨테이너(아파치 톰캣)가 시작되면, 해당 서블릿 컨테이너는 모든 웹 어플리케이션들을 배포하고 로드(load)한다.
- 웹 어플이케이션이 로드되면 서블릿 컨테이너는 ServletContext를 한번 생성하여, 서버의 메모리에 보관한다.
- 서블릿 컨테이너는 특정 포트번호(8080, 80)에서 HTTP 요청을 받는 웹 서버에 연결된다.
- 클라이언트가 요청을 보낼때 서블릿 컨테이너는 HTTPServletRequest, HTTPServletResponse 인스턴스를 생성,
- 필터 체인과 서블릿 인스턴스를 통과하도록 한다.
chain.doFilter(request, response)
를 호출하면 req, res가 다음 필터로 넘어가거나 서블릿에 도달- 서블릿의 경우
service()
메서드가 호출되고doXXX()
메서드를 호출한다.
- 클라이언트가 처음으로 웹앱에 방문하거나
request.getSession()
을 통해 HttpSession 을 처음으로 가져오면, - 서블릿 컨테이너는 새로운 HttpSession 객체를 생성하고 길고 유니크한 ID 를 생성 후 서버 메모리에 저장한다.
- 이는
session.getId()
를 통해 가져올 수 있다.
- 이는
- 서블릿 컨테이너는 JSESSIONID란 이름을 key로, 생성한 session ID를 value로 하여 HTTP 응답의 Set-Cookie header에 cookie로 설정합니다.
- HTTP 쿠키 스펙에 따라 클라이언트(브라우저)는 쿠키가 유효한 동안 이 쿠키를 후속 요청 쿠키헤더로 보내야한다.
- 유효한 동안 : 고유 식별자가 만료되지 않은 세션을 참조하고 도메인 및 경로가 올바른 경우
- HttpSession의 기본값은 30분이며 web.xml 의 를 통해 설정가능
- 웹브라우저 인스턴스(탭,창)이 실행되는 동안 세션 쿠키가 활성화되고, 이를 닫으면 session 이 삭제된다.
- 서블릿 컨테이너는 들어오는 모든 HTTP 요청의 쿠키헤더에서 JSESSIONID 라는 이름의 쿠키가 있는지 확인하고,
- 그 값(길고 유니크한 session id)을 이용해 서버 메모리에 저장된 HttpSession을 가져온다.
참고(레퍼런스)
톰캣 에서는 어떻게 JSESSIONID 를 만드는 것일까
'개발' 카테고리의 다른 글
Git 사용중 로컬-원격 저장소간 충돌상황일때(변경 사항이 충돌하지 않을때) (0) | 2023.03.16 |
---|---|
자바 - checked Exception, unchecked Exception (0) | 2022.12.22 |
[북TIL] 파이썬 알고리즘 인터뷰 7장 배열 (0) | 2022.08.11 |
데이터베이스의 병행제어기법 (0) | 2022.07.16 |
인터페이스 모듈 연계 방식 EAI와 ESB (0) | 2022.07.14 |