본문 바로가기

Backend/Servlet

쿠키와 세션

쿠키와 세션 : 개념 / 공통점 / 차이점

  • 클라이언트와 서버 간에 정보를 교환 시, 클라이언트 PC 또는 서버의 메모리에 저장해 두고 사용하면 프로그램 속도를 향상시킬 수 있음
  • 공통점 : 웹 통신간 유지하려는 정보 저장을 위해 사용 (로그인 정보 등)
  • 차이점 : 저장위치, 저장형식, 용량제한, 만료시점 등
    • 쿠키 : 개인 PC에 저장
    • 세션 : 접속중인 웹 서버에 저장

HTTP 프로토콜

  • 서버-클라이언트 통신 시 stateless 방식으로 통신
  • 브라우저에서 새 웹페이지를 열면 기존의 웹페이나 서블릿에 관한 어떤 연결 정보도 유지되지 않음
  • 새로 열린 페이지에서 어떤 정보도 알 수 없음
  • 페이지가 서로 독립적이어서 서로의 상태를 알 수 없음

웹 페이지 사이에 또는 서블릿 간에 상태 및 정보 공유를 위해서는 웹 페이지를 연결시켜 주는 기능 필요 (세션 트래킹)

웹 페이지를 연결하기 위한 방법

: 페이지 간에 정보를 교환하거나 데이터를 공유하기 위한 방법

(1) <hidden> 태그 사용

  • <input type=’hidden’ value=’${id}’> 태그 사용
  • 현재 페이지에 데이터를 숨겨놓고, 연결된 다음 페이지로 데이터를 보내는 방법
  • 두 웹 페이지가 데이터를 공유
  • GET 방식으로 전송 : 데이터 노출, 길이 제한, 보안 문제 
    • ex) 페이지1에서 <input type=’hidden’ name=’id’ value=’abcd’>로 데이터 숨겨 놓음
    • 페이지2에서 request.getParameter()로 받아서 사용할 수 있음

(2) URL Rewriting

  • GET 방식으로 전송할 때 데이터가 URL 뒤에 붙어서 다음 페이지로 전송
  • 다음 페이지에서 request.getParameter()로 받아서 사용할 수 있음
  • GET 방식으로 전송 : 데이터 노출, 길이 제한, 보안 문제
  • ex) second02?name=lee

(3) 쿠키

  • 클라이언트 PC의 Cookie 파일에 정보를 저장한 후 웹 페이지 공유

(4) 세션 

  • 서버 메모리에 정보를 저장한 후 웹 페이지 공유

 

웹 페이지 연결 예제 - 1 : hidden

login-hidden.html

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>로그인창</title>
	</head>
	<body>
	  <form name="formLogin" method="post" action="loginHidden" >
		   아이디  :<input type="text" name="user_id"><br>
	     비밀번호:<input type="password" name="user_pw" ><br>
	    <input type="submit" value="로그인">  <input type="reset" value="다시입력">
	    <!-- hidden 태그 -->
	    <input type="hidden" name="user_address" value="서울시 종로구">
	    <input type="hidden" name="user_email" value="test@naver.com">
	    <input type="hidden" name="user_hp" value="010-1111-1111">
	  </form>
	</body>
</html>

 

LoginHiddenServlet : /loginHidden

package sec01;

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;

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

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		
		String user_id = request.getParameter("user_id");
		String user_pw = request.getParameter("user_pw");
		String user_address = request.getParameter("user_address");
		String user_email = request.getParameter("user_email");
		String user_hp = request.getParameter("user_hp");
		
		String data = "<html><body>";
		data+="안녕하세요!<br> 로그인하셨습니다.<br><br>";
		data+="아이디 :" + user_id + "<br>";
		data+="비밀번호 :" + user_pw + "<br>";
		data+="주소 :" + user_address + "<br>";
		data+="이메일 :" + user_email + "<br>";
		data+="휴대전화 :" + user_hp;
		data+="</body></html>";
		out.print(data);
	}

}

 


