[7.21] 서블릿 - 세션 관리
세션 관리 ( session tracking )
일반적으로 사용되는 세션의 정의는 ‘서버와 클라이언트간의 지속적인 연결’을 의미한다.
연결을 통하여 클라이언트는 지속적으로 서버에 특정 동작을 요청할 수 있으며 서버는 실행 결과를 클라이언트에 응답할 수 있다. 데이터베이스를 사용하는 경우에도 클라이언트와 DB서버간에 지속적인 연결을 의미하는 세션이 필요하다. 하지만 HTTP 프로토콜을 기반으로 하는 웹서비스는 동작 메커니즘이 다르다. 불특정 다수인 클라이언트와 지속적인 연결방식으로는 웹서버의 부하가 매우 크기 때문이다.
동시 접속자가 100만건이라고 가정했을 때, 100만 클라이언트와 지속적으로 연결된 서버가 동작하는 것은 불가능하다. 따라서 클라이언트가 웹서버에 요청하고 응답 받으면 즉시 연결을 끊는 connectionless 방식으로 동작된다. 이것은 웹브라우저의 각 페이지는 서로 간에 연결고리가 없다는 것을 의미한다. 즉, 첫 화면에서 선택한 물건을 장바구니에 담고 다음 페이지에서 결재할 때 이전 화면의 장바구니에 담긴 정보를 확인 할 수 없다는 것이다.
하지만 서비스되고 있는 많은 웹 사이트를 보면 장바구니 및 로그인 기능 같은 처리가 구현되어 있다. 이처럼 HTTP 프로토콜의 문제점을 극복하기 위해서 사용자(웹 브라우저)의 상태 정보를 관리하는 메커니즘이 필요한데 이것을 ‘세션 관리’라고 한다.
* HTTP protocol (통신규약)의 특징
1. 연결이 유지 되지 않는다
2. 연결생성 > 요청 전송 > 응답 수신 > 연결종료
3. Connectionless, Stateless Protocol
=> 물리적인 세션(지속적 연결)의 생성은 불가능!
=> 추상적인 연결로 세션을 생성/관리 (방법2가지):
(1) HttpSession 객체를 이용하는 방법
(2) Cookie 객체를 이용하는 방법
1. HttpSession 클래스를 이용한 세션처리 방법
- A클라이언트가 서버에 요청하는 구조
- B클라이언트가 서버에 요청하는 구조
A클라이언트(B클라이언트)가 서블릿에 요청을 하면, 서블릿에서는 getSession() 메소드를 사용하여 session영역을 생성하고 A클라이언트의 고유 식별값인 세션ID를 생성하여 session영역에 저장시킨다.
일반적으로 session영역에는 장바구니 정보 및 로그인 정보등을 저장한다. 서블릿의 실행결과가 응답 처리될 때 자동으로 세션ID값이 포함되며, 동일한 브라우저에서 재요청이 발생되면 세션ID값을 포함하여 요청처리 된다.
따라서 서버는 재요청에 포함된 세션ID값을 이용하여 클라이언트와 연결기능을 유지할 수 있다. 이때 A클라이언트가 일정시간동안(기본 30분) 요청을 하지 않으면 서버는 클라이언트 정보 를 제거할 목적으로 session영역을 삭제한다. 로그아웃 같은 기능을 구현하기 위해서 session영역을 즉시 삭제할 수도 있다.
2. 쿠키를 이용한 세션처리 방법
* 쿠키(Cookie)
(1) 아주 작은 데이터를 의미
(2) 벡엔드 서버에서 "최초요청"을 받았을 때, "웹브라우저"에게 주는 특별한 쿠키가 있는데
그 쿠키의 이름이 "JSESSIONID", 값은 "무작위 문자열"
(3) 응답문서의 헤더(이름: Set-Cookie)에 쿠키(이름=값형태로)가 저장되어 전송
* 웹브라우저는, 특정 웹사이트 주소로 "최초요청"을 보낸결과 자기의 이름으로 "세션아이디"를 쿠키로 받게 되고,
이를 쿠키파일로 저장(웹사이트 주소마다 다른파일로 저장)
- 이후 두번째 이상 요청부터는, 동일한 웹사이트로 요청을 보낼 때마다
해당 웹사이트 주소로 보관된 쿠키파일이 존재한다면 이 쿠키파일을 읽어서 다시 서버로 전송
(요청문서의 헤더(Cookie)에 저장되어 전송됨)
- 어느때까지 요청헤더에 쿠키값을 저장해서 전송하는가!?
--> 이 웹브라우저가 죽을 때까지