세션 (Session)
세션이란? (session)
: 클라이언트와 웹 서버 간의 상태를 지속적으로 유지하는 방법
세션을 사용하는 주요 기능
•
사용자 인증 및 로그인 관리
•
장바구니 및 주문 처리
세션 생명 주기
세션은 클라이언트가 사이트에 접속한 순간부터 브라우저를 종료하는 시점까지 유지됩니다.
•
로그인 정보는 세션에 등록되기 때문에 로그인 후 브라우저의 모든 탭을 종료하고 다시 사이트에 접속하면 로그아웃이 되어 있는 것을 볼 수 있습니다.
•
크롬 브라우저의 경우, 새 시크릿 창을 열면 별도의 새로운 세션으로 테스트 해볼 수 있습니다.
(… > 새 시크릿 창 (Ctrl + Shift + N)
1.
생성 (Creation)
: 클라이언트가 웹 애플리케이션에 최초로 접속하면, 서버는 해당 클라이언트를 위한 새로운 세션을 생성합니다. 이때 고유한 세션 식별자(ID)가 생성되고, 이 ID를 사용하여 세션을 식별합니다.
2.
활성화 (Activation)
: 세션이 생성되면 활성 상태가 되며, 클라이언트와 서버 간의 데이터 교환을 허용합니다. 클라이언트가 웹 애플리케이션에 요청을 보낼 때마다 세션은 활성화 상태를 유지합니다.
3.
비활성화 (Inactivation)
: 세션은 일정 시간 동안 활성화 상태를 유지한 후, 클라이언트의 요청이 없을 경우 비활성화 상태로 전환됩니다. 이때, 세션은 메모리에서 해제되지 않고, 재활성화될 때까지 대기합니다.
4.
종료 (Expiration)
: 세션이 만료되면 종료됩니다. 만료는 두 가지 방법으로 발생할 수 있습니다. 첫 번째 방법은 세션을 만든 웹 애플리케이션의 설정에 지정된 시간(세션 타임아웃)이 경과한 경우입니다. 두 번째 방법은 세션을 프로그래밍적으로 무효화(invalidate)하는 경우입니다.
5.
강제 종료 (Forced Termination)
: 웹 애플리케이션 개발자나 관리자가 필요한 경우 세션을 직접 무효화할 수 있습니다. 이로 인해 세션은 즉시 종료되며, 클라이언트는 다시 세션을 생성해야 합니다.
세션 내장 객체의 주요 메소드
메소드 | 설명 |
getAttribute(String name) | 세션에서 특정 속성의 값을 가져옵니다. |
setAttribute(String name, Object value) | 세션에 새로운 속성을 설정하거나 기존 속성의 값을 업데이트합니다. |
removeAttribute(String name) | 세션에서 특정 속성을 제거합니다. |
getId() | 현재 세션의 고유한 식별자(ID)를 반환합니다. |
setMaxInactiveInterval(int interval) | 세션의 비활성 시간 제한을 설정합니다. |
getMaxInactiveInterval() | 세션의 비활성 시간 제한을 반환합니다. |
invalidate() | 현재 세션을 무효화시키고 세션의 모든 속성과 데이터를 삭제합니다. |
isNew() | 현재 세션이 새로 생성되었는지 여부를 확인합니다. |
getCreationTime() | 세션이 생성된 시간을 반환합니다. |
getLastAccessedTime() | 세션에 마지막으로 액세스한 시간을 반환합니다. |
세션 생성
session.setAttribute("userId", userId);
Java
복사
세션 정보
•
단일 세션 정보
session.getAttribute("userId");
Java
복사
•
다중 세션 정보
Enumeration en = session.getAttributeNames();
int i = 0;
while (en.hasMoreElements()) {
i++;
name = en.nextElement().toString(); // 세션 속성이름 가져오기
value = session.getAttribute(name).toString(); // 세션 속성값 가져오기
out.println("설정된 세션의 속성 이름 [ " + i + " ] : " + name + "<br>");
out.println("설정된 세션의 속성 값 [ " + i + " ] : " + value + "<br>");
out.println("----------------------------------------------<br>");
}
Java
복사
세션 삭제
•
단일 세션 삭제
session.removeAttribute("userId");
Java
복사
•
다중 세션 삭제
session.invalidate();
Java
복사
•
세션 유효 여부 확인
// isRequestedSessionIdValid
// : 해당 요청이 속한 session 이 유효한지 여부를 반환하는 메소드
if (request.isRequestedSessionIdValid() ) {
out.print("세션이 유효합니다.");
} else {
out.print("세션이 유효하지 않습니다.");
}
Java
복사
세션 유효 시간
•
세션 유효시간 확인
// getMaxInactiveInterval()
// : 세션의 유효시간을 반환하는 메소드
int time = session.getMaxInactiveInterval() / 60;
out.println("세션 유효 시간 : " + time + "분<br>");
Java
복사
•
세션 유효시간 설정
// setMaxInactiveInterval()
// : 초 단위로 세션의 유효시간을 설정하는 메소드
session.setMaxInactiveInterval(60 * 60); // 유효시간 60 분으로 설정
Java
복사
세션 정보 등록하기
•
session01.jsp
•
session01_pro.jsp
•
session01.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>세션</title>
</head>
<body>
<h1>세션</h1>
<form action="session01_pro.jsp" method="post">
<p>아이디 : <input type="text" name="username"/></p>
<p>비밀번호 : <input type="password" name="password"/></p>
<p>
<input type="submit" value="로그인" />
</p>
</form>
</body>
</html>
HTML
복사
•
session01_pro.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>세션 로그인</title>
</head>
<body>
<!-- 세션 등록하는 과정 -->
<%
String username = request.getParameter("username");
String password = request.getParameter("password");
if( username.equals("joeun") && password.equals("123456") ) {
// 아이디, 비번 일치 -> 인증(로그인) 성공
// -> 세션에 사용자 정보 등록
session.setAttribute("username", username);
session.setAttribute("password", password);
out.println("세션 설정 성공! (로그인 성공)");
out.println(username + "님 환영합니다.");
}
else {
out.println("세션 설정 실패! (로그인 실패)");
}
%>
<a href="<%= request.getContextPath() %>/session02.jsp">session02.jsp</a>
</body>
</html>
Java
복사
세션 정보 가져오기
•
session02.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>세션 정보 가져오기</title>
</head>
<body>
<h1>세션 정보 가져오기</h1>
<%
String username = (String) session.getAttribute("username");
String password = (String) session.getAttribute("password");
out.println("세션 정보 - username : " + username);
out.println("세션 정보 - password : " + password);
%>
<div>
<a href="<%= request.getContextPath() %>/session03.jsp">session03.jsp</a>
</div>
</body>
</html>
HTML
복사