웹 페이지 연결 예제 - 2 : URL Rewriting

login.html

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>로그인창</title>
	</head>
	<body>
	  <form name="formLogin" method="post" action="login" >
		   아이디  :<input type="text" name="user_id"><br>
	     비밀번호:<input type="password" name="user_pw" ><br>
	    <input type="submit" value="로그인">  <input type="reset" value="다시입력">
	    <!-- hidden 태그 -->
	    <input type="hidden" name="user_address" value="서울시 종로구">
	    <input type="hidden" name="user_email" value="test@naver.com">
	    <input type="hidden" name="user_hp" value="010-1111-1111">
	  </form>
	</body>
</html>

 

LoginServlet : /login

package sec01;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLEncoder;

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

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

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		
		String user_id = request.getParameter("user_id");
		String user_pw = request.getParameter("user_pw");
		String user_address = request.getParameter("user_address");
		String user_email = request.getParameter("user_email");
		String user_hp = request.getParameter("user_hp");
		
		if(user_id!=null && user_id.length()!=0) {
		String data = "<html><body>";
		data+="안녕하세요!<br> 로그인하셨습니다.<br><br>";
		data+="아이디 :" + user_id + "<br>";
		data+="비밀번호 :" + user_pw + "<br>";
		data+="주소 :" + user_address + "<br>";
		data+="이메일 :" + user_email + "<br>";
		data+="휴대전화 :" + user_hp;
		data+="</body></html>";
		out.print(data);
		
		// URL Rewriting 방식 이용
		user_address = URLEncoder.encode(user_address, "utf-8");
		out.print("<a href='/Servlet02/second?user_id=" + user_id
					+ "&user_pw=" + user_pw
					+ "&user_address=" + user_address
					+ "'><br>두 번째 서블릿으로 보내기</a>");
		data = "</body></html>";
		} else {
			out.println("로그인 하지 않았습니다.<br><br>");
			out.println("다시 로그인 하세요<br><br>");
			out.println("<a href='/Servlet02/login.html'>");
		}
	}

}

 

웹 페이지 연결 예제 - 3 : URL Rewriting

 

package sec01;

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;

/**
 * Servlet implementation class SecondServlet
 */
@WebServlet("/second")
public class SecondServlet 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 {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		
		String user_id = request.getParameter("user_id");
		String user_pw = request.getParameter("user_pw");
		String user_address = request.getParameter("user_address");
		
		out.println("<html><body>");
		if(user_id!=null && user_id.length()!=0) {
			out.println("이미 로그인 상태입니다.<br><br>");
			out.println("첫 번째 서블릿에서 넘겨준 아이디 : " + user_id + "<br>");
			out.println("첫 번째 서블릿에서 넘겨준 비밀번호 : " + user_pw + "<br>");
			out.println("첫 번째 서블릿에서 넘겨준 주소 : " + user_address + "<br>");
			out.println("</body></html>");
		} else {
			out.println("로그인 하지 않았습니다.<br><br>");
			out.println("다시 로그인 하세요<br><br>");
			out.println("<a href='/Servlet02/login.html'>");
		}
	}

}

쿠키 (Cookie)

  • 서버 측에서 클라이언트 측에 상태 정보를 저장하고 추출하기 위한 메커니즘
  • 서버에서 생성하여, 클라이언트 측에 저장됨
  • 서버에 요청할 때마다 쿠키의 속성 값을 참조하거나 변경
  • 크기는  4kb 용량
  • 클라이언트에 300개까지 쿠키 저장 가능
  • 하나의 도메인 당 20개의 값만 저장
  • 클라이언트에 저장되므로 보안상의 문제 발생
  • 따라서 민감한 정보는 쿠키 내에 저장하지 않음
  • 쿠키는 사용자가 거부할 수 있으면 256문자 이하의 text 데이터만 저장됨

쿠키 생성 및 저장 과정

서버에서 쿠키 생성

  • Cookie 클래스로부터 쿠키 객체 생성
  • Cookie cookie = new Cookie(이름, 값);

 

