본문 바로가기
Dev/Java

세션 session

by vellahw 2022. 9. 2.

 

쿠키가 웹 브라우저에서 정보를 보관할 때 사용 된다면, 세션은 웹 컨테이너(톰캣 등)에서 정보를 보관 할 때 사용 되며

세션은 오직 서버에서만 생성 되고 서버에만 값이 저장된다.

웹 컨테이너는 기본적으로 하나의 웹 브라우저에 하나의 세션을 생성한다.

세션은 웹 브라우저마다 따로 존재하기 때문에 웹 브라우저와 1대 1 정보를 저장하기에 알맞은 장소이다.

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


 

 

1. 세션 생성하기

<%@ page session = "true" %>

session 속성의 기본값은 "true"이므로 session 속성의 값을 fasle로 지정하지만 않으면 세션이 생성된다.

 

 

2. session 기본 객체

session 기본 객체가 제공하는 세션 정보 관련 메소드
메소드 리턴 타입 설명
getId() String 세션의 고유 ID를 구한다
getCreationTime() long 세션이 생성된 시간을 구한다.
getLastAccessedTime() long 웹 브라우저가 가장 마지막에 세션에 접근한 시간을 구한다.

 

 

ex) 세션 정보 관련 메소드들을 사용하여 현재 사용중인 세션 정보 구하기

<%@ page contentType="text/html; charset=EUC-KR" %>
<%@ page session="true" %>  
<%@ page import="java.util.Date" %>
<%@ page import="java.text.SimpleDateFormat" %>
<%
	Date time = new Date();
	SimpleDateFormat formatter = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss");
%>
<html>
<head><title>세션 정보</title></head>
<body>
세션ID: <%= session.getId() %><br>
<%
	time.setTime(session.getCreationTime());
%>
세션 생성 시간: <%= formatter.format(time) %><br>
<%
	time.setTime(session.getLastAccessedTime());
%>
최근 접근 시간: <%= formatter.format(time) %>
</body>
</html>
  • Date 객체를 생성한 이유는 long 타입의 시간 값을 저장하기 위함이다.
  • SimpleDateFormat을 이용하여 Date 객체가 저장한 시간 값을 지정한 양식으로 출력한다.

 

실행 결과

하나의 웹 브라우저에서 파일을 실행 할 때마다 최근 접근 시간이 갱신 된다.

 


 

 

3. session 기본 객체의 속성 사용

세션에 값을 저장할 때는 속성을 사용한다.

requset 기본 객체와 마찬가지로

속성에 값을 저장할 때에는 setAttribute() 메서드를 사용하고 속성값을 사용할 때에는 getAttribute() 메서드를 사용한다.

 

ex-1) 회원 아이디와 이름 저장하기

<%@ page contentType="text/html; charset=EUC-KR" %>
<%
	session.setAttribute("MEMBERID", "codingco");
	session.setAttribute("NAME", "코딩코");
%>
<html>
<head><title>세션에 정보 저장</title></head>
<body>
세션에 정보를 저장하였습니다.
</body>
</html>
  • MEMBERID에 codingco 저장
  • NAME에 코딩코 저장

실행 결과

 

session 기본 객체에 속성을 저장하면 세션이 종료되기 전까지 속성값을 사용할 수 있다.

 


 

 

4. session 종료

더 이상 세션을 유지할 필요가 없는 경우(로그아웃 등)에 session.invalidate() 메서드를 사용하여 세션을 종료한다.

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

 

<%@ page contentType="text/html; charset=EUC-KR" %>
<%
	session.invalidate();
%>
<html>
<head><title>세션 종료</title></head>
<body>
세션을 종료하였습니다.
</body>
</html>

실행 결과

 

session이 종료되면 기존에 사용하던 session 기본 객체가 삭제 되고, 다음에 session을 사용할 때에는 새로운 session 기본 객체가 사용된다.

실제로 확인 해보기 위해 위에서 작성한 현재 사용중인 세션 정보를 구하는 파일을 세션 종료 파일과 번갈아 실행 해보면

세션ID를 통해 세션이 새로 생성 되었단 것을 확인 할 수 있다.

 


 

 

5. 세션의 유효 시간

세션은 마지막 접근 시간으로부터 일정 시간 이내에 다시 세션에 접근 하지 않을 경우 자동으로 세션을 종료하는 기능을 갖고 있다. (예)은행 홈페이지 로그인 유지 시간 등..) 

