반응형

 

쿠키(Cookie)

 

: 웹 서버가 생성하여 웹 브라우저로 전송하는 작은 정보 파일로 정보가 클라이언트에 저장된다.

 

웹 서버와 브라우저는 애플리케이션을 사용하는 동안 필요한 값을 쿠키를 통해 공유하여 상태를 유지한다.

ex) 오늘 하루는 열지 않음

 

 

1. 구성요소
- 이름
- 값
- 유효시간(초)
- 도메인 : ex) http://www.somehost.com, .somehost.com
- 경로 : 쿠키를 공유할 기준 경로를 지정한다. => 지정하지 않으면 실행한 URL의 경로 부분이 사용된다.


2. 동작 방식
- 쿠키 생성 단계 : 생성한 쿠키를 응답데이터의 헤더에 저장하여 전송한다.
- 쿠키 저장 단계 : 브라우저는 응답메시지에 포함된 쿠키정보를 쿠키 저장소에 보관한다.
- 쿠키 전송 단계 : 브라우저는 저장한 쿠키를 요청이 있을 때마다 웹서버에 전송한다. (삭제되기 전까지...)
웹 서버는 브라우저가 전송한 쿠키를 사용해서 필요한 작업을 수행한다.

 

 

 

쿠키 생성

 

 

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
  <display-name>ServletTest</display-name>
  
  <servlet>
  	<servlet-name>T04ServletCookieTest</servlet-name>
  	<servlet-class>kr.or.ddit.basic.T04ServletCookieTest</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>T04ServletCookieTest</servlet-name>
  	<url-pattern>/T04ServletCookieTest</url-pattern>
  </servlet-mapping>
</web-app>

 

package kr.or.ddit.basic;

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

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

public class T04ServletCookieTest extends HttpServlet{

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// 쿠키 설정(생성) 하기
		setCookieExam(req, resp);
	}
	
	private void setCookieExam(HttpServletRequest req, HttpServletResponse resp) throws IOException {
		
		req.setCharacterEncoding("UTF-8");
		
		// 쿠키 생성하기
		Cookie userId = new Cookie("userId", req.getParameter("userId"));
		
		// 한글 깨짐 방지를 위한 인코딩 처리
		Cookie name = new Cookie("name", URLEncoder.encode(req.getParameter("name"), "UTF-8"));
		
		// 쿠키 소멸시간 설정(초단위) => 지정하지 않을 시 브라우저를 종료할때 쿠키가 함께 삭제됨
		userId.setMaxAge(60 * 60* 24);
		userId.setHttpOnly(true); // javascript를 이용한 직접 접근 방지
		
		name.setMaxAge(60 * 60 * 48);
		
		///////////////////////////////////////////////////////
		
		// 응답헤더에 쿠키 추가
		resp.addCookie(userId);
		resp.addCookie(name);
		
		// 응답 헤더에 인코딩 및 Content-Type 설정
		resp.setCharacterEncoding("UTF-8");
		resp.setContentType("text/html");
		
		PrintWriter out = resp.getWriter();
		
		String title = "쿠키설정 예제";
		
		out.print("<!DOCTYPE html><html><head><title>" + title + "</title>");
		out.print("</head><body><h1 align=\"center=\">" + title + "</h1>"
					+ "<ul>"
					+ "<li><b>ID</b>: " + req.getParameter("userId") + "</li>"
					+ "<li><b>이름</b>: " + req.getParameter("name") + "</li>"
					+ "</ul></body></html>");
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doGet(req, resp);
	}
}

 

결과 화면1

 

addCookie로 인해 Set-Cookie가 추가 2개 추가됨. (userId와 name)

 

Application에서 쿠키를 생성할 때 입력한 정보들을 확인할 수 있음

 

 

 

쿠키 읽기

 

 

package kr.or.ddit.basic;

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

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

public class T04ServletCookieTest extends HttpServlet{

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// 쿠키 설정(생성) 하기
//		setCookieExam(req, resp);
		
