티스토리 뷰

Servlet

세션 트래킹 - 세션

dev23 2024. 8. 12. 21:18
반응형

세션(Session)

- 세션 역시 페이지들 사이의 공유 정보를 서버에 저장해 두고웹 페이지들을 매개해 주는 방법이라는 점에서 쿠키와
같다.

- 쿠키는 사용 페이지들의 정보가 클라이언트 PC 저장되므로 정보가 쉽게 노출될 있는 반면, 세션은 서버의
메모리에 생성되어 정보를 저장한다. 따라서 페이지에서 사용되는 정보 중에 로그인 정보처럼 보안이 요구되는 정보는 대부분 세션을 이용한다.

- 세션은 브라우저당 , 사용자당 개가 생성된다.

 

세션의 특징

  • 정보가 서버의 메모리에 저장된다.
  • 브라우저의 세션 연동은 세션 쿠키를 이용한다.
  • 쿠키보다 보안에 유리하다.
  • 서버에 부하를 줄 수 있다.
  • 브라우저(사용자)당 한 개의 세션(세션 id)이 생성된다.
  • 세션은 유효 시간을 가진다.( 기본 유효 시간은 30분)
  • 로그인 상태 유지 기능이나 쇼핑몰의 장바구니 담기 기능 등에 주로 사용된다.

세션 기능 실행과정

- 클라이언트의 브라우저가 서버에 최초 접속하면 서버의 서블릿은 세션 객체를 생성한 후 세션 객체에 대한

세션 id를 브라우저에 전송한다.

- 브라우저는 세션 id 브라우저가 사용하는 세션 쿠키에 저장한다.

- , 서버로부터 전송된 세션 id 쿠키이며, 쿠키 이름은 jsessionId 이다.

 

세션 API

- 서블릿에서 세션을 이용하려면 HttpSession 클래스 객체를 생성해서 사용해야 한다.

- HttpSession 객체는 HttpServletRequest의 getSession() 메서드를 호출해서 생성한다.

- 세션을 얻는 getSession() 메서드로는 다음과 같은 것들이 있다.

  • getSession() : 기존의 세션 객체가 존재하면 반환하고, 없으면 새로 생성한다.
  • getSession(true) : 기존의 세션 객체가 존재하면 반환하고, 없으면 새로 생성한다.
  • getSession(false) : 기존의 세션 객체가 존재하면 반환하고, 없으면 null을 반환한다.

HttpSession 클래스의 여러 가지 메서드

메서드 반환 타입 설명
getAttribute(String name) Object 속성 이름이 name 속성 값을 Object 타입으로 반환한다.
해당되는 속성 이름이 없을 경우 null 반환한다.
getAttributeNames() Enumeration 세션 속성 이름들을 Enumeration 객체 타입으로 반환한다.
getCreationTime() long 1970 1 1 0 0초를 기준으로 현재 세션이 생성된
시간까지 경과한 시간을 계산하여 1/1000 값으로 반환
getId() String 세션에 할당된 고유 식별자를 String 타입으로 반환한다.
getMaxInactiveInterval() int 현재 생성된 세션을 유지하기 위해 설정된 세션 유지
시간을 int 타입으로 반환한다.
invalidate() void 현재 생성된 세션을 소멸한다.
isNew() boolean 최초로 생성된 세션인지 기존에 생성되어 있었던 세션인지
판별한다.
removeAttribute
(String name)
void 세션 속성 이름이 name 속성을 제거한다.
setAttribute(String name,
Object value)
void 세션 속성 이름이 name 속성에 속성 값으로 value
할당한다.
setMaxInactiveInterval(int interval) void 세션을 유지하기 위한 세션 유지 시간을 단위로 설정한다.

 

- Session 메서드은 어떻게 사용하는지 확인해 보자.

 

* SessionTest.java

package servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Servlet implementation class SessionTest
 */
@WebServlet("/sess")
public class SessionTest extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		
		// getSession()을 호출하여 최초 요청 시 세션객체를 새로 생성하거나 기존 세션을 반환한다.
		HttpSession session = request.getSession();
		// 생성된 세션 객체의 id를 가져온다.
		out.print("세션 아이디 : " + session.getId() + "<br>");
		// 최초 세션 객체생성 시간을 가져온다.
		out.print("최초 세션 생성 시각 : " + new Date(session.getCreationTime())+ "<br>");
		// 세션 객체에가장 최근에 접근한 시간을 가져온다.
		out.print("최근 세션 접근 시각 : " + new Date(session.getLastAccessedTime()) + "<br>");
		// 세션 객체의 유효시간을 가져온다.
		out.print("세션 유효 시간 : " + session.getMaxInactiveInterval() + "<br>");
		// 최초 생성된 세션인지 판별한다.
		if(session.isNew()) {
			out.print("새 세션이 만들어졌습니다.");
		}

	}

}


- 코드 작성 후 톰캣을 재시작하고 브라우저에 localhost:[port]/[project_name]/sess를 입력한다.

 

 

처음 접속 시

- 접속 후 새로고침을 해보자.

새로고침 후

- 생성된 세션도 확인할 수 있다.

 

세션 유효 시간

- 세션 기본 유효 시간은 톰캣 컨테이너에서 지정한 1800(30) 이다. 그러나 HttpSession의 setMaxInativeInterval()
메서드를 이용하면 사용자가 원하는 세션 유효 시간을 설정할 있다.

- invalidate() 메서드를 이용하면 세션을 언제든지 삭제할 수도 있다.

 

* SessionTest.java

package servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Servlet implementation class SessionTest
 */
@WebServlet("/sess")
public class SessionTest extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		
		HttpSession session = request.getSession();
		out.print("세션 아이디 : " + session.getId() + "<br>");
		out.print("최초 세션 생성 시각 : " + new Date(session.getCreationTime())+ "<br>");
		out.print("최근 세션 접근 시각 : " + new Date(session.getLastAccessedTime()) + "<br>");
		
		// 기본 세션 유효 시간을 출력한다.
		out.print("기본 세션 유효 시간 : " + session.getMaxInactiveInterval()+ "<br>");
		
		// 세션 유효 시간을 10초로 설정한다.
		session.setMaxInactiveInterval(10);
		
		// 변경된 세션 유효 시간을 출력한다.
		out.print("세션 유효 시간 : " + session.getMaxInactiveInterval() + "<br>");
		
		if(session.isNew()) {
			out.print("세션이 새로 만들어졌습니다.");
		}


	}

}

 

- 코드 작성 후 톰캣을 재시작하고 브라우저에 localhost:[port]/[project_name]/sess를 입력한다.

처음 접속 시

- 접속 후 새로고침을 해보자.

새로고침 후

 

- 세션 유효 시간을 재설정하는 경우는 주로 은행 사이트에 자주 발생한다.

 

세션 삭제

- 세션을 삭제한다.

- 세션은 session.invalidate() 메서드로 삭제한다.

 

* SessionTest.java

package servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Servlet implementation class SessionTest
 */
@WebServlet("/sess")
public class SessionTest extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		
		HttpSession session = request.getSession();
		out.print("세션 ID : " + session.getId() + "<br>");
		out.print("최초 세션 생성 시각 : " + new Date(session.getCreationTime()) + "<br>");
		out.print("최근 세션 접속 시각 : " + new Date(session.getLastAccessedTime()) + "<br>");
		out.print("세션 유효 시간 : " + session.getMaxInactiveInterval() + "<br>");
		
		if(session.isNew()) {
			out.print("새 세션이 만들어졌습니다.");
		}
		
		// 생성된 세션 객체를강제로 삭제한다.
		session.invalidate();
	}
}

 

- 코드 작성 후 톰캣을 재시작하고 브라우저에 localhost:[port]/[project_name]/sess를 입력한다.

처음 접속 시

- 접속 후 새로고침을 해보자.

새로고침 후

- 접속 매번 새로운 세션이 생성된다.

 

세션 로그인 정보 바인딩

- 로그인 상태처럼 사용자와 관련된 정보를 바인딩해서 사용할 세션을 이용하는 것이 편리하다. 세션은 사용자당 개씩 생성되기 때문이다.

- HttpSession 바인딩 기능을 알아본다.

 

- 먼저 로그인 폼을 생성한다.

 

* login.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인</title>
</head>
<body>
	<form name="frmLogin" method="post" action="login" encType="UTF-8">
		아이디   : <input type="text" name="user_id"><br>
		비밀번호 : <input type="password" name="user_pw"><br>
		<input type="submit" value="로그인" />
		<input type="reset" value="다시 입력" />
	</form>
</body>
</html>

 

* SessionTest.java

package servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Servlet implementation class SessionTest
 */
@WebServlet("/login")
public class SessionTest extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doHandle(request, response);
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doHandle(request, response);
	}
	
	public void doHandle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
		response.setContentType("text/html;charset=utf-8");
		request.setCharacterEncoding("utf-8");
		PrintWriter out = response.getWriter();
		HttpSession session = request.getSession();
		
		// 로그인 창에서 전송된  ID와 비밀번호를 가져온다.
		String user_id = request.getParameter("user_id");
		String user_pw = request.getParameter("user_pw");
		// 최초 요청 시 수행
		if(session.isNew()) {
			
			// 로그인창에서 서블릿으로 요청했다면 ID가 null이 아니므로 세션에 ID를 바인딩한다.
			if(user_id != null ) {
				session.setAttribute("user_id",user_id);
				out.print("<a href='login'>로그인 상태 확인</a>");
			}else {
				out.print("<a href='login2.html'>다시 로그인하세요!</a>");
				session.invalidate();
			}
		}else { // 재요청 시 세션에서 ID를 가져와 이전에 로그인했는지 여부를 확인.
			user_id = (String) session.getAttribute("user_id");
			if(user_id != null && user_id.length() != 0) {
				out.print("안녕하세요 " + user_id + "님!");
			}else {
				out.print("<a href='login2.html'>다시 로그인하세요!</a>");
				session.invalidate();
			}
		}
	}

}

 

- 코드 작성 후 톰캣을 재시작하고 브라우저에 localhost:[port]/[project_name]/login.html을 입력한다.

로그인 폼

- 아이디를 입력하고 [로그인] 버튼을 눌러 확인한다.

로그인 버튼 클릭 후

- "로그인 상태 확인" 링크를 클릭하여 바인딩 상태를 확인한다.

id가 제대로 바인딩된 경우

 

- 아이디를 입력하지 않고 /login 페이지에 직접 접근하는 경우 다음과 같은 페이지가 나타난다.

아이디가 바인딩되지 않은 경우

 

반응형

'Servlet' 카테고리의 다른 글

encodeURL()  (0) 2024.08.13
서블릿 - 세션 로그인 예제  (0) 2024.08.12
세션 트래킹 - 쿠키  (0) 2024.08.12
세션 트래킹  (0) 2024.08.12
서블릿 컨텍스트(ServletContext)  (0) 2024.08.12
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함