세션 유효 시간이 30분이라 가정 해보면, 그림과 같이 최근 접근 시간으로부터 30분이 지나면 자동으로 세션을 종료 시키며 이후에 세션을 요청하면 새로운 세션이 생성된다.

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

  1. WEB_INF\web.xml 파일에 <session-config> 태그 사용하기
  2. session 기본 객체가 제공하는 setMaxInactiveInterval() 메서드 사용하기

 

 1)WEB_INF\web.xml 파일에 <session-config> 태그 사용하기

<session-config>
	<session-timeout>분 단위 숫자</session-timeout>
</session-config>

 

 2)setMaxInactiveInterval() 메소드 사용하기

<%
	session.setMaxInactiveInterval(초 단위 숫자);
%>

 

web.xml 파일에서 설정한 단위와 setMaxInactiveInterval() 메소드에 전달하는 값의 단위가 다른 것을 유의해야 한다.

<session-timeout>의 값을 0이나 음수로 설정하면 세션은 유효시간을 갖지 않는다.

이 경우 명시적으로 session.invalidate() 메소드를 호출하지 않으면 생성된 세션 객체가 서버에서 제거 되지 않고 유지 되기 때문에 세션 객체가 계속 메모리에 남아 있게 되고, 제거 되지 않은 세션 객체 때문에 메모리 부족 현상이 발생하게 된다.

 


 

 

6. 세션을 사용한 로그인 기법

  1. 로그인에 성공하면 session 기본 객체의 특정 속성에 데이터를 기록
  2. 이후로 session 기본 객체의 특정 속성이 존재하면 로그인한 것으로 간주
  3. 로그아웃 할 경우 session.invalidate() 메소드를 호출하여 세션을 종료

 

 1) 인증된 사용자 정보 session 기본 객체에 저장하기

<%@ page contentType="text/html; charset=EUC-KR" %>
<%
	String id = request.getParameter("id");
	String password = request.getParameter("password");
	
	if(id.equals(password)) {
		session.setAttribute("MEMBERID", id);
%>
<html>
<head><title>로그인 성공</title></head>
<body>
로그인에 성공 했습니다.
</body>
</html>
<%
	} else {
%>
<script>
alert("로그인에 실패하였습니다.");
history.go(-1);
</script>
<%
	}
%>

아이디와 비밀번호가 같다면 로그인 성공

<%@ page contentType = "text/html; charset=euc-kr" %>
<html>
<head><title>로그인폼</title></head>
<body>
<form action="<%= request.getContextPath() %>/sep01/chap02_session/sessionLogin.jsp"
      method="post">
아이디 <input type="text" name="id" size="10">
암호 <input type="password" name="password" size="10">
<input type="submit" value="로그인">
</form>
</body>
</html>

▲로그인 폼

 

로그인 성공 실행 결과
로그인 실패 실행 결과

 

 2) 인증 여부 판단

session 기본 객체에 로그인 표식을 위한 속성이 존재하는지 여부에 따라 로그인 상태를 판단할 수 있다.

<%@ page contentType="text/html; charset=EUC-KR" %>
<%
	String memberId = (String)session.getAttribute("MEMBERID");
	boolean login = memberId == null ? false : true;
%>
			<!-- memberId == null → 널 값이면 false 아니면 true (삼항연산자)-->
<html>
<head><title>로그인 여부 검사</title></head>
<body>
<%
	if(login) {  //null값이 아니므로 true
%>
아이디: "<%= memberId %>"로 로그인 한 상태
<%
	} else {
%>
로그인 하지 않은 상태
<%
	}
%>
</body>
</html>

session 기본 객체의 "MEMBERID" 속성의 존재 여부를 사용하여 로그인 여부를 판단함

 

 3) 로그아웃 처리

<%@ page contentType="text/html; charset=EUC-KR" %>
<%
	session.invalidate();
%>
<html>
<head><title>로그아웃</title></head>
<body>
로그아웃 되었습니다.
</body>
</html>

session.invalidate() 메소드를 이용하여 세션을 종료시키면 된다.

실행 결과

 

 

'Dev > Java' 카테고리의 다른 글

표준 태그 라이브러리(JSTL)  (0) 2022.09.21
싱글톤 (Singleton)  (0) 2022.09.16
자바빈(JavaBean)  (0) 2022.09.02
include 디렉티브  (0) 2022.09.01
<jsp:include> 액션 태그  (0) 2022.09.01

댓글