쿠키

By | 2009년 3월 17일

앞서 여행사를 통한 항공편 예약에서 설명한 바와 같이 쿠키(Cookie)는 지속적으로 필요한 사용자의 정보를 저장하기위해 사용되는 기술로 다음과 같은 특징으로 설명할 수 있다.

    웹프로그램의 실행에 필요한 정보로 클라이언트-서버 사이에서 지속적으로 관리가 필요한 정보
    서버의 필요에 의해 서버가 주체가 되어 지정되는 정보
   
클라이언트(브라우저)에서 보관되고 http 접속 시 자동으로 서버로 보내지는 작은 용량의 정보

JSP에서 쿠키는 Cookie 클래스 및 request 객체와 response 객체에 의해 만들어지고 이용된다. 다음은 request 객체와 response 객체에서 쿠키와 관련된 클래스 및 메소드를 정리한 것이다.

 Method

 설   명

 Cookie(String
name, String value)

 이름과 값을 가지고 쿠키 객체를 생성한다

 setValue(String value)

 쿠키의 값을 설정한다

 setMaxAge(int expiry)

 쿠키의 유효시간을 설정한다.

 setPath(String dir)

 쿠키를 전송할 경로를 설정한다.

 setDomain(String addr)

 쿠키를 전송할 도메인을
설정한다.

 getName()

 브라우저에서 전송된 쿠키의
이름을 얻는다.

 getValue()

 브라우저에서 전송된 쿠키의
값을 얻는다.

 Method

 설   명

 response.addCookie(Cookie cookie)

 생성된 쿠키를 브라우저에
전송해 저장하도록 한다.

 request.getCookies()

 브라우저에서 전송된 쿠키
정보를 이용 쿠키객체를 생성한다.

쿠키 설정

쿠키는 서버에 의해 설정된다. 쿠키는 Cookie 클래스에 의해 생성되고 생성된 쿠키 객체는 response 객체의 addCookie 메소드에 의해 클라이언트(브라우저)에 전송되고 전송된 쿠키객체의 정보는 클라이언트에 저장되어 해당 서버에 http 접속 시 자동으로 쿠키 정보가 서버로 전달된다.

형식

Cookie cookie = new Cookie(cookie_name, cookie_value);
response.addCookie(cookie);

위 형식에서 쿠키객체는 Cookie 클래스의 생성자 Cookie에 의해 생성된다. 이 때 필요한 파라메터로 쿠키이름(cookie_name)과 쿠키값(cookie_value)이 요구된다. 두 파라메터 모두 클래스 String 형식이다. 생성된 쿠키 쿠키이름과 쿠키값의 쌍을 이루며 response.addCookie 메소드에 의해 클라이언트로 전달해야 한다. 이렇게 함으로써 다음 접속부터 클라이언트로부터 쿠키 정보를 받을 수 있다. 다음 프로그램 “addCookie.jsp”는 쿠키를 설정하는 예를 보여주고 있다.

<%@ page language=”java” contentType=”text/html; charset=EUC-KR”
    pageEncoding=”EUC-KR”%>
<%@page import = “java.util.Date”%>
<!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”
“http://www.w3.org/TR/html4/loose.dtd”>
<html>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=EUC-KR”>
<title>Insert title here</title>
</head>
<body>
<%
    String name = “time”;
    Date date = new Date();
    String value = date.toString();

    Cookie cookie = new Cookie(name, value);
    response.addCookie(cookie);
%>
쿠키 설정을 했습니다.
</body>
</html>

사용자 삽입 이미지

addCookie.jsp 실행결과


위 프로그램에서 String 캑체 name과 Date 객체 date에 각각 “time”과 Date 객체가 생성된 당시의 날짜와 시각이 저장되어 있다. 그리고 String 객체 value에 date 객체의 날짜와 시각을 String 형으로 변환하여 저장하고 있다. 그런 다음 Cokkie 객체 cookie를 쿠키이름과 쿠키값의 쌍으로 생성하고 생성된 Cookie 객체 cookie를 response 객체의 addCookie 메소드를 이용 클라이언트에 전달 저장하도록 하고 있다. 참고로 프로그램에서 사용된 value 객체는 Cookie 생성 시 필요한 두 개의 파라메터(쿠키이름, 쿠키값)가 모두 String 형식이므로 date 객체를 직접 두 번째 파라메터로 지정할 수 없기 때문이다.

쿠키 읽기

지정된 쿠키는 서버로 접속할 때 클라이언트로부터 자동으로 전달된다고 했다. 그러면이 쿠키는 어떻게서버에서 처리할까? 이는Cookie객체의 getCookies 메소드를 이용 처리할 수 있다. 다음 프로그램 “getCookies.jsp”를 살펴보자

