Web

Servlet (4) - Session

Servlet - 세션(Session)

1. 세션의 개념과 처리방식

HTTP 프로토콜의 특성상 연속된 연결은 존재할 수 없다. 왜냐하면 HTTP는 데이터의 전송이 긑나면 곧바로 연결을 끊어버리기 때문이다. 즉, 연결에 대한 영속성(persistence)이 없다. 이러한 방식은 부족한 네트워크 자원을 효울적으로 사용할 수는 있지만, 웹 서비스를 위한 사용자 인증 및 유 지와 같은 사용자 정보를 관리하는데 문제가 있다.

물론, 쿠키를 사용하면 사용자 인증을 만들 수 있지만 쿠키를 이용한 사용자 인증은 관리의 책임이 모두 프로그래머에게 있고, 쿠키를 브라우저 설정에 따라 사용하지 못할 수도 있기 때문에 완벽한 사용자 관리를 할 수 없다. 그래서, 서블릿에서는 세션 관리를 위한 전반적인 기능을 제공해주는 HttpSession 인터페이스를 제공해주고 있다. 즉, 하나의 사용자는 언제나 같은 컴퓨터에서 접속을 한다는 사실을 이용한 것이다.

사용자는 여러 컴퓨터에서 같은 웹 사이트에 접속하지 않기 때문에 서버 측에서는 클라이언트의 정보를 체크해서 클라이언트를 구분할 수 있다. 이 때, 클라이언트에 대한 정보로는 쿠키를 사용한다. 이렇게 함으로써, 쿠키를 직접 이용하는 것 보다 더 효과적인 클라이언트 관ㄹ리가 이루어질 수 있다.
다음은 세션의 처리방식이다.


1.  클라이언트(웹 브라우저)가 특정 도메인(웹사이트)에 요청한다.
2.  서버는 접속한 클아이언트에 대한 세션 ID를 생성하고 세션 ID값을 저장한다.
3.  서버는 세션 ID와 함께 클라이언트에게 응답한다.
4.  클아이언트는 세션 ID를 쿠키로 저장한다. 이때 쿠키의 이름은 jessionId이다.
5.  클라이언트가 도메인에 재요청시 저장된 세션 ID를 서버에 넘겨준다.
6.  서버는 클라이언트에서 받은 세션 ID를 이용하여 클라이언트를 구별한다.  

즉, 세션은 객체로 서버에서 저장하는 것이고 세션ID만 클라이언트가 쿠키로써 들고다니는 것이다.

HttpSession 인터페이스

일반적으로 세션은 한 사용자와 웹 서버간에 존재하는 가상 연결이라 할 수 있고, 사용자(웹 브라우저)와 웹 서버간에 하나의 세션이 성립되도록 되어 있다.
이를 위해 HttpSession 인터페이스는 세션 구분자(session identifier), 생성 시간(creation time), 세션 문맥(session context) 등과 같은 정보를 유지할 수 있는 기능을 제공한다.

2. 세션의 생성과 소멸

세션은 생성된 후 Attribute를 통ㅎ ㅐ정보를 저장 및 추출하여 사용한다. 세션이 만료되어 소멸되면 한 세션의 수명이 끝난다고 하겠다. 다음과 같이 세션의 각 시점에 사용되는 메소드를 예제와 함께 알아보자.

세션의 생성

세션의 생성 시점은 임의의 웹브라우저로부터의 첫 번째 웹페이지(JSP)요청을 처리할 때, session이 생성되고 관련 타이머가 동작한다. 만약 첫번째 요청이 서블릿 요청이라면 HttpServlet Request의 getSession()메소드를 이용하여 생성한다.

세션의 정보 저장과 추출

세션 역시 Name=Value 형식으로 정보를 저장한다. Name을 Key값으로 정보를 저장 및 추출할 수 있다.

메소드 : getAttribute(String anme)
리턴타입 : Object
-> name을 가지고 Session에 저장된 value를 리턴한다.

메소드 :setAttribute(String name, Object value)
리턴타입 : void
-> Session에 name=value의 매핑 형태로 정보를 저장한다.

1
2
3
4
5
6
7
8
9
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session = request.getSession();
        if(session.isNew()) {
            session.setAttribute("userID""user");
        }
        else {
            session.getAttribute("userID");
        }
    }
cs

세션의 소멸

세션은 세션 타이머가 만료되어 소멸되거나 코드(invalidate()) 상에서 명시적으로 세션을 소멸시킬 수 있다.

세션의 타임아웃 설정 방법

  • web.xml에서 세션 유효 시간을 설정할 수 있으며, 기본은 30분(1800초)이다.
  • 세션 자체의 invalidate()메소드를 이용하여 직접 삭제할 수 있다.
  • setMaxInactiveInterval(초 단위) 메소드를 이용하여 유효 시간을 설정할 수 있다.

invalidate() : 현재 세션을 종료하고 관련된 값들은 모두 지워진다.
-> 로그인/로그아웃 기능에 활용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //request 객체로부터 세션 객체를 생
        HttpSession session = request.getSession(true);
        
        //session이 처음으로 생성된 것인지 체크한다 
        if(session.isNew()) {
            //세션이 최초에 생성된 시점에 호출되어짐. 
            System.out.println("NEW ");
            System.out.println("Session ID : " + session.getId());
            System.out.println("생성시간 : " + new Date(session.getCreationTime()));
            System.out.println("최근접근시간 : " + new Date(session.getLastAccessedTime()));
            
            //세션 타임아웃시간 조회
            System.out.println("Max Inactivate Interval : "
                    + session.getMaxInactiveInterval());
            
            //세션 타임아웃시간을 1200초로 설정함.
            session.setMaxInactiveInterval(1200);
        }
        else {
            //세션 생성후의 요청일때 호출되어짐.
            System.out.println("OLD Session");
            System.out.println("Session ID : " + session.getId());
            System.out.println("생성시간 : " + new Date(session.getCreationTime()));
            System.out.println("최근접근시간 : " + new Date(session.getLastAccessedTime()));
            System.out.println("Max Inactivate Interval : "
                    + session.getMaxInactiveInterval());
        }
    }
cs

HttpSession 객체를 얻기 위해 HttpServletRequest 객체의 getSession(boolean)메소드를 사용하였다. 여기서, 인자로 주는 boolean 값은 세션을 새로 만들지를 결정하는 변수이다. 이 값은 맨 처음 접속했을 때는 HttpSession이 없는 상태이므로 보통 true로 준다. 이미 HttpSession이 존재하는 경우에는 true값을 넣었더라도 기존에 설정되어 있는 HttpSession 객체를 되돌려준다.

이 때, 새로 만든 세션인지 여부를 확인하기 위해 isNew()메소드를 사용할 수 있다.
실제로, 세션은 30분마다 자동으로 갱신되도록 되어있다. 다시 말해서, 이미 세션이 만들어져서 관리되고 있다고 하더라도 30분동안 아무런 작업도 하지 않거나 다시 접속이 이루어지지 않으면 연결되어 있는 세션은 끊어지고, 이 때 다시 접속하게 되면 새로운 세션을 생성한다는 것이다.

'Web' 카테고리의 다른 글

JSP (2) - Directive Tag(지시자 태그)  (0) 2019.09.29
JSP (1)  (0) 2019.09.29
Servlet (3) - Cookie  (0) 2019.09.28
Servlet (2)  (0) 2019.09.28
Servlet (1)  (0) 2019.09.28