속성 설정

  • setter 사용해서 쿠키 객체의 유효기간 설정
  • cookie.setMaxAge(유효기간);

 

클라이언트에 전송되어 저장

  • response 내장 객체의 addCookie() 메소드로 전송
  • response.addCookie(쿠키객체);

클라이언트 - 서버 간 Cookie 흐름

쿠키 동작 방식

  1. 클라이언트가 페이지 요청
  2. 서버에서 쿠키 생성 / HTTP 헤더에 쿠키를 포함시켜 응답 (브라우저가 종료되어도 쿠키 만료기간이 남아있다면 클라이언트에서 보관하고 있음)
  3. 다시 요청을 할 경우 HTTP 헤더에 쿠키를 함께 보냄 (서버에서 쿠키를 읽어 이전 상태 정보를 변경할 필요가 있을 때, 쿠키를 업데이트하여 변경된 쿠키를 HTTP 헤더에 포함시켜 응답)
  4. 이후 요청 받은 페이지 응답

쿠키 관련 주요 메소드

  • setMaxAge() : 유효 기간 설정
  • setValue() : 쿠키 값 설정
  • sevVersion() : 쿠키 버전 설정
  • setPath(0 : 쿠키 사용의 유효 디렉터리 설정
  • getMaxAge() : 유효 기간 반환
  • getName() : 쿠키 이름 반환
  • getValue() : 쿠키 값 반환
  • 등등
  • 쿠키 제거 : cookie.setMaxAge(0) 으로 설정
  • 클라이언트에 전송되어 변경된 값으로 저장 : response.addCookie(cookie)

쿠키 유형

Persistence 쿠키

  • setMaxAge(양수) 메소드를 사용해서 양수값으로 지정해서 파일로 저장하면 지속해서 남아있음
  • 유효 기간 동안 지속됨

 

Session 쿠키

  • 브라우저가 사용하는 메모리에 생성되는 쿠키로
  • 브라우저가 종료되면 메모리의  Session 쿠키도 자동으로 소멸
  • setMaxAge(음수) : Session 쿠키로 생성

 

쿠키 예제

SetCookieValue 서블릿 : /setCookie

package sec02;

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

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

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

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		Date d = new Date();
		// Cookie 객체 생성 후 cookieTest 이름으로 한글 정보 인코딩하여 쿠키에 저장
		Cookie cookie = new Cookie("cookieTest", URLEncoder.encode("Cookie 테스트입니다.", "utf-8"));
		cookie.setMaxAge(24*60*60); // 유효기간 설정 : 하루 = 24시간 * 60분 * 60초
		response.addCookie(cookie); // 생성한 쿠키를 브라우저로 전송하여 저장
		out.println("현재 시간 : " + d); // 
		out.println("<br> Cookie에 저장");
	}

}

 

GetCookieValue 서블릿  : getCookie

package sec02;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;

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

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

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		
		// 가져올 때는 한 개를 가져오더라도 배열로 가져와야 함
		Cookie[] allValues = request.getCookies();
		
		for (int i=0; i<allValues.length; i++) {
			if(allValues[i].getName().equals("cookieTest")) {
				out.println("<h2>Cookie 값 가져오기 : " + URLDecoder.decode(allValues[i].getValue(), "utf-8"));
			}
		}
	}

}

쿠키 이용해서 팝업창 제어

팝업창 제어는 서버에서 쿠키를 다루지 않고, 자바스크립트를 이용해서 쿠키에 접근

 

팝업창 제어 예제 : popUp.html

- 체크박스 체크하여 쿠키 설정 : 오늘 더 이상 팝업창 띄우지 않기

- 쿠키이름=값;패스=/;유효기간=값

