is Data.

JSP Cookie 쿠키

쿠키는 웹 브라우저가 보관하고 있는 데이터로서 웹 서버에 요청을 보낼 때 함께 전송된다.

 

1.Cookie 쿠키

 

쿠키는 웹 서버와 웹 브라우저 양쪽에서 생성할 수 있으며, 웹 서버는 웹 브라우저가 전송한 쿠키를 사용하여

필요한 데이터를 읽어올 수 있다.

Cookie는실제로 Set-Cookie 헤더를 통해서 전달된다. 한 개의 Set-Cookie 헤더는 한 개의 쿠키 값이 전달된다.

출력버퍼가 플러시(Flush)된 경우에는 더 이상 헤더를 추가할 수 없으므로 쿠키 역시 버퍼가 출력되기전에 처리해 주어야 한다.

 

RFC2109규약이 규정짓는 쿠키의 이름 및 값에 대한 규칙 

  1. 쿠키의 이름은 아스키 코드의 알파벳과 숫자만을 포함할 수 있다.
  2. 콤마(,) , 세미콜론(;) , 공백(' ') 등의 문자는 포함할 수 없다.
  3. '$'로 시작할 수 없다.

 

쿠키에서 콤마,세미콜론등의 문자를 사용하기 위해선 반드시 인코딩 처리를 하여 넘겨주어야한다.

 


2.Cookie의 생성 , 읽기

<%
    Cookie cookie = new Cookie("country", URLEncoder.encode("대한민국","euc-kr"));
    response.addCookie(cookie);
%>
위처럼 값을 인코딩하여 response객체의 addCookie() 메서드를 통해 쿠키를 생성한다.
java.net.URLEncoder() 메서드는 값을 인코딩하는 역할을 한다.,
<%
    Cookie[] cookies = request.getCookies();
    if (cookies != null && cookies.length > 0) {
        for (int i = 0 ; i < cookies.length ; i++) {
%>
    <%= cookies[i].getName() %> =
    <%= URLDecoder.decode(cookies[i].getValue(), "euc-kr") %><br>
<%
        }
    } else {
%>
쿠키가 존재하지 않습니다.
<%
    }
%>
request 기본객체를 통해 쿠키리스트를 반환받아 값이 있는 경우 쿠키이름과 값을 출력한다.
쿠키가 없을 경우에는 null을 출력하므로 NullPointerException을 발생시키지 않으려면 null인지 여부를 확인해야 한다.
 
 
3.Cookie의 수정 및 삭제
 
Cookie는 별도로 수정하는 메서드를 제공하지 않는다. 그래서 수정을 하고자 할때는 동일한 이름의 쿠키를 다시 생성하면 된다.
동일한 이름의 Cookie를 생성하는 경우 새로만들어진 쿠키의 값으로 Overwrite된다.
기존에 값이 없는 경우에는 당연히 새로운 쿠키가 생성된다. 새로운 쿠키가 생성되지 않길 바란다면 쿠키리스트에서
변경하고자 하는 쿠키가 있는지 확인하는 조건절을 추가하는 것이 좋다
<%
    Cookie[] cookies = request.getCookies();
    if (cookies != null && cookies.length > 0) {
        for (int i = 0 ; i < cookies.length ; i++) {
            if (cookies[i].getName().equals("name")) {
                Cookie cookie = new Cookie("name",
                    URLEncoder.encode("바꿔버리겠어", "euc-kr"));
                response.addCookie(cookie);
            }
        }
    }
%>
위처럼 equals() 메서드를 통해 리스트에서 동일한 이름의 쿠키가 있는경우에만 변경하도록 하면 된다.
 
Cookie의 삭제 또한 별도의 메서드를 제공하지 않는다. 하지만 쿠키는 유효기간(만료일)을 지정할 수 있는데
해당 메서드를 통해 쿠키의 유효기간을 0으로 설정하면 쿠키는 삭제된다. 음수 입력시 브라우저 종료화 함께 사라진다.
유효기간을 지정하지 않으면 브라우저 종료시 제거되도록 기본값이 설정되어 있다.
Cookie cookie = new Cookie("name", "");
cookie.setMaxAge(0);
response.addCookie(cookie);
setMaxAge() 메서드를 통해 name 쿠키를 삭제하는 예문.
 
 
4.Cooke의 도메인 과 경로
 
Cookie는 해당 쿠키를 생성한 서버에만 전송된다. 하지만 메서드를 통해 원하는 도메인 또는 경로를 지정하여 쿠키를 전송할 수
있다. 도메인이나 경로가 지정된 경우엔 해당 경로, 도메인 또는 그 하위 디렉터리에 접근하는 경우 쿠키가 전달된다.
도메인을 지정할 때 주의할 점은 도메인은 현재 서버의 도메인 및 상위 도메인만 전달할 수 있다는 것이다.

Cookie cookie = new Cookie("id", "hyun");
cookie1.setDomain(".test.sample");
response.addCookie(cookie);
위처럼 지정한 경우 .test.sample 로 지정된 서버에만 쿠키를 전송한다.
 
경로는 URL에서 도메인 이후의 부분을 말한다. 서버주소 이후의 부분인 '/' 나 '/test' 이후에 오는 주소이다.
경로는 지정한 경우 브라우저는 해당 경로 및 하위 경로에 접근하는 경우에만 쿠키를 전송한다.
Cookie cookie = new Cookie("path",
        URLEncoder.encode("경로:/test/path", "euc-kr"));
cookie1.setPath("/test/path");
response.addCookie(cookie);
일반적으로 쿠키는 웹 어플리케이션에 포함된 다수의 JSP 및 서블릿에서 공통으로 사용되는 경우가 많기 때문에
대부분의 경우 쿠키의 경로를 "/" 으로 지정한다.