본문 바로가기

개발/Java

[JAVA - WEB] 쿠키(Cookie)

728x90
반응형

쿠키에 대해서 설명하기 전에 웹 페이지 연동 시에 알아야 할 부분이 있습니다.

 

세션 트래킹(Session Tracking)

 

세션 트래킹이란 사용자 입장에서 웹 페이지 사이의 상태나 정보를 공유하도록 하기 위해 프로그래머가 구현해야 하는 웹 페이지 연결 기능입니다.
HTTP 프로토콜은 각 웹 페이지의 상태나 정보를 다른 페이지들과 공유하지 않는 stateless 방식으로 통신을 합니다.
따라서 웹 페이지나 서블릿끼리 상태가 정보를 공유하려면 웹 페이지 연결 기능, 즉 세선 트래킹을 이용해야 합니다.

 

웹 페이지를 연동하는 방법 중 쿠키를 이용하는 방법과 세션을 이용하는 방법이 있습니다.

쿠키 : 클라이언트 PC 의 Cookie 파일에 정보를 저장한 후 웹 페이지들이 공유합니다.
세션 : 서버 메모리에 정보를 저장한 후 웹 페이지들이 공유합니다.

 

 

 

쿠키(Cookie)

 

쿠키란 웹 페이지들 사이의 공유 정보를 클라이언트 PC 에 저장해 놓고 필요할 때 여러 웹 페이지들이 공유해서 사용할 수 있도록 매개 역할을 하는 방법입니다.


쿠키는 클라이언트 PC 에 정보를 저장해서 사용하므로 보안에 취약합니다. 
따라서 쿠키를 이용한 방법은 주로 보안과 무관한 경우에 한해 사용합니다. 
예를 들어 각 사이트의 로그인 시에 ID 를 저장해두는 경우나 팝업창이 생성됐을 때 오늘 하루 열지 않기 등의 설정 시에 사용할 수 있습니다.

 

쿠키는 다음과 같이 두 종류로 나눌 수 있습니다.

 

속성 Persistence Cookie Session Cookie
생성 위치 파일로 생성 브라우저 메모리에 생성
종료 시기 쿠키를 삭제하거나 쿠키 설정 값이 종료된 경우 브라우저를 종료한 경우
최초 접속 시 전송 여부 최초 접속 시 서버로 전송 최초 접속 시 서버로 전송되지 않음
용도 로그인 유무, 팝업창 제한, ID 저장 등 사이트 접속 시 Session 인증 정보를 유지할때

 

Session 쿠키는 세선 기능과 같이 사용됩니다.

 

 

 

쿠키 API

 

javax.servlet.http.Cookie 객체를 이용합니다.
HttpServletResponse 의 addCookie() 메서드를 이용해 클라이언트 브라우저에 쿠키를 전송한 후 저장합니다.
HttpServletReqeust 의 getCookie 메서드를 이용해 쿠키를 서버로 가져옵니다.

Cookie 클래스에서 제공하는 메서드는 다음과 같습니다.

 

메서드 기능
getComment() 쿠키에 대한 설명을 가져옵니다.
getDomain() 쿠키의 유요한 도메인 정보를 가져옵니다.
getMaxAge() 쿠키 유효 기간을 가져옵니다.
getName() 쿠키 이름을 가져옵니다.
getPath() 쿠키의 디렉터리 정보를 가져옵니다.
getValue() 쿠키의 설정 값을 가져옵니다.
setComment(String comment) 쿠키에 대한 설명을 설정합니다.
setDomain(String domain) 쿠키의 유요한 도메인을 설정합니다.
setMaxAge(int age) 쿠키 유효 기간을 설정합니다.
setValue(String value) 쿠키 값을 설정합니다.

 

쿠키 생성 시 setMaxAge() 메서드 인자 값의 종류를 지정할 수 있는데 이 인자 값을 양수로 지정하면 파일로 저장하는 Persistence 쿠키로 저장이 되고, 음수나 setMaxAge() 함수를 사용하지 않으면 메모리에만 저장하는 Session 쿠키로 저장됩니다.

 

 

 

서블릿에서 쿠키 사용

 

서블릿에서 쿠키 API 를 사용하여 직접 쿠키를 만들어 보겠습니다.(쿠키라고 하니 굽는 쿠키가 자꾸 생각이 나네요. 하.하.)

 

먼저 쿠키를 설정하는 예제입니다.

 

