세션이란 ? 

- 둘 이상의 page request에서 사용자를 식별하거나, 웹 사이트를 방문하고 해당 사용자에 대한 정보를 저장하는 방법을 제공한다.

- Servlet container는 HttpSession을 사용하여 Http client - HTTP server간의 세션을 생성한다.

- 세션은 한 명의 사용자에 해당한다. (브라우저 당 하나의 세션 객체가 생성된다.)

- 서버는 Cookie, rewriting URL과 같은 방법으로 세션을 유지하면서 관리할 수 있다.

- 객체를 세션에 바인딩하여 사용자 정보를 유지할 수 있다.

 

톰캣의 세션 동작 원리

- session.isNew() 메소드는 세션이 생성된 곳에서 아직 클라이언트가 세션 ID를 모르는 상태(최초 접속 상태)의 경우 "true"를 반환한다.

- 이 경우 아직 클라이언트 정보가 서버에 유지되지 않기 때문에, 서버는 Response Headers에 JSESSIONID 이라는 이름으로 쿠키 정보를 client로 전달한다.

- session.isNew() 메소드는 "false"를 반환하면 이미 세션이 설정되어있는 경우이며, 이 경우 client브라우저는 로컬에 저장되어 있는 JSESSIONID 쿠키 값을 request header에 담아 서버로 전송한다.

- 서버는 client로 부터 JSESSJIONID 쿠키 값을 전달 받으면 response로 JSESSIONIS 쿠키 값을 client로 보내지 않는다.

더보기
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page trimDirectiveWhitespaces="true"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
</head>
<body>

<h3> 세션 동작 원리 </h3>

<!-- isNew() :  클라이언트가 세션 ID를 모르는 상태(최초 접속)인 경우 true를 반환 --%>
<!-- isNew()가 true를 반환하면 클라이언트 정보가 서버에 저장되지 않은 상태이다. -->
<p> isNew() : <%= session.isNew() %></p>
<hr>

<h4>쿠키 내용</h4>
<%
	Cookie[] cc = request.getCookies();
	if(cc != null) {
		for(Cookie c : cc) {
			String name = c.getName();
			String value = c.getValue();
			out.print("<p>"+name+" : "+ value + "</p>");
		}
	}
%>

</body>
</html>

 

쿠키를 사용하지 않는 세션 ID의 관리

- 휴대 기기 등 모든 단말이 쿠키를 사용할 수 있는 것은 아니다.

- 쿠키를 사용할 수 없는 경우 URL에 직접 세션 ID를 작성하여 세션 ID를 클라이언트 측에 유지시킨다.

구체적으로는 HttpServletResponse의 encodeURL (String url) 메소드를 사용한다.

PrintWriter writer = response.getWriter();

String link = "/main";

link = response.encodeURL(link);

writer.println("<a href = '"+link+"'>메인</a>");

encodeURL() 메소드를 사용하면 지정된 인수에 대해 다음의 값을 추가하며, 쿠키를 사용 못해도 클라이언트측에서 세션 ID를 보유할 수 있다.

jsessionid = 세션id

 

예제

더보기

sessionEx2

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page trimDirectiveWhitespaces="true"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
</head>
<body>

<h3>session : 클라이언트의 정보를 서버에 저장</h3>
<!-- 세션은 일반적으로 로그인 처리 등에서 이용된다. -->

<p>
  <a href="sessionSet.jsp">세션 설정</a> |
  <a href="sessionInfo.jsp">세션 확인</a> |
  <a href="sessionRemove.jsp">세션 제거</a>
</p>
</body>
</html>

sessionSet

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page trimDirectiveWhitespaces="true"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%
	// session : 세션을 나타내는 JSP 내장 객체(HttpSession)
	// 서블릿에서 세션 객체 구하기 : HttpSession sess = request.getSession();
	// EL에서의 세션 객체 : sessionScope
	
	// 세션 유지시간 설정(톰캣 기본 세션 유지시간 : 30분)
	session.setMaxInactiveInterval(60*20); // 단위 : 초
	
	session.setAttribute("name", "홍자바");
	session.setAttribute("age", 20);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
</head>
<body>

<h3>session 설정</h3>

<p>
	<a href="sessionEx2.jsp">돌아가기</a>
</p>

</body>
</html>

sessionInfo

<%@page import="java.util.Date"%>
<%@page import="java.text.SimpleDateFormat"%>
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page trimDirectiveWhitespaces="true"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%
	String name = "";
	int age = 0;
	
	try {
		// 세션에 설정한 값 가져오기
		name = (String)session.getAttribute("name");
		age = (Integer)session.getAttribute("age");
	} catch(Exception e) {
	}
	
	// 세션 유지시간
	int interval = session.getMaxInactiveInterval();
	
	// 세션 아이디
	String id = session.getId();
	
	SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
	
	// 세션 생성 시간
	Date date1 = new Date(session.getCreationTime());
	String create_date = sdf.format(date1);
	
	// 세션 마지막 접속 시간
	Date date2 = new Date(session.getLastAccessedTime());
	String last_date = sdf.format(date2);
	
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
</head>
<body>

<h3>session 정보</h3>

<p> 이름과 나이 : <%=name%>, <%=age%> </p>
<p> EL을 이용하여 세션 값 가져오기 : ${sessionScope.name}, ${sessionScope.age}</p>
<p> 세션 최대 유지시간 : <%=interval / 60 %>분 </p>
<p> 세션 아이디 : <%=id%></p>
<p> 세션 생성 시간 : <%=create_date %></p>
<p> 세션 마지막 접속 시간 : <%=last_date %></p>
<hr>

<p>
	<a href="sessionEx2.jsp">돌아가기</a>
</p>

</body>
</html>

sessionRemove

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page trimDirectiveWhitespaces="true"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%
	// 세션에 저장된 속성값 지우기
	session.removeAttribute("name");
	session.removeAttribute("age");
	
	// 세션에 저장된 모든 속성값을 지우고 세션을 초기화
	session.invalidate();
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
</head>
<body>

<h3> session 지우기</h3>

<p>
	<a href="sessionEx2.jsp">돌아가기</a>
</p>

</body>
</html>

 

 

 

+ Recent posts