Post

[JSP] 세션 사용하기

세션

  • 클라이언트의 상태 관리를 위한 기법
  • 클라이언트가 특정 작업을 수행하는 기간
  • 웹 브라우저를 종료하거나 세션 유효시간이 경과되면 세션이 삭제됨

세션 관리

  • 웹 컨테이너는 웹 브라우저당 1개의 세션 아이디를 부여함
  • 클라이언트의 최초 요청 시 웹 컨테이너는 session 객체를 만들고 세션 아이디를 부여함
  • 최초 요청의 응답에서 세션 아이디(JSESSIONID)를 쿠키에 포함시켜 웹 브라우저에게 전송한다.
  • 이후 웹 브라우저는 자신의 세션 아이디를 웹 컨테이너에 전송하고, 서버는 세션 아이디를 이용하여 사용자를 식별한다.
  • 세션을 자동으로 생성하지 않으려면 page 지시어에서 session 속성을 “false”로 설정한다.

쿠키와 세션 비교

구분쿠키세션
저장 위치클라이언트 측에 저장서버 측에 저장
저장 형태텍스트 파일로 저장됨객체 형태로 저장됨
크기정보의 크기에 제한이 있음정보의 크기에 제한이 없음
보안상대적으로 보안에 약함서버에 저장되어 보안에 유리

session 내장 객체

  • session 객체는 세션이 유지되는 동안 여러 요청을 처리하는데 사용되는 JSP 페이지들 사이에서 공유됨
    • 이러한 JSP 페이지들은 같은 session 영역 내에 존재함
메서드리턴 타입기능
getId()String세션별로 고유하게 부여되는 세션 아이디를 리턴
getCreationTime()long세션이 생성된 시간을 리턴. PC의 기준이 되는 날짜(1970년 1월 1일 0시)부터 세션이 생성된 시각까지의 시간을 0.001초 단위로 계산하여 리턴한다.
getLastAccessedTime()long클라이언트가 해당 세션에 가장 마지막으로 접근한 시간을 리턴
setMaxInactiveInterval(long)void세션의 유효시간을 초 단위로 설정. 0이나 음수로 설정하면 웹 브라우저를 종료할 때까지 유지
invalidate()void세션을 삭제한다.
getAttribute(String name)void세션의 속성을 리턴
setAttribute(String name, Object value)void세션에 속성을 저장

session 영역

세션의 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.util.Date, java.text.SimpleDateFormat" %>
<!DOCTYPE html>
<html>
<body>
<%
	Date c_time = new Date(), m_time = new Date();
	SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:SS");
	c_time.setTime(session.getCreationTime());
	m_time.setTime(session.getLastAccessedTime());
%>
세션 아이디: <%= session.getId() %><br/>
세션 생성 시각: <%= formatter.format(c_time) %><br/>
세션 최종 접근 시각: <%= formatter.format(m_time) %>
</body>
</html>

세션의 삭제

  • 세션을 삭제한다는 것은 세션의 속성값들을 지우고 초기화하는 것
  • invalidate() 메서드 사용하면 해당 세션에 저장된 모든 속성이 삭제됨
  • 웹 브라우저를 종료하거나 설정된 유효시간(타임아웃 시간)이 초과되면 기존 세션이 삭제됨

세션의 유효시간

  • 클라이언트가 서버에 추가 요청을 하지 않고도 세션을 유지시킬 수 있는 최대 시간
    • ex) 세션의 유효시간이 1분이라면 마지막 요청 후 1분 이내에 추가 요청이 있어야 세션이 유지된다.
  • 세션의 유효시간을 설정하지 않으면 웹 브라우저를 종료하지 않는 이상 서버에 세션이 계속 남아있다.
  • 세션의 유효시간을 설정하는 방법은 session.setMaxInactiveInterval(long)를 실행하거나 web.xml 파일을 수정하는 방법이 있다.
    • <session-timeout> 태그의 단위는 분이다.
1
2
3
<session-config>
    <session-timeout>30</session-timeout>
</session-config>

HttpSession 인터페이스

  • session 객체는 HttpSession 유형이다.
  • request 내장 객체의 getSession() 메서드는 세션이 있으면 현재 세션 객체를 리턴하고, 없다면 HttpSession 인터페이스 유형의 세션 객체를 생성하여 리턴한다.
    • 만약 getSession(false)로 실행하면 세션이 존재하지 않으면 null을 리턴한다.
  • 한 개의 브라우저에 한 개의 세션이 생성되므로 session 내장 객체와 request 내장 객체의 getSession()이 리턴하는 세션 객체는 동일하다.
1
2
3
4
5
6
7
8
9
10
<%@page language="java" contentType="text/html; charset=UTF-8" %>
<%
    HttpSession httpSession = request.getSession();
%>
<html>
<body>
세션아이디1: <%= session.getId() %><br>
세션아이디2: <%= httpSession.getId() %>
</body>
</html>

세션을 이용하여 로그인 구현하기

  1. 사용자가 입력한 아이디, 비밀번호를 확인한다.
  2. 정보다 맞으면 session 내장 객체에 로그인 여부 확인을 위한 속성을 설정한다.
  3. 로그인 여부는 세션에 특정 속성이 설정되어 있는지 여부로 확인한다.
  4. 로그아웃을 하면 세션을 삭제한다.

로그인 작업

1
2
3
4
5
<form action="9-7.jsp" method="post">
  아이디 <input type="text" name="id" /><br />
  비밀번호 <input type="password" name="pw" /><br />
  <input type="submit" value="확인" />
</form>

로그인 처리

1
2
3
4
5
6
7
8
9
10
<%
	String id = request.getParameter("id");
	String pw = request.getParameter("pw");
	if(id.equals("admin") && pw.equals("pass")) {
		session.setAttribute("login", id);
		out.print("<h3>로그인 성공</h3>");
	} else {
		out.print("<h3>로그인 실패</h3>");
	}
%>

로그인 확인

1
2
3
4
5
6
7
8
9
10
<%
	String id = (String)session.getAttribute("login");
	if(id != null && id.equals("admin")) {
		out.print("<h3>로그인한 상태입니다. ID = " + id + "</h3>");
		out.print("<h3><a href=9-9.jsp>로그아웃</a></h3>");
	} else {
		out.print("<h3>로그인한 상태가 아닙니다.</h3>");
		out.print("<a href=9-6.jsp>로그인</a>");
	}
%>

로그아웃 처리

1
<% session.invalidate(); %>
This post is licensed under CC BY 4.0 by the author.