본문 바로가기
☕ Java 웹 프로그래밍/Servlet & JSP

[Servlet&JSP] Cookie의 maxAge 옵션: 브라우저와 상관없이 설정한 기간 동안 쿠키 유지

by 일단연 2023. 6. 1.

* 본 글은 [뉴렉처]의 Servlet&JSP 프로그래밍 강의를 듣고 정리한 글입니다.

 

2020 Servlet&JSP 프로그래밍

 

www.youtube.com

 

 Cookie의 maxAge 옵션: 브라우저와 상관없이 설정한 기간 동안 쿠키 유지 

쿠키는 브라우저가 닫혀도 유효할까?

  • 쿠키에 maxAge 옵션을 설정하지 않으면 브라우저의 생존주기와 같아짐
    • 브라우저가 메모리 상에 쿠키를 갖고 있다가 브라우저가 닫히면 쿠키가 사라진다는 의미
  • But, maxAge 옵션으로 원하는 기간을 설정하면 브라우저가 닫히고 클라이언트의 컴퓨터가 꺼져도 그 기간 내에는 쿠키를 계속 유지하고, 요청이 오면 쿠키 영구 저장소에서 쿠키를 읽어옴

 

브라우저가 쿠키를 저장하는 공간

  • 쿠키는 기본적으로 브라우저의 메모리에 존재
  • maxAge 옵션으로 기간을 설정하면 쿠키는 영구 저장소라고 할 수 있는 외부 파일에 저장됨
    • 브라우저와 상관없이 그 기간 동안은 존재해야 하니까
    • 해당 파일 경로로 접속하면 쿠키를 찾아볼 수 있음
  • Internet Explorer의 쿠키 영구 저장소 경로

Internet Explorer의 쿠키 영구 저장소 경로

 

maxAge 옵션 설정하기

  • Browser에 쿠키를 전달한 시간부터 만료시간까지 쿠키를 외부 파일에 저장해 그 기간 동안 브라우저와 상관없이 쿠키 사용 가능
  • 형태
    • 쿠키객체명.setMaxAge(만료날짜);
    • 만료 날짜는 초 단위로 설정되어 있음
  • 예시
    • valueCookie.setMaxAge(60*60); > 60분 동안 쿠키 존재
    • valueCookie.setMaxAge(246060); > 24시간(하루) 동안 쿠키 존재

 

maxAge 옵션 설정하기 예시

Cookie valueCookie = new Cookie("value", String.valueOf(v));
Cookie opCookie = new Cookie("op", op);
valueCookie.setPath("/calc2");
valueCookie.setMaxAge(24*60*60);
opCookie.setPath("/calc2");
response.addCookie(valueCookie);
response.addCookie(opCookie);
  • value에만 maxAge 옵션 설정: 하루 동안 쿠키 유지하기
  • op에는 maxAge 옵션 설정하지 않음
  • 결과
    • 브라우저를 껐다 켜면, value의 쿠키만 남아있고 SID와 op의 쿠키는 제거됨

 

maxAge 옵션을 설정한 Cookie 사용하는 서블릿과 HTML

  • Calc2.java
package com.newlecture.web;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/calc2")
public class Calc2 extends HttpServlet {
  @Override
  protected void service(HttpServletRequest request
                        , HttpServletResponse response)
                        throws ServletException, IOException
  {
    ServletContext application = request.getServletContext();
    HttpSession session = request.getSession();
    Cookie[] cookies = request.getCookies();
		
    //response의 인코딩 방식 지정
    response.setContentType("text/html; charset=UTF-8");
    response.setCharacterEncoding("UTF-8");
		
    PrintWriter out = response.getWriter();
		
    String v_ = request.getParameter("v");
    String op = request.getParameter("operator");
		
    //기본값 처리
    int v = 0;
    if(!v_.equals("")) {v = Integer.parseInt(v_);}
		
    //값을 계산
    if(op.equals("=")) {
//    int x = (Integer)application.getAttribute("value");

      int x = 0;
      for(Cookie c : cookies) {
        if(c.getName().equals("value")) {
          x = Integer.parseInt(c.getValue());
          break;
        }
      }

      int y = v;
//    String operator = (String)application.getAttribute("op");
			
      String operator = "";
      for(Cookie c : cookies) {
        if(c.getName().equals("op")) {
          operator = c.getValue();
          break;
        }
      }

      int result = 0;
			
      if(operator.equals("+")) {
        result = x + y;
      } else {
        result = x - y;
      }
      response.getWriter().printf("계산 결과는 %d\\n", result);
    }
    //값을 저장
    else {
//    application.setAttribute("value", v);
//    application.setAttribute("op", op);
    
//    session.setAttribute("value", v);
//    session.setAttribute("op", op);

      Cookie valueCookie = new Cookie("value", String.valueOf(v));
      Cookie opCookie = new Cookie("op", op);
      valueCookie.setPath("/calc2");
      valueCookie.setMaxAge(24*60*60);
      opCookie.setPath("/calc2");
      response.addCookie(valueCookie);
      response.addCookie(opCookie);
    }
  }
}
  • calc2.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>계산기 웹 프로그램</title>
</head>
<body>
  <form action="calc2" method="post">
    <div>
      <p>계산할 값을 입력하세요.</p>
    </div>
    <div>
      <label>입력 : </label>
      <input type="text" name="v"/>
    </div>
    <div>
      <input type="submit" name="operator" value="+">
      <input type="submit" name="operator" value="-">
      <input type="submit" name="operator" value="=">
		</div>
  </form>
</body>
</html>