Cookie

dev_hnbm·2023년 12월 20일
0

대덕인재개발원

목록 보기
25/30

🍪 Cookie

웹 브라우저와 웹 서버 간에 정보를 교환하는 작은 데이터 조각. 이 데이터는 사용자의 웹 브라우저에 저장되어 웹 사이트 간의 세션 상태를 유지한다. 쿠키는 일반적으로 텍스트 형식으로 되어 있으며, 사용자가 특정 웹 사이트를 방문할 때 생성되고 해당 웹 사이트와 사용자 간의 상호 작용에서 발생한 정보를 기록한다.

쿠키 정보 저장하기

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

쿠키 정보 읽어오기

  1. 전체 쿠키 정보를 Request 객체를 통해 가져옴
    가져온 쿠키들은 배열에 저장된다.
    Cookie[] 배열변수 = Request객체.getCookies();
  2. 배열에서 해당 쿠키 정보를 구해옴

쿠키 삭제하기

해당 쿠키의 유지 시간을 0으로 설정하는 방법을 사용한다. (전체 쿠키 정보 가져오기 -> 쿠키 배열에서 삭제할 쿠키 정보 찾기 -> 유지 시간을 0으로 설정 후 다시 저장)

예제

예제를 위한 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>

쿠키 저장

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 CookieAdd 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 nameCookie = new Cookie("name", "홍길동");
		Cookie ageCookie = new Cookie("age", "30");
		Cookie ageCookie2 = new Cookie("age", 30 + "");
		Cookie ageCookie3 = new Cookie("age", String.valueOf(30));
		Cookie genderCookie = new Cookie("gender", "Male");
		
		response.addCookie(nameCookie);
		response.addCookie(ageCookie);
		response.addCookie(genderCookie);
		
		out.println("<html>");
		out.println("<head><meta charset='utf-8'><title>쿠키 저장 연습</title></head>");
		out.println("<body>");
		out.println("<h3>Cookie 데이터가 저장되었습니다.</h3><br><hr>");
		out.println("<a href='" + request.getContextPath() 
					+ "/basic/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);
	}

}

쿠키 읽기

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 CookieRead 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>쿠키 읽기 연습</title></head>");
		out.println("<body>");
		out.println("<h3>저장된 Cookie 데이터 확인하기</h3><br>");
		
		
		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() 
					+ "/basic/cookie/cookieTest01.jsp'>시작 문서로 이동하기</a>");
		out.println("</body></html>");
	}

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

}

쿠키 삭제

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("/cookieDelete.do")
public class CookieDelete 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();
		
		if(cookieArr != null) {
			for(Cookie cookie : cookieArr) {
				String name = cookie.getName();
				if("gender".equals(name)) {
					cookie.setMaxAge(0);
					response.addCookie(cookie);
				}
			}
		}
		
		out.println("<html>");
		out.println("<head><meta charset='utf-8'><title>쿠키 삭제 연습</title></head>");
		out.println("<body>");
		out.println("<h3>저장된 Cookie 데이터 삭제하기</h3><br>");
		out.println("<a href='" + request.getContextPath() 
					+ "/basic/cookie/cookieTest01.jsp'>시작 문서로 이동하기</a>");
		out.println("</body></html>");
		
	}

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

}

과제 1


jsp

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

CookieCountServlet.do

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("/cookieCountServlet.do")
public class CookieCountServlet 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");
				
		Cookie[] cookieArr = request.getCookies();
		int count = 0;
		if(cookieArr != null) {
			for(Cookie cookie : cookieArr) {
				String name = cookie.getName();
				if("count".equals(name)) {
					count = Integer.parseInt(cookie.getValue());
				}
			}
		}
		count++;
		
		// 증가된 카운트 값이 저장된 Cookie 객체 생성
		Cookie countCookie = new Cookie("count", String.valueOf(count)); 
		// 생성된 Cookie 객체를 클라이언트로 보내서 저장
		response.addCookie(countCookie);
		
		PrintWriter out = response.getWriter();
		out.println("<html>");
		out.println("<head><meta charset='utf-8'><title>Cookie Count 연습</title></head>");
		out.println("<body>");
		out.println("<h2>어서오세요. 당신은 " + count + "번째 방문입니다.</h2><br>");
		out.println("<a href='" + request.getContextPath() +"/cookieCountServlet.do'>카운트 증가하기</a>");
		out.println("<a href='" + request.getContextPath() +"/basic/cookie/cookieTest02.jsp'>시작 문서로 이동하기</a>");
		out.println("</body></html>");
	}

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

}

