JAVA/HIGH JAVA

[JAVA] 쿠키(Cookie)

아잠만_ 2024. 5. 30. 12:27

데이터를 저장할 수 있는 공간

더보기

화면에 보여주는 데이터를 다 보여주고 나면 서버와 접속이 끊어짐

링크를 눌렀을 때 해당하는 서버로 가서 데이터를 가져오고 나서 다시 접속이 끊어짐

사용자가 요청 > 시스템이 웹서버를 가져옴 > 클라이언트에게 보냄 (응답) > 연결이 끊김
쿠키 (Cookie) 세션 (HttpSession)
클라이언트 쪽에 저장
(웹브라우저에 저장)
서버에 저장
문자열만 저장 객체, 문자, 숫자 등
원하는 자료형으로 저장 가능

쿠키(Cookie)

저장

  1. Cookie객체를 생성한다. 
    ==> '쿠키이름'과 '쿠키값'을 지정해서 생성한다
            ('쿠키이름'과 '쿠키값'은 문자열로 지정한다)
    형식) Cookie cookie변수 = new Cookie("쿠키이름", "쿠키값");
    • 쿠키값으로 한글을 사용할 경우에는  URLEncoder.encode()메서드로 인코딩한 후에 저장한다.
    • 하나의 쿠키는 4KB(4096byte)까지 저장 가능하다.
    • 하나의 도메인 당 20개(총 300개)까지 저장 가능하다.
  2. 쿠키 속성 설정
    • cookie변수.setPath("적용경로"); 
             지정한 경로와 그 하위 경로에서만 사용 가능하다
             생략하면 쿠키를 설정할 당시 경로가 설정된다
    • cookie변수.setMaxAge(유지시간);
             단위(초)
       -1 : 브라우저가 종료될 때까지 유지 (기본값)
       0 : 즉시 해당 쿠키가 삭제된다.
    • cookie변수.setDomain("적용도메인명")
             지정한 도메인명에서 사용이 가능하다
      예) "ddit.or.kr"라면
      http://www.ddit.or.kr | mail.ddit.or.kr같은 곳에서 사용 가능
    • cookie변수.setSecure(보안여부)
            true(적용), false(미적용)
  3. Response객체를 이용하여 쿠키를 웹브라우저로 보내면 웹브라우저가 이 쿠키를 받아서 저장한다
    형식) Response객체.addCookie(1번에서 만든 쿠키 객체)

읽기

  1. 전체 쿠키 정보를 Request 객체를 이용하여 가져온다
    ==> 가져온 쿠키 정보들은 배열에 저장된다
    형식) Cookie[] 쿠키배열변수 = Request객체.getCookies();
  2. 쿠키 배열에서 해당 쿠키 정보를 구해온다
    1. cookie객체.getName()
      쿠키이름
    2. cookie객체.getValue()
      쿠키값

삭제

  1. 쿠키 데이터의 삭제는 쿠키의 유지시간을 0으로 설정하는 방법을 사용한다.
    삭제할 쿠키를 찾아서 해당 쿠키의 유지시간을 0으로 설정한 후 다시 저장하면 된다.
    쿠키이름이 'gender'인 쿠키 삭제하기
  2. 쿠키 배열에서 해당 쿠키 정보를 구해온다
    cookie객체.getName()
  3. 쿠키이름이 삭제할 쿠키인지 검사한다
    1. 방법 1: 찾은 쿠키의 유지시간을 0으로 설정한 후 다시 저장하기
      cookie.setMaxAge(0);
      response.addCookie(cookie);
    2. 방법 2: 쿠키 이름을 삭제할 쿠키이름과 같은 Cookie객체를 생성하고
      생성된 쿠키의 유지시간을 0으로 설정한 후 저장하기
      Cookie delCookie = new Cookie("gender", "..");
      delCookie.setMaxAge(0);
      response.addCookie(delCookie);

예시(저장/읽기/삭제)

JSP

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Cookie 연습</title>
</head>
<body>
<a href="<%=request.getContextPath()%>/cookieAdd.do">Cookie 정보 저장하기</a><br><br>
<a href="<%=request.getContextPath()%>/cookieRead.do">Cookie 정보 읽어오기</a><br><br>
<a href="<%=request.getContextPath()%>/cookieDelete.do">Cookie 정보 삭제하기</a><br><br>
</body>
</html>

CookieAdd 저장