<!DOCTYPE html>
<html>
	<head>
		<meta charset="EUC-KR">
		<title>Insert title here</title>
		<script type="text/javascript">
			function setPopUpStart(obj) {
				if(obj.checked == true) {
					var expireDate = new Date();
					alert(expireDate); // 현재 날짜
					
					var days = 1;
					expireDate.setDate(expireDate.getDate() + days);
					alert(expireDate); // 오늘 날짜 + 1일
					
					// 쿠키 값 설정 : 쿠키 이름, 패스, 유효 기간
					document.cookie = "notShowPop=" + "true" + ";path=/;expires="+
										expireDate.toGMTString();
					
					// 팝업창 닫기
					window.close();
				}
			}
		</script>
	</head>
	<body>
		알림 팝업창입니다. <br><br><br><br><br><br>
		<form>
			<input type="checkbox" onClick="setPopUpStart(this)"> 오늘 더 이상 팝업창 띄우지 않기
		</form>
	</body>
</html>

 

팝업창 제어 예제 : popUpTest.html

- 페이지 로드 하면서 쿠키 읽어 옴

- 설정한 값이 아니면 팝업창 열림

- 설정한 값이 있으면 유효기간 전에는 팝업창 안 열림

<!DOCTYPE html>
<html>
	<head>
		<meta charset="EUC-KR">
		<title>popUpTest</title>
		<script type="text/javascript">
			// 시작 시 페이지 로드 함수 호출
			window.onload = pageLoad;
			
			
			// 페이지 로드 함수 : 팝업창(popUp.html) 띄우는 함수
			function pageLoad() {
				// 쿠키 읽어오는 함수 getCookieValue() 호출하여 저장된 쿠키 읽어오기
				var notShowPop = getCookieValue();
				
				// 읽어온 쿠키 값이 "true"가 아니면 popUp.html 열기
				if(notShowPop!="true") {
					window.open("popUp.html", "pop", "width=400, height=500, history=no, resizable=no, status=no, scrollbars=yes, menubar=no");
				}
			}
			
			// 쿠키 읽어오는 함수
			function getCookieValue(){
				var result = "false"; // default
				
				// 쿠키 존재 여부 확인 : 쿠키가 존재하면
				if(document.cookie!="") {
					// 구분자를 세미콜론(;)으로 하여 각 값을 배열로 저장
					cookie = document.cookie.split(";");
					
					for(var i=0; i<cookie.length; i++) {
						// 구분자 = 를 기준으로 각 값을 배열로 저장
						element = cookie[i].split("=");
						value = element[0];
						value = value.replace(/^\s*/,''); // 앞 공백 제거 정규식
						
						// 쿠키 이름이 notShowPop 이면
						if(value=="notShowPop") {
							result = element[1]; // 쿠키 값 가져오기 ("true") (배열 두 번째 요소)
						}
					}
				}
				return result;
			}
			
			// 쿠키 삭제하는 함수 : 유효 기간을 -1로 설정 
			function deleteCookie() {
				document.cookie = "notShowPop=" + "false" + ";path=/;expires=-1";
			}
			
		</script>
	</head>
	<body>
		<form>
			<input type="button" value="쿠키 삭제" onClick="deleteCookie()">
		</form>
	</body>
</html>

 

공백제거 정규식

  • replace(' ', '') : 첫 번째 공백 제거
  • replace(/^\s*/,'') : 앞에 있는 모든 공백 제거
  • replace(/\s*$/,'') : 뒤의 모든 공백 제거

세션 (Session)

  • 클라이언트와 웹 서버 간에 네트워크로 연결이 지속적으로 유지되고 있는 상태
  • 쿠키와 마찬가지로 서버와의 관계를 유지하기 위한 수단
  • 쿠키와 달리 클라이언트 측에 저장되는 것이 아니라 서버 상에 객체로 존재
  • 따라서 세션은 서버에서만 접근이 가능하여 보안이 좋음
  • 서버에서 사용자의 정보를 유지 관리
  • 사용자 인증 후 여러 페이지에 걸쳐 정보를 공유해서 사용할 수 있게 해줌
  • Session은 서버 측에서만 설정이 가능
  • 브라우저 당 한 개씩 생성

세션 생성 및 사용 과정

  • 클라이언트가 서버에 페이지 요청
  • Session 자동 생성
  • Session 속성 설정 (session 내부 객체의 메소드 사용)

