finerss's world!

웹 서버에는 메모리가 없어서 응답을 보낸 다음에는 당신이 누구였는지 조차 잊어버린다.

다음번에 다시요청을해도 그가 이전의 당신이었다는 것을 모른다는 것이다.

즉 웹서버는 당신이 이전에 요청했다는 사실을 기억하지 못하며, 당신에게 응답을 보냈다는 것도 기억하지 못한다.

그러나 프로그램을 하다보면 여러 번의 요청으로 오고 간 클라이언트와 대화 내용(state)을 기억할 필요가 있다 예를들어

고객이 상품을 장바구니에 넣고, 결제하는 동작을 하나의 요청으로 처리할 수는 없지 않은가?

서블릿 API에 이를 해결할 아주 단순한 방법이 있다.

HttpSession을 사용하는 방법이다.

다중 요청간 대화 정보를 유지 하기 위하여 httpSession객체를 사용할수 있다.

즉 특정 사용자의 전체 세션 동안의 정보를 유지할 수 있다는 말인데

클라이언트가 세션이 유지되는 동안 모든 보낸 요청으로부터 얻은 정보를 여기에 저장할 수 있다.

Http 프로토콜은 무상태(stateless)연결이다. 클라이언트인 브라우저는 서버에 연결을 맺고, 요청을 보낸뒤, 응답을 받는다.

그후 연결을 끊는데 연결이라고 하는것은  한번의 요청과 응답을 위해 존재한다고 말할 수 있다.

지속적인 연결이 아니기 떄문에, 클라이언트가 맺는 두번쨰 요청이 똑같은 클라이언트로부터 온 것이라고 할지라도

컨테이너는 이를 모른다. 컨테이너는 단지 각각의 요청이 새로운 클라이언트로부터 왔다고 생각할 뿐이다.

이문제를 해결하는방법은 간단하다.

클라이언트가 제일 처음 요청을 보낼 떄, 컨테이너는 클라이언트의 유일한 세션 ID를 생성 하는 것이다.
그리고 이값을 Response에 넣어 클라이언트로 돌려보내는 것이다. 그 다음부터 클라이언트가 요청을 보낼 떄는
이 세션ID를 함꼐 보내는 것이다. 그러면 컨테이너는 ID를 받아보고 일치하는 세션을 찾아 세션과 연결을 요청한다.


어떻게 클라이언트와 컨테이너는 세션 ID 정보를 공유하는가?

컨테이너는 클라이언트에 Response의 일부로 세션 ID를보낸다.
그러면 클라이언트는 다음 요청부터 Request의 일부로 세션ID을 돌려보낸다.
세션ID정보를 교환하는 가장 간단하며, 일반적인 방법은 쿠키를 이용하는 것이다.


"Set-Cookie"는 Response에 있는 헤더 중 하나이다.

 

"Cookie"는 Request에 있는 헤더 중 하나이다.


컨테이너가 거의 모든 쿠키 관련 작업을 한다.

먼저 컨테이너에게 세션을 만들어 사용하고 싶다고 말하면 컨테이너가 세션 ID를 생성하고 새로운 Cookie객체를 만든다.

그러면 컨테이너는 쿠키 안에 세션 ID 값을 채우고, Response에 쿠키를 설정한다.

그다음 번 클라이언트 요청부터는, 컨테이너는 Request 객체에서 쿠키를 찾아서 세션 ID가 무엇인지 확인한다.

현재 존재하는 세션 가운데에서 세션 ID를 가진놈을 찾아서, 세션과 요청을 연결한다.



Response 객체에 세션 쿠키 보내기

 HttpSession session = request.getSession();

Request 객체로부터 세션 ID 가져오기

HttpSession session = request.getSession();


세션ID를 생성할 떄와, Request에 쿠키를 설정할떄 쓴 코드는 같다.

Request안에 세션ID 쿠키가 들어있으면

ID에 맞는 세션을 찾으면 되고,

그렇지 않고 세션ID쿠키가 없거나 세션 ID에 일치하는 세션이없으면

새로운 세션을 만들면 된다.

모든 쿠키 관련 작업은 내부에서 일어난다.

세션 종료

세션이 종료되는 세가지 이유

>시간이 다 되어서 (타임아웃)
>개발자가 세션 객체에 invalidate() 메소드를 실행하는 경우
>애플리케이션이 다운되는 경우(문제가 생겨 다운되거나, 언 디플로이(undeploy)되는경우)

1.DD에서 세션 타임아웃을 설정하기
DD에서 설정하는 타임아웃은 생성되는 모든 세션에 setMaxInactiveInterval()메소드를 호출하는 것과도 같다.

 <web-app ...>
       <servlet>
        ...
       </servlet>
      <session-config>
            <ssesion-timeout>15</ssession-timeout>
            //15분을의미하며 클라이언트가 15분동안 요청이없으면 세션을  제거하라는 의미이다.
       </session-config>
</web-app>


2.특정 세션만 타임아웃 설정하기
특정 세션 인스턴스만 세션 타임아웃 값을 변경할 수 있다.(다른 세션 타임아웃 값은 바뀌지않는다.)

session.setMaxInactiveInterval(20*60);


*DD에 있는 타임아웃의 단위는 분이고 프로그램적으로 한세션에 설정하는 값은 초단위이다.

'공부 > Sevlets&JSP' 카테고리의 다른 글

JSP 기초  (0) 2011.07.01
Session Listener(세션 리스너)  (0) 2011.06.30
RequestDispatcher  (0) 2011.06.29
동기화  (0) 2011.06.29
Attribute(속성)  (0) 2011.06.28