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

[Servlet&JSP] Cookie의 path 옵션: 해당 path 요청일 때만 쿠키 읽기

by 일단연 2023. 6. 1.

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

 

2020 Servlet&JSP 프로그래밍

 

www.youtube.com

 

 Cookie의 path 옵션: 해당 path 요청일 때만 쿠키 읽기 

Cookie의 path 옵션

  • 쿠키는 페이지마다 다름
    • 특정 서블릿 or 특정 범주 안에 있는 서블릿에 올 때만 가져오는 쿠키
  • 서버가 보낸 응답을 브라우저가 저장하도록 서블릿에서 쿠키를 설정할 때 URL을 설정할 수 있음 > setPath( )메소드 사용
  • 비효율적으로 쿠키가 여러 가지 값을 전달하거나 쿠키 이름이 충돌나는 경우를 방지할 수 있음

 

Cookie의 path 옵션 사용하기

  • 쿠키객체명.setPath(”path”);
    • 해당 path로 요청될 때만 해당 쿠키를 가져와라
    • path(인자로 들어가는 값): 어느 경우에 브라우저에 저장된 쿠키가 서버에게 읽혀야 하는지를 결정하는 경로
    • 쿠키객체명.setPath(”/”);
      • 어떤 서비스를 요청하든 쿠키가 무조건 서버로 전달됨
    • 쿠키객체명.setPath(”/calc2”);
      • path가 calc2인 요청에 대해서만 쿠키가 서버로 전달됨
    • 쿠키객체명.setPath(”/notice/”);
      • notice 디렉토리 안에 있는 서비스를 요청할 때만 쿠키가 서버로 전달됨
  • path 옵션을 사용한 코드
Cookie valueCookie = new Cookie("value", String.valueOf(v));
Cookie opCookie = new Cookie("op", op);
valueCookie.setPath("path");
opCookie.setPath("path");
response.addCookie(valueCookie);
response.addCookie(opCookie);

 

Cookie의 path 옵션 사용하기 예시

  • setPath(”path”)에서 path를 /로 설정
    • /로 요청이 오면 쿠키를 저장하라는 의미
Cookie valueCookie = new Cookie("value", String.valueOf(v));
Cookie opCookie = new Cookie("op", op);
valueCookie.setPath("/");
opCookie.setPath("/");
response.addCookie(valueCookie);
response.addCookie(opCookie);

 

 

Cookie의 path 옵션 사용하기 결과

  • value로 3, op로 + 입력 후 개발자 도구 > Response Headers 확인
    • Response Headers: 서버가 클라이언트에게 돌려주는 메타데이터
    • path가 /로 설정되어 있음
    • 서버가 addCookie( )메소드를 사용해 응답 값으로 전달한 value와 op 쿠키를, 클라이언트가 저장했음

Cookie의 path 옵션 사용하기 결과 -  3과 + 입력
Cookie의 path 옵션 사용하기 결과 - 개발자 도구>Response Headers - 서버로부터 전달된 쿠키를 클라이언트가 저장

  • value로 13, op로 = 입력 후 개발자 도구 > Request Headers 확인
    • Request Headers: 클라이언트가 서버에게 전달하는 메타데이터
    • path가 /로 설정되어 있고
    • 클라이언트가 getValue( )메소드를 사용해 요청 값으로 전달한 value와 op 쿠키를, 서버가 읽었음

Cookie의 path 옵션 사용하기 결과 -  13과 = 입력
Cookie의 path 옵션 사용하기 결과 - 서버가 쿠키를 읽은 결과
Cookie의 path 옵션 사용하기 결과 - 개발자 도구>Request Headers - 클라이언트가 전달한 쿠키를 서버가 읽음

 

Cookie의 path 옵션에 변주 주기

  • setPath(”path”)에서 path를 /가 아니라 /add로 설정
    • /add로 요청이 오면 쿠키를 저장하라는 의미
    • 해당 서블릿은 매핑 주소가 /calc2
    • path가 다르기 때문에 서버가 읽을 쿠키가 없음
Cookie valueCookie = new Cookie("value", String.valueOf(v));
Cookie opCookie = new Cookie("op", op);
valueCookie.setPath("/add");
opCookie.setPath("/add");
response.addCookie(valueCookie);
response.addCookie(opCookie);

 

Cookie의 path 옵션에 변주 주기 결과

  • 먼저 localhost의 쿠키를 모두 삭제
  • value로 3, op로 + 입력 후 개발자 도구 > Response Headers 확인
    • 서버가 전달한 value와 op 쿠키를 클라이언트가 저장하는 건 가능

Cookie의 path 옵션에 변주 주기 결과 - 3과 + 입력
Cookie의 path 옵션에 변주 주기 결과 - 개발자 도구>Response Headers - 서버로부터 전달된 쿠키를 클라이언트가 저장

  • value로 13, op로 = 입력 후 개발자 도구 > Request Headers 확인
    • 클라이언트가 요청 값으로 전달한 value와 op 쿠키를 서버가 읽는 게 불가능
    • 쿠키가 전달되지 않았기 때문에 결과에도 오류 발생
    • Request Headers를 보면 쿠키가 SID 하나만 전달됐음을 알 수 있음
    •  

Cookie의 path 옵션에 변주 주기 결과 - 13과 = 입력
Cookie의 path 옵션에 변주 주기 결과 - 서버가 쿠키를 읽지 못한 결과
Cookie의 path 옵션에 변주 주기 결과 - localhost:8090/add 입력 - 개발자 도구>Request Headers를 보면 쿠키가 제대로 전달되고 있음(서버가 쿠키를 읽음)

  • localhost:8090/add를 브라우저 URL 입력창에 입력하면 HTTP 상태는 500으로 오류가 발생하지만, 쿠키는 정상적으로 전달되는 걸 알 수 있음

Cookie의 path 옵션에 변주 주기 결과 - localhost:8090/add 입력 - 개발자 도구>Request Headers를 보면 쿠키가 제대로 전달되고 있음(서버가 쿠키를 읽음)

 

 

Cookie의 path 옵션을 적용한 서블릿과 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");
      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>