세션 ID

  • 클라이언트가 처음 접속하면 서버(컨테이너)로 부터 유일한 ID를 부여 받게 되는데 이를 세션 ID라고 함
  • 클라이언트가 재 접속했을 때 클라이언트를 구분하기 위한 수단으로 사용됨
  • 서블릿에서 생성된 세션 id는 브라우저로 전송되어 세션 쿠키에 JSESSIONID 라는 이름의 쿠키로 저장됨
  • F12 개발자도구 / Application / Cookies에서 확인 가능

세션 관련 메소드

  • setAttribute(이름, 값) : 세션 이름과 값 설정
  • getAttribute(이름) : 이름에 해당된 값 반환
  • getAttributeNames() : 모든 세션 이름 반환
  • getId() : 세션 ID 반환
  • isNew() : 새로 생성되었는지 여부 반환
  • getMaxInactiveInterval() : 설정된 유효기간 반환
  • removeAttribute() : 설정된 속성값 제거
  • invalidate() : 실행 중인 세션 종료. 모든 데이터 삭제. 로그아웃 시 사용
  • isRequestedSessionIdValid() : 유효한 세션 ID가 있는 여부 반환

세션 값 설정

  • session.setAttribute(“SID”, “abcd”)
  • session : 내장 객체 

세션 값 알아오기

  • Object obj = session.getAttribute(“SID”);
  • Object 타입 반환 (사용 시 형 변환)

세션 속성 제거

  • session.removeAttribute(“SID”);

세션 종료

  • session.invalidate()
  • 또는 설정된 유효 기간이 만료되면 종료

세션 무효화

  • invalidate() 메소드를 사용해서 바로 무효화시킬 수 있음
  • web.xml 파일에서 session-timeout 설정해서 시간을 정할 수 있음
  • setMaxInactiveInterval()를 사용해서 시간 지정 가능
  • 기본 세션은 마지막 요청으로부터 30분 경과 후 자동 소멸됨
  • 세션 유효 기간을 따로 설정하지 않으면 톰캣에서 설정한 기본 유효 시간 30분 적용
<!-- web.xml 중 다음과 일치하는 코드 내용 일부를 수정하여 유효기간 설정 가능 -->
<session-config>
  <session-timeout>30</session-timeout>
</session-config>

세션 예제

SessionTest 서블릿 : /sess : 세션 아이디, 최소 생성 시간, 접근 시간, 유효 시간, isNet() 확인

package sec03;

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;

	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.println("세션 아이디 : " + session.getId() + "<br>");
		out.println("최초 세션 생성 시각 : " + new Date(session.getCreationTime()) + "<br>");
		out.println("최근 세션 접근 시각 : " + new Date(session.getLastAccessedTime()) + "<br>");
		out.println("세션 유효 시간 : " + session.getMaxInactiveInterval() + "<br>");
		
		if(session.isNew()) {
			out.println("새 세션이 만들어졌습니다.");
		}
		
		// 동일 브라우저 + 유효기간 내에서는 웹 브라우저를 껐다 켜도 세션 아이디 동일 (다른 웹 브라우저로 재실행하면 아이디 다름 = 새 세션 생성)
	}

}


SessionTest2 서블릿 : /sess2 : 세션 유효 시간 5초로 설정

package sec03;

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 SessionTest2
 */

//세션 유효 시간을 5초로 설정
@WebServlet("/sess2")
public class SessionTest2 extends HttpServlet {
	private static final long serialVersionUID = 1L;

	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.println("세션 아이디 : " + session.getId() + "<br>");
		out.println("최초 세션 생성 시각 : " + new Date(session.getCreationTime()) + "<br>");
		out.println("최근 세션 접근 시각 : " + new Date(session.getLastAccessedTime()) + "<br>");
		
		out.println("기본 세션 유효 시간 : " + session.getMaxInactiveInterval() + "<br>");
		session.setMaxInactiveInterval(5); // 세션 유효 시간을 5초로 설정
		out.println("변경 세션 유효 시간 : " + session.getMaxInactiveInterval() + "<br>");
		
