JSP - 세션

김강연·2022년 7월 16일
0
post-thumbnail

세션의 정의

웹 브라우저에 정보를 보관할 때 쿠키를 사용한다면, 웹 컨테이너에 정보를 저장할 때는 세션을 사용한다.
⭐세션은 오직 서버에만 생성된다.⭐

세션은 클라이언트(웹 브라우저)의 정보를 저장하는 역할을 하므로, 웹 컨테이너는 기본적으로 하나의 웹 브라우저마다, 하나의 세션을 생성한다. (1:1 대응)
각 웹 브라우저마다 각각의 세션이 대응되므로, 세션은 웹 브라우저와 관련된 정보를 저장하기에 용이한 장소이다.

세션의 생성

<%@ page session = "true" @>

위와 같이 page 디렉티브에 session 속성 값을 true로 지정해주면 된다. 하지만, session 속성의 기본값이 true이기 때문에 따로 속성값을 지정할 필요는 없다.
또다른 방법으로는, request.getSession() 메소드를 통해 세션을 생성할 수도 있다.(아직 용례는 모름)

웹 브라우저가 위와 같이 세션을 사용하는(session = "true" 또는 request.getSession()) 페이지에 처음 접속하게 되면 세션을 생성한다. 이후 접속할 때에는 이미 생성된 세션을 사용하게 된다.

Q: 쿠키와 달리 세션은 웹 컨테이너에 저장된다고 했는데, 웹 서버는 그럼 특정 웹 브라우저에 어떤 세션을 이용해야 하는지 어떻게 아나요?

A: 각 세션을 구분하기 위해 세션에게 각각의 고유 ID를 할당합니다. 이 아이디를 세션 ID라고 합니다. 웹 서버는 세션 ID를 JSESSIONID라는 쿠키의 값으로 웹 브라우저에게 전송합니다. 웹 브라우저는 웹 서버에게 요청할 때마다 해당 쿠키를 함께 전송함으로써, 웹 서버가 어떤 세션을 선택해 사용해야 하는지 판단할 수 있도록 합니다.

예시를 볼까? 아래 viewCookies.jsp 페이지를 실행하는 것을 보자.

viewCookies.jsp

<%@ page contentType = "text/html; charset=utf-8" %>
<%@ page import = "java.net.URLDecoder" %>
<html>
  <head><title>쿠키 목록</title></head>
  <body>
    쿠키 목록<br>
    <%
      Cookie[] cookies = request.getCookies();
      if (cookies != null && cookies.length > 0) {
        for (int i = 0 ; i < cookies.length ; i++) {
    %>
    <%= cookies[i].getName() %> =
    <%= URLDecoder.decode(cookies[i].getValue(), "utf-8") %><br>
    <%
      }
    } else {
    %>
    쿠키가 존재하지 않습니다.
    <%
      }
    %>
  </body>
</html>

출력 결과 및 응답 헤더

먼저, 해당 결과는 웹 브라우저를 모두 종료한 후, viewCookies.jsp 페이지를 처음 실행한 것이다.

viewCookies.jsp 페이지는 page 디렉티브의 session 속성을 변경하지 않았으므로, 해당 페이지를 요청함으로써 세션이 생성되었다. 이를 위 사진에서 확인할 수 있다. 출력 결과에선 현재 쿠키 목록에 쿠키가 존재하지 않는다 했고, 응답 헤더에는 JSESSEIONID라는 쿠키가 함께 웹 브라우저에게 전송된 것을 확인할 수 있다. 세션이 생성됐으므로, JSESSIONID 쿠키를 웹 브라우저에 전송함으로써 다음 요청 시에 해당 세션을 사용할 수 있도록 하기 위함인 걸 알 수 있다.

한 번 더 해당 페이지를 실행해 보자.

출력 결과 및 응답 헤더

이번 결과에서는 첫 실행 시 웹 브라우저에 전송됐던 JSESSIONID 쿠키가 출력되는 것을 볼 수 있다. 요청 헤더(Request Headers)의 노란 박스에서 볼 수 있다시피 세션ID 값을 포함한 쿠키를 전송함으로써 웹 서버가 이를 보고,
"아, 이 세션ID에 대응하는 세션이 웹 컨테이너에 존재하는구나. 이 웹 브라우저는 세션이 이미 생성되어 해당 웹 브라우저와 대응하는 세션을 이용할 수 있겠다." 라고 판단하게 되는 것이다.

세션의 유효시간

앞서 설명한 메소드 중 getLastAccessedTime() 이라는 메소드가 존재한다. 세션에 접근한 가장 최근의 시간을 리턴하는 메소드인데, 이를 통해 세션은 session 기본 객체를 사용할 때마다 세션의 최근 접근 시간이 갱신되고, 이를 기록한다는 걸 알 수 있다.

Q: session 기본 객체를 사용한다는 건 session.OOOO()와 같은 메소드를 호출하는 걸 뜻하나요?
A: 그것에만 한정하는 것이 아닙니다.
page 디렉티브에서 session 속성을 false로 지정하지 않았다면,(기본값은 true임.) session 기본 객체가 생성된다는 걸 알고 있을 겁니다. 이때, 웹 브라우저는 JSP 페이지를 실행할 때마다 session 기본 객체에 접근하게 됩니다. 따라서, 세션을 사용하도록 설정된 JSP 페이지에 접근하면 sesssion 기본 객체의 메소드를 호출하지 않아도, session 기본 객체에 접근하는 것이므로 세션의 최근 접근 시간이 변경됩니다.
❓ session="false"로 지정해도 세션 최근 접근 시간이 변경되는 거로 확인하였음.

세션도 쿠키와 같이 유효 시간이 존재한다. 세션은 기록해놓은 최근 접근 시간을 바탕으로 일정 시간 이내에 다시 세션에 접근하지 않는 경우 자동으로 세션을 종료하는 기능을 갖고 있다.
그렇다면 이 "일정 시간"을 설정하는 방법은 무엇일까?
2가지 방법이 있다. 하나는 WEB-INF\web.xml 파일에서 <session-config> 태그를 사용하여 세션 유효 시간을 지정하는 것이다.(이는 생략하겠음.)
나머지 하나는, session.setMaxInactiveInterval(int interval) 메소드를 사용하는 것이다. 2가지를 알려주겠다.
1. 해당 시간은 초 단위로 설정해야 한다.
ex) setMaxInactiveInterval(60 * 60) => 유효시간: 60분
2. 파라미터에 0 또는 음수가 전달될 경우 세션은 유효 시간을 갖지 않게 된다.

교재와 여러 블로그에는 web.xml 파일에서 값을 0 또는 음수를 설정할 경우 세션이 유효 시간을 갖지 않는다는 말이 명시되어 있었다.
내가 생각하기에는, session 객체가 제공하는 메소드 인자에도 0 또는 음수를 입력하면 같은 결과를 보여줄 것 같아 Oracle의 JAVA EE api 문서를 확인하였는데, 다음과 같다.

void setMaxInactiveInterval(int interval)
Specifies the time, in seconds, between client requests before the servlet container will invalidate this session.
interval value of zero or less indicates that the session should never timeout.

Parameters:
interval - An integer specifying the number of seconds

출처 URL: https://docs.oracle.com/javaee/7/api/javax/servlet/http/HttpSession.html#setMaxInactiveInterval-int-

이를 통해 메소드에도 같은 기준이 적용된다는 걸 확인하였다.

profile
Oasis of Knowledge

0개의 댓글