위로 아래

Cookie

쿠키(Cookie)

  1. 클라이언트의 상태 정보를 유지하기 위한 기술
  2. 상태 정보를 클라이언트에 키와 값의 형태로 저장했다가, 다음 요청 시 저장된 쿠키를 함께 전송해서, 웹 서버가 쿠키로부터 필요한 데이터를 읽어올 수 있도록 한다.
  3. 쿠키의 제약
    1. 쿠키 하나의 크기 : 4096바이트
    2. 쿠키는 3000개까지 만들 수 있다
    3. 하나의 호스트나 도메인에서는 최대 50개까지 만들 수 있다.
    4. 쿠키로 저장할 수 있는 최대 용량 1.2MB 
    5. 보안이 취약

쿠키 동작 

  1. 클라이언트가 서버에 요청 전송
  2. 서버가 쿠키를 생성하여 HTTP 응답 헤더에 실어 응답과 함께 클라이언트에 전송
  3. 클라이언트에서 쿠키를 받아 저장
  4. 다음 요청에서 클라이언트가 서버에 요청을 보낼 때, HTTP 요청 헤더에 저장해둔 쿠키를 함께 전송
  5. 서버가 쿠키를 받아 정보를 읽음

 

쿠키 생성 예시

더보기
<!-- 로그인 페이지 Cookie.jsp 파일 -->
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="Cookie01Process.jsp" method="post">
		<p>아이디 : <input type="text" name="id"></p>
		<p>비밀번호 : <input type="text" name="passwd"></p>
		<p><input type="submit" value="전송하기"></p>
	</form>
</body>
</html>
<!-- 쿠키 생성 페이지 Cookie01Process.jsp 파일 -->
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
	String user_id = request.getParameter("id");
	String user_pw = request.getParameter("passwd");
	
	if(user_id.equals("admin") && user_pw.equals("1234")){
		Cookie cookie_id = new Cookie("userID",user_id);
		Cookie cookie_pw = new Cookie("userPW",user_pw);
		response.addCookie(cookie_id);
		response.addCookie(cookie_pw);
		out.println("쿠키 생성이 성공했습니다. <br>");
		out.println(user_id + "님 환영합니다");
	} else {
		out.println("쿠키 생성이 실패했습니다.");
	}
%>
</body>
</html>

 

 

 


쿠키 종류

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

 

예시

더보기
//SetCookieValue 서블릿

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.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/set")
public class SetCookieValue extends HttpServlet {
	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","gaesol");
		c.setMaxAge(24*60*60);   // Persistence 쿠키
		//c.setMaxAge(-1);    // Session 쿠키
		response.addCookie(c);
		out.println("현재시간 : "+d);
		out.println("문자열을 Cookie에 저장합니다.");
	}
}
//GetCookieValue 서블릿

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

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;

@WebServlet("/get")
public class GetCookieValue extends HttpServlet {
	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 값 가져오기 : "
						+ allValues[i].getValue());
			}
		}
	}

}

 

 

 


쿠키 메소드

속성

  1. 이름(name) : 쿠키를 구별하는 이름
  2. 값(value) : 쿠키에 실어서 저장할 데이터
  3. 도메인(domain) : 쿠키를 적용할 도메인
  4. 경로(path) : 쿠키를 적용할 경로
  5. 유지 기간(max age) : 쿠키를 유지할 기간

 

쿠키 생성자

new Cookie(name, value)

 

 

세터 메소드

  1. setValue(값) : 쿠키의 값을 설정 (문자열)
  2. setDomain(도메인) : 쿠키에 적용할 도메인 설정. 
  3. setPath(경로) : 쿠키가 적용될 경로를 지정. 지정된 경로의 하위 경로에까지 적용된다 (문자열) 
  4. setMaxAge (초) : 쿠키가 유지될 기간을 초 단위로 설정
    1. 음수 설정 : Session 쿠키로 설정 (없어도 Session 쿠키)
    2. 양수 설정 : Persistence 쿠키로 설정

 

게터 메소드

  1. getName() : 쿠키의 이름을 반환
  2. getValue() : 쿠키의 값을 반환
  3. getDomain() : 쿠키가 적용되는 도메인을 반환
  4. getPath() : 쿠키의 적용 경로를 반환 (없다면 null)
  5. getMaxAge() : 쿠키의 유지 기간을 반환 (없다면 -1 반환)

 

예시

더보기
<!-- Cookie02.jsp 파일 -->
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
	Cookie[] cookies = request.getCookies();
	out.println("현재 설정된 쿠키의 개수 : " + cookies.length);
	out.println("<br> ====== <br>");
	
	for(int i=0;i<cookies.length;i++){
		out.println(i + "번째 쿠키의 속성 이름 : " + cookies[i].getName() + "<br>");
		out.println(i + "번째 쿠키의 속성 값 : " + cookies[i].getValue() + "<br>");
	}
%>
</body>
</html>
<!-- Cookie02.jsp 파일 -->
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
	Cookie[] cookies = request.getCookies();

	for(int i=0;i<cookies.length;i++){
		cookies[i].setMaxAge(0);
		response.addCookie(cookies[i]);
	}
	response.sendRedirect("Cookie02.jsp");
%>
</body>
</html>

 

 


쿠키를 이용한 팝업창 만들

더보기
<!-- popupTest.jsp -->
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type ="text/javascript">
	window.onload = pageLoad;
	function pageLoad(){
		notShowPop = getCookieValue();
		if(notShowPop != "true"){
			window.open("popUp.jsp","pop","width=400, height=500, history=no," +
					"resizable=no, status=no, scrollbars=yes, menubar=no");
		}
	}
	function getCookieValue(){
		let result = "false";
		if(document.cookie != ""){
			cookie = document.cookie.split(";");
			for(let i=0; i<cookie.length;i++){
				element=cookie[i].split("=");
				value=element[0];
				value = value.replace(/^\s*/,'');
				if(value=="notShowPop"){
					result = element[1];
				}
			}
		}
		return result;
	}
	function deleteCookie(){
		document.cookie = "notShowPop=" + "false" + ";path=/; expires=-1";
	}
</script>
</head>
<body>
	<form>
		<input type="button" value="쿠키삭제" onClick="deleteCookie()">
	</form>
</body>
</html>
<!-- popUp.jsp -->
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
	function setPopUpStart(obj){
		if(obj.checked==true){
			let expireDate = new Date();
			let days = 1;
			expireDate.setDate(expireDate.getDate() + days);
			document.cookie = "notShowPop=" + "true" + ";path=/; expires=" + expireDate.toGMTString();
			window.close();
		}
	}
</script>
</head>
<body>
알림 팝업창
<br><br><br><br><br><br><br><br>
<form>
	<input type="checkbox" onClick = "setPopUpStart(this)"> 오늘 더 이상 팝업창 띄우지 않기
</form>
</body>
</html>

체크박스를 체크하면 쿠키에 저장되어 새로고침을 해도 팝업창이 뜨지 않는다.

쿠키 삭제 버튼을 눌러서 쿠키를 삭제해주면 새로고침 시 팝업창이 뜬다.