- 클라이언트 측 PC에 저장되는 정보를 말한다. (클라이언트에 노출되는 만큼 보안에 취약하다)
- 웹 페이지들에서 참조해야하는 공유 정보를 저장해 두고 사용하기 위해 쿠키를 활용할 수 있다. (예시 : 아이디 저장하기, 오늘 더 이상 열지 않기 등)
- 4KB 용량 제한이 있다.
- 웹 브라우저에서 사용 유무를 설정할 수 있다.
- 웹 사이트 당 하나의 쿠키가 생성된다.
각 웹페이지의 쿠키는 F12
개발자 도구에서 확인할 수 있다.
(빼 갈 정보도 없겠지만,, 혹시모르니 살짝 가렸다.)
쿠키는 서버에서 생성하며, 서버가 만든 쿠키를 클라이언트로 전달해서 클라이언트가 저장한다. 그리고, 서버가 만든 쿠키를 클라이언트로 전달하기 위해서 response(서버→클라이언트)
를 사용한다.
쿠키는 클라이언트에 저장이 되어있다. 쿠키에 대한 정보를 확인하기 위해서는 서버에서 쿠키에 대한 정보를 받아와야 하는데 그때 request(클라이언트→서버)
를 사용한다. (이때, 클라이언트는 하나의 쿠키만 보낼 수는 없고, 모든 쿠키를 보내야 한다.)
- 쿠키이름 : 알파벳, 숫자로 만든다.
- 쿠키 값 : 공백, 콜론, 세미콜론 등 불가능한 문자가 있는 경우 인코딩해서 포함할 수 있다.
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();