package kr.or.ddit.cookie;

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("/cookieAdd.do")
public class CookieAddTest extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setCharacterEncoding("utf-8");
		response.setContentType("text/html; charset=utf-8");
		
		PrintWriter out = response.getWriter();
		
		// Cookie 저장하는 방법
		// 1. Cookie객체를 생성한다. ==> '쿠키이름'과 '쿠키값'을 지정해서 생성한다
		//		('쿠키이름'과 '쿠키값'은 문자열로 지정한다)
		// 형식) Cookie cookie변수 = new Cookie("쿠키이름", "쿠키값");
		// ==> 쿠키값으로 한글을 사용할 경우에는  URLEncoder.encode()메서드로
		//     인코딩한 후에 저장한다.
		// ==> 하나의 쿠키는 4KB(4096byte)까지 저장 가능하다.
		// ==> 하나의 도메인 당 20개(총 300개)까지 저장 가능하다.
		
		Cookie nameCookie = new Cookie("name", "오리");
		Cookie ageCookie = new Cookie("age", "20");
		Cookie genderCookie = new Cookie("gender", "Male");
		
		// 2. 쿠키 속성 설정
		/*
		 cookie변수.setPath("적용경로"); ==> 지정한 경로와 그 하위 경로에서만 사용 가능하다
		 							 ==> 생략하면 쿠키를 설정할 당시 경로가 설정된다
		 cookie변수.setMaxAge(유지시간); ==> 단위(초),
		 					==> 유지시간이 -1일 경우(기본값) 브라우저가 종료될 때까지 유지
		 					    0 : 즉시 해당 쿠키가 삭제된다.
		 cookie변수.setDomain("적용도메인명")
		 				지정한 도메인명에서 사용이 가능하다
		 			==> 예) "ddit.or.kr" ==> www.ddit.or.kr
		 								==> mail.ddit.or.kr
		 cookie변수.setSecure(보안여부)
		 			true(적용), false(미적용)
		 */
		
		// 3. Response객체를 이용하여 쿠키를 웹브라우저로 보내면 웹브라우저가 이 쿠키를
		//	받아서 저장한다
		//	형식) Response객체.addCookie(1번에서 만든 쿠키 객체)
		response.addCookie(nameCookie);
		response.addCookie(ageCookie);
		response.addCookie(genderCookie);
		
		out.println("<html>");
		out.println("<head><meta charset='utf-8'><title>Cookie 저장 연습</title></head>");
		out.println("<body>");
		out.println("<h3>Cookie 데이터가 저장되었습니다</h3>");
		out.println("<br><hr><br>");
		out.println("<a href='"+ request.getContextPath()
			+"/cookie/cookieTest01.jsp'>시작문서로 이동</a>");
		out.println("</body></html>");
		
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}
}

CookieRead 읽기

package kr.or.ddit.cookie;

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("/cookieRead.do")
public class CookieReadTest 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.setCharacterEncoding("utf-8");
		response.setContentType("text/html; charset=utf-8");
		
		PrintWriter out = response.getWriter();
		
		// 저장된 쿠키 읽어오기
		
		
		// 1. 전체 쿠키 정보를 Request 객체를 이용하여 가져온다
		//			==> 가져온 쿠키 정보들은 배열에 저장된다
		// 형식) Cookie[] 쿠키배열변수 = Request객체.getCookies();
		Cookie[] cookieArr = request.getCookies();
		
		out.println("<html>");
		out.println("<head><meta charset='utf-8'><title>Cookie 읽기 연습</title></head>");
		out.println("<body>");
		
		out.println("<h3>저장된 Cookie데이터 확인하기</h3>");
		out.println("<hr color='teal'>");
		
		if(cookieArr==null || cookieArr.length==0) {
			out.println("<h3>저장된 Cookie가 없습니다</h3>");
		} else {
			// 2. 쿠키 배열에서 해당 쿠키 정보를 구해온다
			for(Cookie cookie : cookieArr) {
				String name = cookie.getName(); // '쿠키이름' 구하기
				String value = cookie.getValue(); // '쿠키값' 구하기
				out.println("쿠키이름 : "+name+"<br>");
				out.println("쿠키값 : "+value+"<hr>");
			}
		}
		
		out.println("<a href='"+ request.getContextPath()
			+"/cookie/cookieTest01.jsp'>시작문서로 이동</a>");
		out.println("</body></html>");
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

CookieDelete 삭제

package kr.or.ddit.cookie;

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;

/**
 * Servlet implementation class CookieDeleteTest
 */