		// 쿠키 읽어오기
		readCookieExam(req, resp);
	}
	
	private void readCookieExam(HttpServletRequest req, HttpServletResponse resp) throws IOException {
	
		// 현재 도메인에서 사용중인 쿠키정보 배열 가져오기
		Cookie[] cookies = req.getCookies();
		
		///////////////////////////////////////////////
		
		resp.setCharacterEncoding("UTF-8");
		resp.setContentType("text/html");
		
		PrintWriter out = resp.getWriter();
		
		String title = "쿠키정보 읽기 예제";
		
		out.print("<!DOCTYPE html><html><head>" + title + "</head>"
				+ "<body>");
		
		if(cookies != null) {
			out.print("<h2>" + title + "</h2>");
			
			for (Cookie cookie : cookies) {
				out.print("<p>name : " + cookie.getName() + "</p>");
				out.print("<p>value : " + URLDecoder.decode(cookie.getValue(), "UTF-8") + "</p>");
				out.print("<hr>");
			}
		} else {
			System.out.println("<h2>쿠키정보가 존재하지 않습니다.</h2>");
		}
		out.print("</body></html>");
}

	private void setCookieExam(HttpServletRequest req, HttpServletResponse resp) throws IOException {
		
		req.setCharacterEncoding("UTF-8");
		
		// 쿠키 생성하기
		Cookie userId = new Cookie("userId", req.getParameter("userId"));
		
		// 한글 깨짐 방지를 위한 인코딩 처리
		Cookie name = new Cookie("name", URLEncoder.encode(req.getParameter("name"), "UTF-8"));
		
		// 쿠키 소멸시간 설정(초단위) => 지정하지 않을 시 브라우저를 종료할때 쿠키가 함께 삭제됨
		userId.setMaxAge(60 * 60* 24);
		userId.setHttpOnly(true); // javascript를 이용한 직접 접근 방지
		
		name.setMaxAge(60 * 60 * 48);
		
		///////////////////////////////////////////////////////
		
		// 응답헤더에 쿠키 추가
		resp.addCookie(userId);
		resp.addCookie(name);
		
		// 응답 헤더에 인코딩 및 Content-Type 설정
		resp.setCharacterEncoding("UTF-8");
		resp.setContentType("text/html");
		
		PrintWriter out = resp.getWriter();
		
		String title = "쿠키설정 예제";
		
		out.print("<!DOCTYPE html><html><head><title>" + title + "</title>");
		out.print("</head><body><h1 align=\"center=\">" + title + "</h1>"
					+ "<ul>"
					+ "<li><b>ID</b>: " + req.getParameter("userId") + "</li>"
					+ "<li><b>이름</b>: " + req.getParameter("name") + "</li>"
					+ "</ul></body></html>");
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doGet(req, resp);
	}
}

 

결과 화면2

 

+ 페이지에서 쿠키 생성 및 삭제 가능

더보기
쿠키 추가

 

쿠키 삭제 : 오른쪽 마우스 클릭 후 Delete

 

 

 

쿠키 삭제

 

 

사용중인 쿠키정보를 삭제하는 방법

1. 사용중인 쿠키정보를 이용하여 쿠키객체를 생성한다.
2. 쿠키객체의 최대 지속 시간을 0으로 설정한다.
3. 설정한 쿠키객체를 응답헤더에 추가하여 전송한다. 

 

 

package kr.or.ddit.basic;

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

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

public class T04ServletCookieTest extends HttpServlet{

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// 쿠키 설정(생성) 하기
//		setCookieExam(req, resp);
		
		// 쿠키 읽어오기
//		readCookieExam(req, resp);
		