<%@ page language=”java” contentType=”text/html; charset=EUC-KR”
    pageEncoding=”EUC-KR”%>
<!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”
“http://www.w3.org/TR/html4/loose.dtd”>
<html>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=EUC-KR”>
<title>Insert title here</title>
</head>
<body>
<table border=”1″>
<tr>
<td>쿠키이름</td>
<td>쿠키값</td>
<%
    Cookie [] cookie = request.getCookies();
   
    for(int i = 0; i < cookie.length; i++)
    {
%>
    <tr>
    <td><%= cookie[i].getName() %></td>
    <td><%= cookie[i].getValue() %></td>
    </tr>
<%
    }
%>
</table>
</body>
</html>

사용자 삽입 이미지

getCookies.jsp 실행결과


위 프로그램에서 request.getCookies()는 클라이언트로부터 서버로 전달된 쿠키이름과 쿠키값의 쌍으로 이루어진 모든 쿠키정보를 읽는다. 그러므로 읽어온 쿠키정보를 프로그램에서 이용하려면 Cookie 클래스에 의해 생성된 객체에 저장해야 한다. 위 프로그램에서는 클라이언트로부터 전달된 모든 쿠키 정보를 저장하기 위해 Cookie 배열을 이용해 저장하고 있다. 쿠키정보는 이름과 값의 쌍을 이루고 있다고 했으므로 각 정보는 getName() 메소드와 getValue 메소드를 이용하면 얻을 수 있으며, 위 프로그램에서는 이 두 메소드를 이용 그 값을 출력하고 있다.

그러나 위 프로그램을 실행했을 때 다음과 같이 오류가 발생할 수 있다.

사용자 삽입 이미지

getCookies.jsp 실행오류


이런 오류가 발생하는 이유는 클라이언트에서 서버로 전달된 쿠키가 없기 때문으로 브라우저를 띄우고 처음으로 실행한 프로그램이 “getCookies.jsp” 일 때 발생한다. 따라서 클라이언트에서 전달된 쿠키를 읽기위한 메소드 getCookies는 반드시 이 메소드가 실행되기 전에 쿠키가 지정되어 있어야 한다.

쿠키 삭제

클라이언트에 저장된 쿠키는 기본적으로 브라우저가 서버로부터 쿠키 정보를 받은 후에 브라우저가 종료되기 전까지 저장되어 있다가 브라우저가 종료되면 삭제된다. 그러나 브라우저가 종료되기 전 필요에 의해 삭제하려면 어떻게 할까? 이것은 Cookie 클래스의  setMaxAge 메소드를 이용 크라이언트에 저장된 쿠키를 삭제할 수 있다. setMaxAge 메소드는 쿠키자 유지되는 시간을 지정하는 함수로 값을 0으로 설정하면 쿠키가 삭제된다.

다음 프로그램 “delCookies.jsp”는 클라이언트에 저장된 모든 쿠키를 삭제하는 프로그램이다.

<%@ page language=”java” contentType=”text/html; charset=EUC-KR”
    pageEncoding=”EUC-KR”%>
<!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”
“http://www.w3.org/TR/html4/loose.dtd”>
<html>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=EUC-KR”>
<title>Insert title here</title>
</head>
<body>
<%
Cookie [] cookie = request.getCookies();
for(int i = 0; i < cookie.length; i ++) {
    cookie[i].setMaxAge(0);
    response.addCookie(cookie[i]);
}
%>
설정된 모든 쿠키를 삭제했습니다.
</body>
</html>

사용자 삽입 이미지

delCookies.jsp 실행결과


위 프로그램은 request.getCookies() 메소드를 이용 클라이언트로부터 전달된 모든 쿠키를 읽은 후 각 쿠키의 지속시간을 setMacAge(0)에 의해 0으로 설정하고 클라이언트에 다시 지정함으로써 클라이언트가 쿠키정보를 삭제하도록 하고있다. “AddCookie.jsp”와 “delCookies.jsp”를 차례로 실행한 후 “getCookies.jsp”를 실행하면 다음과 같은 결과를 얻는다.

사용자 삽입 이미지

delCookie.jsp 실행 후 getCookies.jsp 결과


위 결과에서 살펴보면 “addCookie.jsp”에서 설정된 “쿠키이름/쿠키값”의 쌍인 “time”/”설정시각”은 “del.Cookies.jsp”에 의해 삭제되었음을 확인할 수 있다. 그러나 쿠키이름이 “JSESSIONID”과 관련된 항목은 뒤에 배울 세션과 관련된 쿠키 정보로 Tomcat과 같은 JSP 컨테이너에 자동으로 생성되는 정보이므로 삭제되지 않는다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.