CookieCountDelServlet.do

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("/cookieCountDelServlet.do")
public class CookieCountDelServlet 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");		
		
		Cookie[] cookieArr = request.getCookies();
		
		if(cookieArr != null) {
			for(Cookie cookie : cookieArr) {
				String name = cookie.getName();
				if("count".equals(name)) {
					cookie.setMaxAge(0);
					response.addCookie(cookie);
				}
			}
		}
		
		PrintWriter out = response.getWriter();
		out.println("<html>");
		out.println("<head><meta charset='utf-8'><title>Cookie Count 연습</title></head>");
		out.println("<body>");
		out.println("<h2>카운트가 초기화 되었습니다.</h2><br>");
		out.println("<a href='" + request.getContextPath() +"/basic/cookie/cookieTest02.jsp'>시작 문서로 이동하기</a>");
		out.println("</body></html>");
		
	}

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

}

과제 2

cookieMain.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>
	<h2>Cookie 연습용 Main 페이지</h2>
	<a href="<%=request.getContextPath() %>/basic/cookie/cookieLogin.jsp">Login 페이지로 이동</a>
</body>
</html>

cookieLogin.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>
<%
String cookieLoginId = "";
String chk = "";

Cookie[] cookieArr = request.getCookies();
if(cookieArr != null) {
	for(Cookie cookie : cookieArr) {
		if("USERID".equals(cookie.getName())) { // 쿠키 이름 존재 여부
			cookieLoginId = cookie.getValue();
			chk = "checked";
		}
	}
}
%>
<body>
	<form action="<%=request.getContextPath() %>/cookieLoginServlet.do" method="post">
		<table>
			<tr>
				<td>ID: </td>
				<td><input type="text" name="userid" value="<%=cookieLoginId %>" placeholder="ID 입력"></td>
			</tr>
			<tr>
				<td>PASS: </td>
				<td><input type="password" name="pass" placeholder="PassWord 입력"></td>
			</tr>
			<tr>
				<td colspan="2">
					<input type="checkbox" name="idchk" value="check" <%=chk %>>ID 기억하기
				</td>
			</tr>
			<tr>
				<td colspan="2" style="text-align: center;">
					<input type="submit" value="login">
				</td>
			</tr>
		</table>
	</form>
</body>
</html>

cookieLoginServlet.do

package kr.or.ddit.cookie;

import java.io.IOException;
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("/cookieLoginServlet.do")
public class CookieLoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setCharacterEncoding("utf-8");
		response.setContentType("text/html; charset=utf-8");

		String userid = request.getParameter("userid");
		String pass = request.getParameter("pass");
		String idchk = request.getParameter("idchk");
		
		// userid 값을 저장할 쿠키 객체 생성
		Cookie idCookie = new Cookie("USERID", userid);
		
		// 체크박스의 체크 여부에 따라 쿠키를 저장하거나 삭제
		if(idchk == null) idCookie.setMaxAge(0); // 체크 X → 쿠키 삭제
		
		response.addCookie(idCookie);
		
		if("test".equals(userid) && "1234".equals(pass)) { // 로그인 성공
			response.sendRedirect(request.getContextPath() + "/basic/cookie/cookieMain.jsp");
		} else { // 로그인 실패
			response.sendRedirect(request.getContextPath() + "/basic/cookie/cookieLogin.jsp");			
		}
	}

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

}

0개의 댓글