		if(session.isNew()) {
			out.println("새 세션이 만들어졌습니다.");
		}
		
		// 5초 지난 후 새로 실행 -> 새 세션 생성됨
		// 5초 지나기 전에 새로 실행 -> 새 세션 생성되지 않음
	}

}


SessionTest3 서블릿 : /sess3 : invalidate() 호출해서 사용자가 세션을 강제로 삭제 + 세션 이용한 로그인/로그아웃 기능

package sec03;

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 SessionTest3
 */

// invalidate() 호출해서 생성된 세션 객체를 강제로 삭제 : 세션 무효화
@WebServlet("/sess3")
public class SessionTest3 extends HttpServlet {
	private static final long serialVersionUID = 1L;

	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.println("세션 아이디 : " + session.getId() + "<br>");
		out.println("최초 세션 생성 시각 : " + new Date(session.getCreationTime()) + "<br>");
		out.println("최근 세션 접근 시각 : " + new Date(session.getLastAccessedTime()) + "<br>");
		out.println("세션 유효 시간 : " + session.getMaxInactiveInterval() + "<br>");

		if(session.isNew()) {
			out.println("새 세션이 만들어졌습니다.");
		}
		
		session.invalidate();
		// 생성된 세션 객체를 강제로 삭제
		// 실행할 때마다 매번 세션 새로 생성
	}

}


sessionLogin.html

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>로그인창</title>
	</head>
	<body>
	  <form name="frmLogin" method="post" action="logInOut" >
		   아이디  :<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>


LoginLogout  서블릿 : /logInOut

package sec03;

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 LoginLogout
 */
@WebServlet("/logInOut")
public class LoginLogout extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doProcess(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doProcess(request, response);
	}
	
	protected void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		HttpSession session = request.getSession();
		
		String user_id = request.getParameter("user_id");
		String user_pw = request.getParameter("user_pw");
		
		// 처음 접속이면
		if(session.isNew()) {
			// user_id 입력 값이 있으면
			if(user_id != null) {
				// (세션 첫 생성 + 아이디 값이 있는 경우)
				// SID 이름, user_id 값으로 세션 변수 생성
				session.setAttribute("SID", user_id);
				// 다시 실행시켜서 SID 확인
				out.print("<a href='logInOut'>로그인 상태 확인</a>");				
			}else { // user_id 입력 값이 없으면
				// (세션 첫 생성 + 아이디 값이 없는 경우)
				out.print("<a href='sessionLogin.html'>다시 로그인 하세요!</a>");
				session.invalidate(); // 현재 접속해있는 세션 끊어버림 -> 다시 로그인하라고
			}
			
		} else {   //아니고 세션이 있으면
			user_id = (String) session.getAttribute("SID"); // 오브젝트 반환하기 때문에 string 형변환
			if(user_id != null && user_id.length() != 0) {
				out.print("안녕하세요 " + user_id + "님!!");
				out.print("<br><a href='logout'>로그아웃</a>");
			} else {
				out.print("<a href='sessionLogin.html'>다시 로그인 하세요!</a>");
				session.invalidate();
			}
		}
	}
}

 

SessionLogout 서블릿 : /logout

package sec03;

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 SessionLogout
 */
@WebServlet("/logout")
public class SessionLogout extends HttpServlet {
	private static final long serialVersionUID = 1L;

	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();
		
		session.invalidate(); // 세션 무효화
		
		out.print("로그아웃 되었습니다. <br>");
		out.print("<a href='sessionLogin.html'>로그인</a>");
	}

}

'Backend > Servlet' 카테고리의 다른 글

서블릿 포워드와 바인딩  (0) 2021.12.29
커넥션 풀 (DBCP : DataBase Connection Pool)  (0) 2021.12.28
서블릿 DB 연동  (0) 2021.12.28
DTO vs VO  (0) 2021.12.28
자바스크립트로 서블릿에 요청하기 예제  (0) 2021.12.27