본문 바로가기

[JSP]

10.클라이언트와의 대화 2: 세션(session)

1)세션 사용하기 : session 기본 객체

서버와 세션을 사용하면 쿠키와 비슷하게 클라이언트의 상태 값을 저장할 수 있다.

세션과 쿠키의 차이점으로는 세션은 웹 브라우저가 아니라, 서버에 값이 저장된다는 점이다. 쿠키의 이름이나 데이터는 네트워크를 따라서 전달되기 떄문에 중간에 누군가 쿠키의 값을 읽어올 수 있다. 하지만, 세션의 값은 오직 서버에만 저장되기 때문에 중요한 데이터를 저장하기에 알맞는 장소이다. 따라서 세션을 사용 하면 서버는 클라이언트의 상태 값을 유지할 수 있으며, 인증된 사용자 정보를 유지하기 위한 목적으로 세션을 많이 사용한다.

 

세션은 웹 브라우저마다 따로 존재하기 때문에 같은 JSP 페이지라도 실행하는 웹 브라우저에 따라서 서로 다른 세션을 사용하고 웹 브라우저에 관련된 1:1 정보를 저장하기에 알맞는 장소이다.

즉, 쿠키가 클라이언트 측의 데이터 보관 장소라면 세션은 서버 측의 데이터 보관 장소인 것이다.

 (1)세션 생성하기

세션을 사용하기 위해서는 먼저 세션을 생성해야 한다.

JSP에서 세션을 생성하기 위해서는 다음과 같이 page 디렉티브의 session 속성을 "true"로 지정한다.

<%@ page contentType = ... %>

<%@ page session = "true" %>

<%

    ...

    session.setAttribute("userInfo", userInfo);

    ...

%>

page 디렉티브의 session속성의 기본값은 "true"이므로 session 속성의 값을 "false"로 지정하지만 않으면 세션이 생성된다.

세션이 생성되면 session 기본 객체를 통해서 세션을 사용할 수 있다.

 

(2)session 기본 객체

세션을 사용한다는 말은 session 기본 객체를 사용한다는 것을 의미한다. session 기본 객체는 나머지 기본 객체(request, application, pageContext) 와 마찬가지로 속성을 제공한다. 

 

메서드 리턴타입 설명
getId() String 세션의 고유 ID를 구한다. (이를 세션 ID라고 한다.)
getCreationTime() long 세션이 생성된 시간을 구한다. 시간은 1970년 1월 1일 이후 흘러간 시간을 의미하며, 단위는 1/1000초이다.
getLastAccessedTime() long 웹 브라우저가 가장 마지막에 세션에 접근한 시간을 구한다. 시간은 1970년 1월 1일 이후 흘러간 시간을 의미하며 단위는 1/1000초이다.

각각의 세션을 구분하기 위해 세션마다 고유의 ID를 할당하며, 이를 세션 ID라고 한다. 웹 컨테이너는 웹 브라우저에 세션 ID를 전송하며, 웹 브라우저는 웹 컨테이너에 연결할 때마다 세션 ID를 알려주어서 어떤 세션을 사용할지 판단할 수 있게 해준다.

 

session 기본 객체를 사용할 때 마다 가장 최근에 사용한 시간을 기록하는데, 세션의 타임아웃을 관리하기 위해서이다.

 

다음은 위의 표의 메서드를 사용하여 현재 사용 중인 세션 정보를 보여주는 JSP 페이지이다.

sessionInfo.jsp

<%@ page contentType="text/html; charset=euc-kr" %>

<%@ page session = "true" %>

// 세션을 사용한다는 것을 지정한다. session 속성의 기본값은 true이므로, 생략해도 세션을 사용한다.

<%@ page import = "java.util.Date" %>

<%@ page import = "java.text.SimpleDateFormat" %>

<%

    Date time = new Date();

    //long 타입의 시간 값을 저장하기 위해 사용되는 Date 객체를 생성한다.

    SimpleDateFormat fomatter = 

        new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    //Date 객체가 저장한 시간 값을 지정한 양식으로 출력하기 위해 사용된다.

%>

<html>

<head><title>세션 정보</title></head>

<body>

세션 ID: <%= session.getId() %> <br>

//세션 ID 출력

<%

    time.setTime(session.getCreationTime());

    //세션의 생성 시간을 Date 객체인 time에 저장

%>

세션 생성 시간: <%= formatter.format(time) %> <br>

