Web
8 Jun 2020

Cookie

해당 게시글은 웹을 공부하기 위해 개인적으로 기록했던 자료입니다.


쿠키는 Servlet으로부터 브라우저로 보내지는 적은 양의 정보입니다. 브라우저에 잠시 저장됐다가 서버에 나중에 보내집니다.

브라우저가 서버에 요청을 하는 과정에서 당연히 하나의 브라우저의 요청만 있는 것이 아닙니다. 수만개의 요청이 들어가고 있을 것입니다.

한 사람이 로그인을 한 후에 여러개의 요청을 보낼 수 있는데 여러 개의 요청을 클라이언트별로 구분할 수 있게 만들어놓은 것이 바로 쿠키입니다. 그래서 주로 세션관리를 위해 자주 쓰입니다.

쿠기는 이름과 값, 그리고 추가적인 속성(Comment, path, domain qualifier, maxium age, version number)으로 이루어집니다. 추가적인 속성을 핸들링 할 수 있는 건 브라우저 마다 다를 수도 있습니다.

Servlet은 브라우저로 쿠키를 보낼때 addCookie method를 사용합니다. HTTP response헤더에 필드를 추가함으로써 가능합니다. 각각의 Web server마다 20개의 쿠키를 지원하고 총 300개의 쿠키를 관리할 수 있습니다. 쿠키의 크기는 4KB로 제한되어 있습니다.

쿠키는 서버상의 부하를 줄이기 위해 쓰이지만 정보저장이 브라우저에서 이루어지기 때문에 보안에 극도로 취약한 단점이 있습니다.


GetCookieTest Servlet과 SetCookieTest Servlet을 만들었습니다.

SetCookieTest Servlet

package servlet.cookie;

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

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 SetCookieTest extends HttpServlet {
	private static final long serialVersionUID = 1L;

    public SetCookieTest() {
        super();
    }

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

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doProcess(request, response);
	}
	
	protected void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		/*
		 * 쿠키생성: cookie c = new Cookie("name", "value");
		 * 생성한 쿠키를 웹브라우저로 보냄.  response.addCookie(c);
		 */
		Date now = new Date();
		String id = "ENCORE";
		
		Cookie cookie1 = new Cookie("now", "2020-06-08:10:47");
		Cookie cookie2 = new Cookie("id", id);
		
		cookie1.setMaxAge(3600*24);
		cookie2.setMaxAge(10);
		
		response.addCookie(cookie1);
		response.addCookie(cookie2);   
		
		response.sendRedirect("GetCookieTest");
	} 
}


javax.servlet.http 패키지에 있는 Cookie 클래스를 쓸 수 있습니다. cookie1과 cookie2인스턴스를 만들고 하나는 시간, 하나는 id를 name-value매칭으로 만듭니다.

cookie1의 최대 유지시간은 3600(1시간)*24 = 1일로 설정했고 cookie2의 최대 유지시간은 10초로 했습니다.

그리고 response.sendRedirect로 GetCookieTest Servelt으로 리다이렉트합니다.

GetCookieTest Servlet

package servlet.cookie;

import java.io.IOException;
import java.util.Date;

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 GetCookieTest extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    public GetCookieTest() {
        super();
    }

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

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doProcess(request, response);
	}
	
	protected void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		Cookie[] cookies = request.getCookies();
		
		System.out.println(cookies[0].getValue());
		System.out.println("cookie[1]: "+cookies[1].getValue());
	} 
}

GetCookieTest Servlet에서 쿠키를 받고 있는 것을 확인 할 수 있습니다. SetCookieTest Servlet에서 cookie1, cookie2순으로 쿠키를 브라우저로 보냈으므로 cookie[0]은 cookie1 인스턴스, cookie[1]은 cookie2 인스턴스가 됩니다.

09cookie

브라우저를 새로고침하면 위와 같이 정보가 계속 뜨게 되는데 10초가 지나면 cookie2 인스턴스가 사라지기 때문에 위와 같이 Error가 나타나게 됩니다.


Tags:
0 comments