JSP에서 사용자별 상태 정보를 유지하려면 세션(Session) 관리가 필수적입니다. 이 글에서는 HttpSession 객체를 활용해 세션의 생성 시간(creation time)과 마지막 접속 시간(last accessed time)을 조회하는 방법을 예제와 함께 살펴봅니다. 요청에 이미 존재하는 세션이 없다면, 컨테이너는 새로운 세션을 생성하여 해당 요청과 자동으로 연결합니다.
주요 HttpSession 메서드
- getCreationTime() : 세션이 생성된 시각을 1970년 1월 1일 자정(GMT) 기준 밀리초 값으로 반환합니다.
- getLastAccessedTime() : 클라이언트가 이 세션과 관련된 요청을 마지막으로 보낸 시각을 밀리초 값으로 반환합니다.
- isNew() : 클라이언트가 아직 세션을 인식하지 못한, 즉 새로 생성된 세션인지 여부를 반환합니다.
- getId() : 서버가 할당한 고유한 세션 ID 문자열을 반환합니다.
예제 코드
아래 코드는 세션 생성 시간, 마지막 접속 시간, 사용자 ID, 방문 횟수를 표 형태로 출력하는 JSP 페이지입니다.
<%@ page import = "java.io.*,java.util.*" %>
<%
// 세션 생성 시간을 가져옵니다.
Date createTime = new Date(session.getCreationTime());
// 이 웹 페이지의 마지막 접속 시간을 가져옵니다.
Date lastAccessTime = new Date(session.getLastAccessedTime());
String title = "Welcome Back to my website";
Integer visitCount = new Integer(0);
String visitCountKey = new String("visitCount");
String userIDKey = new String("userID");
String userID = new String("ABCD");
// 신규 방문자인지 확인합니다.
if (session.isNew()) {
title = "Welcome to my website";
session.setAttribute(userIDKey, userID);
session.setAttribute(visitCountKey, visitCount);
}
visitCount = (Integer)session.getAttribute(visitCountKey);
visitCount = visitCount + 1;
userID = (String)session.getAttribute(userIDKey);
session.setAttribute(visitCountKey, visitCount);
%>
<html>
<head>
<title>Session Tracking</title>
</head>
<body>
<center>
<h1>Session Tracking</h1>
</center>
<table border = "1" align = "center">
<tr bgcolor = "#949494">
<th>Session info</th>
<th>Value</th>
</tr>
<tr>
<td>id</td>
<td><% out.print(session.getId()); %></td>
</tr>
<tr>
<td>Creation Time</td>
<td><% out.print(createTime); %></td>
</tr>
<tr>
<td>Time of Last Access</td>
<td><% out.print(lastAccessTime); %></td>
</tr>
<tr>
<td>User ID</td>
<td><% out.print(userID); %></td>
</tr>
<tr>
<td>Number of visits</td>
<td><% out.print(visitCount); %></td>
</tr>
</table>
</body>
</html>
실행 방법
위 코드를 main.jsp 파일로 저장한 뒤, 웹 브라우저에서 https://localhost:8080/main.jsp 주소로 접속합니다.
첫 번째 접속 결과 (신규 방문자)
처음 접속하면 session.isNew()가 true를 반환하므로 환영 문구가 표시되고, 방문 횟수는 초기값 그대로 출력됩니다.
Welcome to my website
세션 정보
| 세션 정보 | 값 |
|---|---|
| id | 0AE3EC93FF44E3C525B4351B77ABB2D5 |
| 생성 시간 | Tue Jun 08 17:26:40 GMT+04:00 2010 |
| 마지막 접속 시간 | Tue Jun 08 17:26:40 GMT+04:00 2010 |
| 사용자 ID | ABCD |
| 방문 횟수 | 0 |
두 번째 접속 결과 (재방문)
동일한 브라우저에서 같은 JSP 페이지에 다시 접속하면 기존 세션이 유지되므로, 제목이 변경되고 방문 횟수가 1 증가한 것을 확인할 수 있습니다.
Welcome Back to my website
세션 정보
| 세션 정보 | 값 |
|---|---|
| id | 0AE3EC93FF44E3C525B4351B77ABB2D5 |
| 생성 시간 | Tue Jun 08 17:26:40 GMT+04:00 2010 |
| 마지막 접속 시간 | Tue Jun 08 17:26:40 GMT+04:00 2010 |
| 사용자 ID | ABCD |
| 방문 횟수 | 1 |
추가로 알아두면 좋은 내용
- 세션 유지 원리 : 최초 요청 시 서버는 JSESSIONID라는 이름의 쿠키를 발행하고, 이후 요청마다 이 쿠키 값을 통해 동일한 세션을 식별합니다.
- 세션 타임아웃 설정 :
session.setMaxInactiveInterval(1800);처럼 비활성 상태 유지 시간을 초 단위로 지정할 수 있습니다(예: 1800초 = 30분). - 세션 종료 : 로그아웃 처리 시
session.invalidate();를 호출하면 세션이 즉시 무효화되어 저장된 모든 데이터가 삭제됩니다. - 동시성 주의 : 방문 횟수처럼 값을 갱신하는 로직은 여러 요청이 동시에 들어올 경우를 대비해 동기화 처리를 고려하는 것이 안전합니다.