-
세션(Session)language/Servlet&JSP 2019. 2. 22. 09:21반응형
ServletContext 객체나 HttpServletRequest 객체에 대해서는 앞서서 설명을 했는데 HttpSession 객체는 설명이 없었습니다. 지금부터는 HttpSession 객체에 대해서 알아보도록 하겠습니다.
지난 시간에 말씀드렸다 싶이 웹 서버는 요청에 대한 응답이 끝나고 나면 연결을 더 이상 유지하지 않습니다. 그렇기 때문에 서버에서는 요청이 들어온 클라이언트를 구분할 방법이 필요합니다. 그 역할을 수행하는 것이 바로 세션입니다.
클라이언트는 첫 요청이 발생하면 유일한 세션 ID를 생성해서 HttpSession 객체에 저장합니다. 이 때 Session 객체가 생성되어있지 않으면 생성하게 됩니다. 그리고 이 세션 ID를 클라이언트로 보냅니다. 클라이언트는 그 세션 ID를 가지고 있다가 다음번 요청할 때 함께 보내게 됩니다. 그러면 컨테이너는 세션ID를 검색해서 일치하는 세션과 연결하게 됩니다.
이 때, 클라이언트 측에 session id 가 저장하기 위해 cookie를 이용합니다. 컨테이너는 response 객체에 cookie 객체를 만들어 session id를 담은 뒤 클라이언트로 보냅니다. 그럼 클라이언트는 다음 요청에서 그 쿠키를 request header에 포함시켜 보내게 됩니다.
이런 세션 연결은 컨테이너가 합니다. 그냥 request 객체에서 session을 가져오기만 하면 나머지 복잡한 작업들은 자동으로 일어나게 됩니다.
그런데 클라이언트에 브라우저에는 쿠키를 사용하지 않는 기능이 있습니다. 그런 경우에는 session id 값을 쿠키로 전달할 수가 없습니다. 그럴 때 사용하는 방법이 url 재작성 입니다. 이 방법을 사용하게 되면 session id 정보를 url 뒤에 추가하게 됩니다. 컨테이너는 이 url 에 추가된 session id 를 읽어서 원래대로 해당하는 session을 찾을 수 있습니다.
클라이언트가 더이상 서버에 요청을 보내지 않으면 서버에서는 세션을 유지할 필요가 없습니다. 세션 객체들이 남아있으면 서버의 메모리 공간만 낭비할 뿐이죠. 하지만 서버의 입장에서는 클라이언트가 서버에 언제 서버에 요청을 보낼 지 알 수 있는 방법이 없습니다. 따라서 컨테이너는 클라이언트의 요청이 일정시간 없을 때 클라이언트의 사용이 끝났다고 생각하고 세션을 제거합니다. 이 때 setMaxInactiveInterval() method를 사용해서 세션 객체 제거를 결정하는 대기 시간을 결정할 수 있습니다. 또 개발자가 특정한 상황에서 invalidate() method를 호출해 세견을 종료시킬 수 있습니다.
이외에도 배포서술자를 이용해 모든 세션의 timeout 기준 값을 설정할 수도 있습니다.
쿠키 역시 생존 시간을 정의할 수 있습니다. 별도의 정의가 없으면 쿠키의 생명도 브라우저가 종료되면 끝나게 되겠죠. 하지만 쿠키의 생존 시간을 정해주면 그 시간동안 쿠키가 살아남게 됩니다.
반응형'language > Servlet&JSP' 카테고리의 다른 글
HTML (0) 2019.03.04 ExecutorService (0) 2019.02.22 속성, Attribute (0) 2019.02.22 ServletContextListener (0) 2019.02.22 ServletConfig 서블릿 초기화 파라미터, ServletContext 컨텍스트 초기화 파라미터 (0) 2019.02.22