[ JSP ] 쿠키(Cookie) 생성하고 사용하기

duck-ach·2022년 10월 19일
0

JSP

목록 보기
9/14

Cookie 란?

  • 클라이언트 측 PC에 저장되는 정보를 말한다. (클라이언트에 노출되는 만큼 보안에 취약하다)
  • 웹 페이지들에서 참조해야하는 공유 정보를 저장해 두고 사용하기 위해 쿠키를 활용할 수 있다. (예시 : 아이디 저장하기, 오늘 더 이상 열지 않기 등)
  • 4KB 용량 제한이 있다.
  • 웹 브라우저에서 사용 유무를 설정할 수 있다.
  • 웹 사이트 당 하나의 쿠키가 생성된다.

각 웹페이지의 쿠키는 F12 개발자 도구에서 확인할 수 있다.

(빼 갈 정보도 없겠지만,, 혹시모르니 살짝 가렸다.)

Cookie 저장

쿠키는 서버에서 생성하며, 서버가 만든 쿠키를 클라이언트로 전달해서 클라이언트가 저장한다. 그리고, 서버가 만든 쿠키를 클라이언트로 전달하기 위해서 response(서버→클라이언트)를 사용한다.

Cookie 확인

쿠키는 클라이언트에 저장이 되어있다. 쿠키에 대한 정보를 확인하기 위해서는 서버에서 쿠키에 대한 정보를 받아와야 하는데 그때 request(클라이언트→서버)를 사용한다. (이때, 클라이언트는 하나의 쿠키만 보낼 수는 없고, 모든 쿠키를 보내야 한다.)

Cookie 만들기

  • 쿠키이름 : 알파벳, 숫자로 만든다.
  • 쿠키 값 : 공백, 콜론, 세미콜론 등 불가능한 문자가 있는 경우 인코딩해서 포함할 수 있다.

setMaxAge() : 쿠키의 유효시간을 설정할 수 있는 메소드다.
ex) setMaxAge(10) : 10초간 유효한 쿠키


이클립스에서 서블릿(Servlet)을 생성하여 쿠키를 만들어보자.

쿠키 서블릿 1

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

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("/CookieServlet1")
public class CookieServlet1 extends HttpServlet {
	private static final long serialVersionUID = 1L;
         
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		Cookie cookie1 = new Cookie("name", "newjeans");
		Cookie cookie2 = new Cookie("lyrics", URLEncoder.encode("내가만든쿠키", "UTF-8"));
		
		// 쿠키 유효시간 설정
		cookie1.setMaxAge(60 * 60 * 24 * 15); // 15일간 유효한 쿠키
		cookie2.setMaxAge(10); // 10초간 유효한 쿠키
		
		// 클라이언트 PC에 쿠키 저장하기
		response.addCookie(cookie1);
		response.addCookie(cookie2);
		
		// 리다이렉트
response.sendRedirect("/01_Servlet/CookieServlet2");
	}

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

}


이렇게 쿠키가 생성되고, setMaxAge()를 설정해 준 만큼 쿠키가 유효하다.

쿠키 서블릿 2

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

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("/CookieServlet2")
public class CookieServlet2 extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		
		// 1. 응답 타입 및 응답 스트림
			response.setContentType("text/html; charset=UTF-8");
			PrintWriter out = response.getWriter();
				
		// 2. 전체 쿠키 가져오기
		// 클라이언트는 하나의 쿠키만 보낼 수는 없고 모든 쿠키를 보내야 하기 때문에 배열로 처리
			Cookie[] cookies = request.getCookies();
				
		// 3. 전체 쿠키 확인
			if(cookies != null) {
				for(int i = 0; i < cookies.length; i++) {
					out.println("<h1>쿠키이름 : " + cookies[i].getName() + "</h1>");
					out.println("<h1>쿠키값 : " + URLDecoder.decode(cookies[i].getValue(), "UTF-8") + "</h1>");
				}
			}
				
		// 4. 특정 쿠키만 확인
			if(cookies != null) {
				for(int i = 0; i < cookies.length; i++) {
					if(cookies[i].getName().equals("name")) {
						out.println("<h1>쿠키이름 : " + cookies[i].getName() + "</h1>");
						out.println("<h1>쿠키값 : " + URLDecoder.decode(cookies[i].getValue(), "UTF-8") + "</h1>");				
					}
				}
			}
				
		// 5. 응답
			out.println("<a href=\"/01_Servlet/CookieServlet3\">이동</a>");
			out.close();
		
	}


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

		doGet(request, response);
	}

}

쿠키 수정하기

같은 이름의 쿠키를 만들어서 덮어쓰기 하면된다.

Cookie cookie1 = new Cookie("lyrics", URLEncoder.encode("너에게는 독이지", "UTF-8")); 
cookie1.setMaxAge(60); // 기존 10초에서 60초로 수정
response.addCookie(cookie1);

쿠키 삭제하기

같은 이름의 쿠키를 만들어서 유효시간을 0으로 설정하고 덮어쓰기

Cookie cookie2 = new Cookie("name", "");
cookie2.setMaxAge(0);
response.addCookie(cookie2);
out.println("<script>");
out.println("location.href='/01_Servlet/CookieServlet2");
out.println("</script>");
out.close();
profile
자몽 허니 블랙티와 아메리카노 사이 그 어딘가

0개의 댓글