참고글


세션의 자동 종료
세션은 지정한 유효시간만큼 접근하지 않게 되면 웹컨테이너에 의해 자동으로 종료됩니다. 즉 컴퓨터의 화면보호기와 같인 일정시간 이상 세션에 대해 아무런 행동을 취하지 않게 되면 자동으로 종료되는 것입니다. 세션이 종료되는 시점에 세션에 저장되어 있는 값들 또한 함께 제거됩니다. 만약 세션이 종료된 이후 세션에 접근하려 하면 새로운 세션이 생성됩니다.


세션의 마지막 접근 시간
세션 객체는 브라우저(클라이언트)측에서 가장 최근에 접근한 시간값을 가지고 있습니다. 세션의 유효시간은 가장 최근에 접근한 시간으로부터 최대 어느정도의 시간까지 세션을 살려둘것인지를 지정한 시간입니다.

먼저 세션에 가장 최근에 접근한 시간은 long getLastAccessedTime() 메서드를 사용하여 얻을 수 있습니다. getLastAccessedTime()는 JSP를 기준으로 가장 최근에 page 디렉티브의 session값이 true인 페이지에 접근한 시간을 의미합니다. 1970.1.1을 기준으로 몇 ms(1/1000초)가 흘렀는지를 정수값(long)으로 리턴합니다.

예를들어 2018-12-17 밤 22:58분 즈음 page 디렉티브의 session값이 true인 페이지에 접근하게 되면 해당 값은 대략 다음과 같이 1545055129383가 출력되는데, 1970.1.1을 기준으로 1545055129383ms가 흐른 시각에 접근했다는 것입니다.
<%   
     long lastAccessTime = session.getLastAccessedTime(); //1545055129383                 
     out.println(lastAccessTime);
%>
cs



세션의 유효시간 기준
Servlet/JSP 웹 컨테이너에는 세션의 invalidate() 메서드를 통해 명시적으로 세션을 종료해주는 기능 외에도 유효시간을 주어 자동으로 세션이 종료될 수 있도록 해주는 기능이 있습니다. 세션은 마지막 접근 시간으로부터 유효시간만큼 세션에 접근하지 않는 경우 자동으로 종료됩니다.

즉 유효시간이 30분이고 getLastAccessedTime() 메서드가 반환하는 시각이 11:00라면 11:30가 되는 시점에도 세션에 접근이 없는 경우 컨테이너는 해당 세션을 자동으로 종료하게 됩니다.



세션의 유효시간 지정 방법
그렇다면 세션의 유효시간은 어떻게 지정할 수 있을까요? 먼저 배포서술자인 web.xml을 통해 지정 가능합니다. 웹어플리케이션 경로의 WEB-INF/web.xml 파일을 통해 설정이 가능합니다. 다음과 같이 <session-config> 태그의 <session-timeout> 를 사용하여 지정 가능하며 단위는 분 단위입니다.
<session-config>
    <session-timeout>30</session-timeout>                                                
</session-config>
cs


세션별로 유효시간을 지정하는 방법
만약 세션객체별로 유효시간을 지정하고 싶다면 세션객체의 setMaxInactiveInterval(int interval) 메서드를 통해 지정할 수 있습니다. 단 이 경우 유효시간 단위는 분 단위가 아닌 초(second) 단위입니다.
<%   
     session.setMaxInactiveInterval(1800);                                                
%>
cs


만약 setMaxInactiveInterval() 값이나 web.xml 설정의 <session-timeout>값을 0이나 -1과 같이 음수값을 주게되면 해당 세션의 유효시간은 무한이 되어 컨테이너에서 제거되지 않습니다.

따라서 이경우 invalidate()메서드를 통해 명시적으로 종료해주지 않는 이상 컨테이너에 세션이 제거는 되지 않고 생성만 되어 무한정 늘어나게 되어 메모리 누수로 이어져 서버가 죽을 수 있습니다.
블로그 이미지

도로락

IT, 프로그래밍, 컴퓨터 활용 정보 등을 위한 블로그

,