		// 쿠키 정보 삭제하기
		deleteCookieExam(req, resp);
	}
	
	private void deleteCookieExam(HttpServletRequest req, HttpServletResponse resp) throws IOException {
		
		Cookie[] cookies = req.getCookies();
		
		////////////////////////////////////////
		
		resp.setCharacterEncoding("UTF-8");
		resp.setContentType("text/html");
		
		PrintWriter out = resp.getWriter();
		
		String title = "쿠키 삭제 예제";
		
		out.print("<!doctype html><html><head><title>" + title + "</title>"
					+"<body>");
		
		if(cookies != null) {
			out.print("<h2>" + title + "</h2>");
			
			for (Cookie cookie : cookies) {
				if(cookie.getName().equals("userId")) {
					// 쿠키 제거하기
					cookie.setMaxAge(0);
					resp.addCookie(cookie);
					out.print("삭제한 쿠키 : " + cookie.getName() + "<br>");
				}
				
				out.print("<p>name : " + cookie.getName() + "</p>");
				out.print("<p>value : " + URLDecoder.decode(cookie.getValue(), "UTF-8") + "</p>");
				out.print("<hr>");
			}
		} else {
			System.out.println("<h2>쿠키정보가 존재하지 않습니다.</h2>");
		}
		out.print("</body></html>");
	}

	private void readCookieExam(HttpServletRequest req, HttpServletResponse resp) throws IOException {
	
		// 현재 도메인에서 사용중인 쿠키정보 배열 가져오기
		Cookie[] cookies = req.getCookies();
		
		///////////////////////////////////////////////
		
		resp.setCharacterEncoding("UTF-8");
		resp.setContentType("text/html");
		
		PrintWriter out = resp.getWriter();
		
		String title = "쿠키정보 읽기 예제";
		
		out.print("<!DOCTYPE html><html><head>" + title + "</head>"
				+ "<body>");
		
		if(cookies != null) {
			out.print("<h2>" + title + "</h2>");
			
			for (Cookie cookie : cookies) {
				out.print("<p>name : " + cookie.getName() + "</p>");
				out.print("<p>value : " + URLDecoder.decode(cookie.getValue(), "UTF-8") + "</p>");
				out.print("<hr>");
			}
		} else {
			System.out.println("<h2>쿠키정보가 존재하지 않습니다.</h2>");
		}
		out.print("</body></html>");
}

	private void setCookieExam(HttpServletRequest req, HttpServletResponse resp) throws IOException {
		
		req.setCharacterEncoding("UTF-8");
		
		// 쿠키 생성하기
		Cookie userId = new Cookie("userId", req.getParameter("userId"));
		
		// 한글 깨짐 방지를 위한 인코딩 처리
		Cookie name = new Cookie("name", URLEncoder.encode(req.getParameter("name"), "UTF-8"));
		
		// 쿠키 소멸시간 설정(초단위) => 지정하지 않을 시 브라우저를 종료할때 쿠키가 함께 삭제됨
		userId.setMaxAge(60 * 60* 24);
		userId.setHttpOnly(true); // javascript를 이용한 직접 접근 방지
		
		name.setMaxAge(60 * 60 * 48);
		
		///////////////////////////////////////////////////////
		
		// 응답헤더에 쿠키 추가
		resp.addCookie(userId);
		resp.addCookie(name);
		
		// 응답 헤더에 인코딩 및 Content-Type 설정
		resp.setCharacterEncoding("UTF-8");
		resp.setContentType("text/html");
		
		PrintWriter out = resp.getWriter();
		
		String title = "쿠키설정 예제";
		
		out.print("<!DOCTYPE html><html><head><title>" + title + "</title>");
		out.print("</head><body><h1 align=\"center=\">" + title + "</h1>"
					+ "<ul>"
					+ "<li><b>ID</b>: " + req.getParameter("userId") + "</li>"
					+ "<li><b>이름</b>: " + req.getParameter("name") + "</li>"
					+ "</ul></body></html>");
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doGet(req, resp);
	}
}

 

결과 화면3

 

결과 화면4 : 새로고침 시 하나가 사라짐

 

 

반응형