@WebServlet("/cookieDelete.do")
public class CookieDeleteTest extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setCharacterEncoding("utf-8");
		response.setContentType("text/html; charset=utf-8");
		
		PrintWriter out = response.getWriter();
		// 쿠키 삭제하기
		
		// 1. 쿠키 데이터의 삭제는 쿠키의 유지시간을 0으로 설정하는 방법을 사용한다.
		//		삭제할 쿠키를 찾아서 해당 쿠키의 유지시간을 0으로 설정한 후 다시 저장하면 된다.
		//	쿠키이름이 'gender'인 쿠키 삭제하기
		Cookie[] cookieArr = request.getCookies();
		
		out.println("<html>");
		out.println("<head><meta charset='utf-8'><title>Cookie 삭제 연습</title></head>");
		out.println("<body>");
		
		out.println("<h3>저장된 Cookie데이터 삭제하기</h3>");
		out.println("<hr color='teal'>");
		
		if(cookieArr==null || cookieArr.length==0) {
			out.println("<h3>저장된 Cookie가 없습니다</h3>");
		} else {
			// 2. 쿠키 배열에서 해당 쿠키 정보를 구해온다
			for(Cookie cookie : cookieArr) {
				String name = cookie.getName(); // '쿠키이름' 구하기
				
				// 쿠키이름이 삭제할 쿠키인지 검사한다
				if("gender".equals(name)) {
					// 방법 1: 찾은 쿠키의 유지시간을 0으로 설정한 후 다시 저장하기
					cookie.setMaxAge(0);
					response.addCookie(cookie);
					
					// 방법 2: 쿠키 이름을 삭제할 쿠키이름과 같은 Cookie객체를 생성하고
					//		생성된 쿠키의 유지시간을 0으로 설정한 후 저장하기
//					Cookie delCookie = new Cookie("gender", "..");
//					delCookie.setMaxAge(0);
//					response.addCookie(delCookie);
					
				}
			}
		}
		
		out.println("<a href='"+ request.getContextPath()
			+"/cookie/cookieTest01.jsp'>시작문서로 이동</a>");
		out.println("</body></html>");
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

문제

JSP

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Cookie 연습</title>
</head>
<body>
<a href="<%=request.getContextPath()%>/cookieCountServlet.do">Cookie Count 증가하기</a><br><br>
<a href="<%=request.getContextPath()%>/cookieCountDelServlet.do">Cookie Count 초기화 하기</a><br><br>
</body>
</html>

CountAdd

package kr.or.ddit.cookie;

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;

/**
 * Servlet implementation class CookieCountTest
 */
@WebServlet("/cookieCountServlet.do")
public class CookieCountTest extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setCharacterEncoding("utf-8");
		response.setContentType("text/html; charset=utf-8");
		PrintWriter out = response.getWriter();
		
		int cnt = 1;
		
		Cookie[] cookieArr = request.getCookies();
		
		if(cookieArr!=null) {
			for(Cookie co: cookieArr) {
				String name = co.getName();
				
				if(name.equals("cnt")) {
					// 만약 쿠키값이 없으면 0
					cnt = Integer.parseInt(co.getValue());
					// 찾았다면 for문을 끝냄
					break;
				}
			}
		}
		Cookie cntCookie = new Cookie("cnt", String.valueOf(++cnt));
		response.addCookie(cntCookie);
		
		out.println("<html>");
		out.println("<head><meta charset='utf-8'><title>Cookie count 증가/title></head>");
		out.println("<body>");
		
		out.println("<h3>어서오세요. 당신은 "+cnt+"번째 방문입니다</h3>");
		out.println("<hr color='teal'>");
		
		out.println("<a href='"+ request.getContextPath()
		+"/cookieCountServlet.do'>카운트 증가하기</a>");
		out.println("<a href='"+ request.getContextPath()
			+"/cookie/cookieTest02.jsp'>시작문서로 이동</a>");
		out.println("</body></html>");
		
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

CountDel

package kr.or.ddit.cookie;

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;

/**
 * Servlet implementation class CookieCountDeltTest
 */
@WebServlet("/cookieCountDelServlet.do")
public class CookieCountDeltTest extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setCharacterEncoding("utf-8");
		response.setContentType("text/html; charset=utf-8");
		
		PrintWriter out = response.getWriter();
		
		Cookie[] cookieArr = request.getCookies();
		
		out.println("<html>");
		out.println("<head><meta charset='utf-8'><title>Cookie 초기화itle></head>");
		out.println("<body>");
		
		out.println("<h3>count가 초기화되었습니다</h3>");
		out.println("<hr color='teal'>");
		if(cookieArr==null || cookieArr.length==0) {
			out.println("<h3>저장된 Cookie가 없습니다</h3>");
		} else {
			for(Cookie cookie : cookieArr) {
				String name = cookie.getName(); // '쿠키이름' 구하기
				// 쿠키이름이 삭제할 쿠키인지 검사한다
				if("cnt".equals(name)) {
					// 방법 1: 찾은 쿠키의 유지시간을 0으로 설정한 후 다시 저장하기
					cookie.setMaxAge(0);
					response.addCookie(cookie);
					break;
				}
			}
		}
		
		out.println("<a href='"+ request.getContextPath()
			+"/cookie/cookieTest02.jsp'>시작문서로 이동</a>");
		out.println("</body></html>");
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}