@WebServlet("/set")
public class SetCookieValue 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();
		Date d = new Date();
		Cookie c = new Cookie("cookieTest", URLEncoder.encode("서블릿에서 쿠키 사용 참 쉽죠?", "utf-8"));
		c.setMaxAge(24 * 60 * 60); // 양수이므로 PC 에 파일로 쿠키 저장
		response.addCookie(c); // 생성된 쿠키를 브라우저로 전송
		out.println("Current Time : " + d);
		out.println("<br> 문자열을 쿠키에 저장하였습니다.");

	}

 

다음 저장된 쿠키를 가져오는 예제입니다.

 

@WebServlet("/get")
public class GetCookieValue 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();
		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"));
			}
		}

	}
}

 

모두 저장한 후 웹 브라우저에 /set 을 요청하면 쿠키가 저장된 것을 확인하실 수 있습니다.

 

 

이제 저장한 쿠키를 불러오기 위해서 /get 을 요청하면 저장했던 쿠키가 출력되는 것을 확인할 수 있습니다.

 

 

쿠키 생성 상태를 확인하려면 개발자도구(F12) - Applicaion - Cookie - http://localhost:8090 클릭해서 확인할 수 있습니다.

 

쿠키의 파일 저장이 아닌 메모리에 저장하려면 위의 SetCookieValue.java 파일의 c.setMaxAge 의 인자 값을 -1 로 설정하면 파일로 저장하지 않고 메모리에 저장하게 됩니다.(결과는 동일)

 

 

 

쿠키를 이용한 팝업 제한

 

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

 

먼저 메인 웹 브라우저에서 보여줄 HTML 파일을 작성합니다.

 

<html>
<head>
<meta charset="UTF-8">
<title>팝업 제한 메인</title>
<script type="text/javascript">
	// 페이지 로드 이벤트 처리
	window.onload = pageLoad;
	function pageLoad() {
		// 저장된 쿠키 읽어오기
		notShowPop = getCookieValue(); // 쿠키 정보를 가져옴
		if (notShowPop != "true") { // 팝업제한이 true 이면 팝업을 띄우지 않고 아니면 팝업을 띄움
			window.open("popUp.html",
						"pop",
						"width=600,height=400,history=no,resizable=no,status=no,scrollbars=yes,menubar=no");
		}
	}

	// 쿠키 읽어오는 함수
	function getCookieValue() {
		var result = "false";
		// 쿠키 여부 확인
		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*/, ''); // 정규표현식 공백 제거
				if (value == "notShowPop") { // key 가 일치하면
					result = element[1]; // 값을 result 에 할당해서 반환
				}
			}
		}
		return result;
	}
	// 쿠키 삭제 함수
	function deleteCookie() {
		document.cookie = "notShowPop=" + "false" + ";path=/; expires=-1";
	}
</script>
</head>
<body>
	<form>
		쿠키를 삭제하려면 아래 버튼을 클릭하세요.<br>
		<input type=button value="쿠키삭제" onClick="deleteCookie()">
	</form>
</body>
</html>

 

이제 체크하면 띄워지지 않을 팝업창을 만듭니다.

 

<html>
<head>
<meta charset="UTF-8">
<title>팝업창</title>
<script type="text/javascript">
	function setPopUpStart(obj) {
		if (obj.checked == true) { // checkbox 가 체크가 되어 있으면
			var expireDate = new Date();
			var days = 1;
			expireDate.setDate(expireDate.getDate() + days);
			// document.cookie 에 넣기
			document.cookie = "notShowPop=" + "true" + ";path=/; expires="
					+ expireDate.toGMTString();
			window.close();
		}
	}
</script>
</head>
<body>
	체크하면 팝업창은 다음 기회에..
	<br>
	<br>
	<br>
	<br>
	<br>
	<form>
		<input type=checkbox onClick="setPopUpStart(this)">오늘 하루 보지 않기
	</form>
</body>
</html/>

 

모두 저장한 다음 /popuptest.html 을 요청합니다.

 

 

팝업창이 생성되는 것을 확인하실 수 있습니다.

여기서 팝업창의 "오늘 하루 보지 않기" 를 체크한 후 다시 웹 브라우저를 요청합니다.

 

 

팝업창이 나타나지 않는 것을 확인하실 수 있습니다.

쿠키삭제 버튼을 클릭하게 되면 팝업창은 다시 되살아납니다...

 

 

여기까지 임미다.

 

728x90