//Date 객체를 지정한 양식(YYYY-MM-dd HH:mm:ss)으로 출력

<%

    time.setTime(session.getLastAccessdTime());

    //웹 브라우저가 가장 마지막으로 세션에 접근한 시간을 Date 객체인 time에 저장

%>

최근 접근 시간: <%= fomatter.format(time) %>

//time을 지정한 양식(YYYY-MM-dd HH:mm:ss)으로 출력

 

</body>

</html>

 

(3) session 기본 객체의 속성 사용

한번 생성된 세션은 지정된 유효 시간 동안 유지된다. 따라서 웹 어플리케이션을 실행하는 동안 지속적으로 사용해야 하는 데이터를 저장하는 장소로서 세션이 적합하다.

request  기본 객체가 하나의 요청을 처리하는데 사용되는 JSP 페이지 사이에서 공유된다면,

session 기본 객체는 웹 브라우저의 여러 요청을 처리하는 JSP 페이지 사이에서 공유된다.

따라서 로그인 한 회원 정보 등 웹 브라우저와 1:1로 매핑되는 값을 저장할 떄에는 쿠키 대신 세션을 사용할 수 있다.

 

세션에 값을 저장할 때는 속성을 사용하며 속성에 값을 저장할 때에는

request 기본 객체와 마찬가지로 setAtribute() 메서드를 사용하며, 속성값을 사용할 때에는 getAttribute() 메서드를 사용한다.

 

setMemberInfo.jsp

<%@ page contentType = "text/html; charset=euc-kr" %>

<%

    session.setAttribute("MEMBERID", "madvirus");

    session.setAttribute("NAME", "최범균");

    //세션의 속성에 회원 정보를 저장한다.

%>

<html>

<head><title>세션에 정보 저장</title></head>

<body>

세션에 정보를 저장하였습니다.

</body>

</html>

(세션의 속성에 저장된 값은 이후 세션이 종료될 때까지 사용이 가능하다.)

 

(4) 세션 종료

session.invalidate() 메서드를 사용하면 세션을 종료하게 된다.

세션이 종료되면 현재 사용 중인 session 기본 객체가 삭제 되므로 session 기본 객체에 저장했던 속성 목록도 함께 삭제된다.

다음에 session을 사용할 때에는 새로운 session 기본 객체가 사용된다.

 

(5) 세션의 유효 시간

세션은 마지막 접근 시간으로부터 일정 시간 이내에 다시 세션에 접근하지 않을 경우 자동으로 세션을 종료하는 기능을 갖고 있다.

세션의 유효시간은 두 가지 방법으로 설정할 수 있다.

 

첫번째 방법으로는, WEB-INF\web.xml파일에 <session-config> 태그를 사용하여 세션 유효 시간을 지정하는 방법이다.

<?xml vesion="1.0" encoding="euc-kr"?>

<web-app xmlns="http://java.sun.com/xml/ns/... version="2.5">

    <session-config>

        <session-timeout>50</session-timeout>

    </session-config>

</web-app>

여기서 <session-timeout>태그의 값(50)이 세션의 유효시간이 되며, 이 값의 단위는 분이다.(50분)

 

두번째 방법은, session 기본 객체가 제공하는 setMaxInactiveInterval() 메서드를 사용하는 것이다. 예를 들어 세션의 유효시간을 60분으로 지정하고 싶다면 다음과 같이 setMaxInactiveInterval() 메서드를 사용한다.

<%

    session.setMaxInactiveInterval(60 * 60);

%>

session.setMaxInactiveInterval() 메서드에 전달하는 값의 단위는 초 단위이다.

 

<session-timeout>의 값을 0이나 음수로 설정하면 세션은 유효 시간을 갖지 않으며, 이 경우 명시적으로 session.invalidate() 메서드를 호출하지 않으면 생성된 세션 객체가 서버에서 제거되지 않고 유지된다. 

하지만 생성하는 세션이 제거되지 않고 계속 유지된다면 제거되지 않은 세션 객체 떄문에 메모리 부족 현상이 발생한다.

즉, 메모리가 부족해지는 현상을 방지하기 위해서 반드시 세션의 유효 시간을 지정해 주어야 한다.

 

 

참고문헌-최범균의 JSP 웹프로그래밍(최범균 지음)

'[JSP]' 카테고리의 다른 글

12.데이터베이스 프로그래밍 기초  (0) 2021.07.14
5.필수 이해 요소  (0) 2021.07.08