이전글
쿠키의 동작 방식
이전글에서 쿠키의 개념과 쿠키란 어떤것인지 대략적으로 살펴보았습니다. 이번 글에서는 실질적으로 쿠키를 어떤식으로 사용하는지 알아보도록 하겠습니다. 쿠키 사용방법에 앞서 간단히 쿠키가 처리되는 절차를 알아보자면 다음 그림과 같습니다.
-
쿠키는 서버로부터 생성됩니다. 우리가 개발한 웹 컴포넌트(Servlet 또는 JSP)에서 Cookie 클래스를 이용하여 쿠키를 생성할 수 있습니다.
-
생성된 쿠키는 HTTP 응답 메시지의 헤더에 추가되어 브라우저로 전송됩니다.
-
브라우저는 받은 쿠키를 자신만의 공간에 저장합니다.
-
브라우저는 이후 모든 요청시마다 현재 자신이 가지고 있는 모든 쿠키들을 HTTP 요청 메시지에 추가하여 서버로 전송합니다. 이런 행동은 브라우저가 자동으로 해주기 때문에 개발자가 따로 신경 쓰지 않아도 됩니다.
-
서버는 쿠키 정보를 이용하여 여러가지 처리를 하게됩니다. (예를 들어 로그인 인증 정보 여부를 담은 쿠키를 확인하여 특정 기능의 인가 처리를 할 수 있습니다.) 브라우저는 서버가 요청하지 않아도 매번 쿠키를 보내기 때문에 서버 입장에서는 쿠키를 다룰필요가 없다면 사용하지 않으면 그만입니다.
쿠키의 속성
웹 환경에서 쿠키는 다음과 같은 속성을 가지게 됩니다. 이후 천천히 배워보겠지만 대략적으로 알아두도록 합니다. 쿠키는 최초에 서버에서 만들어져 HTTP 응답메시지의 헤더를 통해 브라우저에 저장된 이후 매번 요청시마다 서버로 자신이 저장하고 있는 쿠키를 HTTP 요청 헤더에 넣어 전송하게 됩니다.
서버에서 만들어진 쿠키는 응답 메시지의 헤더에 다음과 같은 형식으로 들어가 브라우저로 전송됩니다.
Set-Cookie: name=value; expires=Tue; path=/; secure
이후 해당 쿠키를 저장한 브라우저는 path와 domain 설정에 따라 자신이 가진 모든 쿠키를 매번 서버로 전송할 것이며, 서버는 이러한 쿠키 데이터를 요청 처리에 사용할 수 있습니다. 본격적으로 쿠키의 속성들에는 다음과 같은 것들이 있습니다.
-
쿠키는 name=value 형식으로 저장됩니다.
-
쿠키는 name과 value 이외에도 expire, path, domain, secure 등의 속성을 추가적으로 가질 수 있습니다.
-
expire 속성 - expire=날짜 형식으로 지정되며, 쿠기의 유효기한이 만료되는 시간을 지정합니다. 이 값이 없는 쿠키는 브라우저가 종료될때까지 유효합니다.
-
path 속성 - path=경로 형식으로 지정되며, 쿠키가 유효하게 전달되는 범위를 서버상의 디렉터리 경로로 지정합니다. 예를 들어 path=/ 형식으로 지정하면 서버 내의 모든 경로를 의미합니다. 이 값이 생략되는 경우 쿠키를 설정하는 당시의 경로에 유효합니다.
-
domain 속성 - domain=서버도메인 형식으로 지정되며, 쿠키가 유효하게 전달되는 도메인 주소를 지정합니다. 생략되는 경우 쿠키를 생성한 서버 도메인에서만 유효합니다.(예: google.com으로 지정시에 www.google.com, portal.google.com 등의 하위 도메인 모두 유효함)
-
secure - 이 속성이 설정되는 경우에는 HTTPS 같은 보안이 적용된 프로토콜로 통신할때만 서버로 전송됩니다.
-
HttpOnly - 쿠키를 JavaScript에서는 접근하지 못하도록 제한합니다.
쿠키 이름과 값
쿠키는 상태 즉 데이터를 저장하여 여러 페이지에 걸쳐 유지하는 기술이므로 데이터를 저장하는것이 핵심 기능입니다. 쿠키는 하나의 브라우저에 여러개가 저장될 수 있는데, 각각의 쿠키에 데이터값과 쿠키를 구분할 수 있는 이름을 가지고 있습니다.
-
쿠키 이름 - 쿠키이름은 ,(콤마), ;(세미콜론), '=' 를 제외한 ASCII 코드로 구성됩니다.(즉 한글 사용 불가능합니다.)
-
쿠키 값 - 쿠키 값 역시 ,(콤마), ;(세미콜론), 공백문자를 제외한 ASCII 코드로 구성되기 때문에 한글 사용이 불가능합니다. 만약 한글을 사용하고 싶은 경우 URL Encoding을 통해 한글을 ASCII 코드로 인코딩하여 저장한 후 서버에서 사용시 다시 디코딩하여 한글로 변환 후 사용하는 방법이 있습니다. -> [서블릿/JSP] 쿠키(Cookie)에 한글 데이터 저장하고 가져오기
쿠키에 대한 더욱 자세한 명세는 RFC2109, RFC2965, RFC6265를 검색하여 참고합니다.
쿠키 생성하기
JSP 또는 Servlet에서 쿠키를 생성하기 위해서는 javax.servlet.http.Cookie를 사용하면 됩니다.
new Cookie(String name, String value) 형식으로 쿠키의 이름과 값을 각각 매개변수로 넘깁니다.
Cookie cookie = new Cookie("message", "hello"); |
cs |
쿠키를 응답헤더에 추가하여 브라우저로 전송하기
쿠키는 생성하는 것만으로는 동작하지 않습니다. 쿠키는 브라우저에 저장되어야 하므로 HTTP 응답 메시지의 헤더에 추가하여 브라우저측으로 전송해 주어야 합니다. HttpServletResponse의 addCookie() 메서드를 이용하도록 합니다.
Cookie cookie = new Cookie("message", "hello");
response.addCookie(cookie); |
cs |
쿠키 여러개 추가하기
하나의 쿠키는 하나의 값만을 저장할 수 있습니다. 따라서 여러 정보들을 쿠키로 저장하고 싶은 경우 여러개의 쿠키를 생성 후 브라우저에 저장해두면 됩니다.
<%
response.addCookie(new Cookie("name", "dololak"));
response.addCookie(new Cookie("age", "28"));
response.addCookie(new Cookie("country", "korea"));
%> |
cs |
서블릿 컨테이너에서 출력한 HTTP 응답 헤더입니다.
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Set-Cookie: name=dololak
Set-Cookie: age=28
Set-Cookie: country=korea
Content-Type: text/html;charset=utf-8
Content-Length: 96
Date: Tue, 11 Sep 2018 08:50:36 GMT
...메시지 본문...
쿠키 데이터 얻기
쿠키를 얻고 싶은 경우 HttpServletRequest 객체의 Cookie[] getCookies() 메서드를 사용합니다. getCookies() 메서드는 브라우저에서 전송한 모든 쿠키들을 배열로 리턴합니다. 아쉽게도 특정 쿠키만을 얻어오는 메서드는 존재하지 않습니다. 따라서 보통 다음과 같이 쿠키관련 유틸리티 메서드를 만들어 사용합니다.
request 객체의 getCookies() 메서드로 얻은 Cookie 배열을 반복문을 돌면서 쿠키 이름이 지정한 쿠키명과 같은것을 찾습니다. 그리고 쿠키를 찾으면 해당 쿠키의 값을 리턴합니다. Servlet에서도 마찬가지로 service나 doGet 메서드 등의 첫번째 파라미터로 넘어오는 HttpServletRequest 객체를 사용하면 됩니다.
<%@ page contentType = "text/html; charset=utf-8" %>
<%!
public String getCookieValue(Cookie[] cookies, String cookieName) {
for (Cookie cookie : cookies) {
if(cookie.getName().equals(cookieName)){
return cookie.getValue();
}
}
return "";
}
%>
<html>
<head>
</head>
<body>
<%
Cookie[] cookies = request.getCookies();
String age = getCookieValue(cookies, "age");
%>
<h1>나이는 : <%= age %></h1>
</body>
</html> |
cs |
브라우저에서 age 라는 이름을 가진 쿠키를 가지고 있었다면 jsp 호출시 다음과 같은 결과를 얻을 수 있습니다.
쿠키 수정하기
쿠키는 쿠키 이름으로 구분합니다. 쿠키를 수정하는 방법은 별다를게 없고 기존에 생성되었던 쿠키와 같은 이름의 쿠키를 값만 다르게 새로 생성하여 응답에 추가하는 것입니다. 브라우저는 응답받은 쿠키 중 기존 쿠키와 이름이 같은것이 있으면 기존의 쿠키를 지우고 가장 최근에 받은 쿠키를 새로 저장합니다.
<%
response.addCookie(new Cookie("name", "dololak")); //기존 쿠키과 같은 이름의 쿠키를 새로 응답
%> |
cs |
쿠키 삭제하기
쿠키는 브라우저가 종료되면 같이 제거되는것이 기본 동작이지만 브라우저가 종료되기 이전에 강제로 삭제해야할 때가 있을것입니다. 그러나 기본적으로 쿠키를 삭제하는 메서드는 존재하지 않습니다. 특이하게도 쿠키를 제거하기 위해서는 유효기한을 0으로 만들어 제거해야 합니다.
쿠키를 제거할때에는 Cookie 클래스의 setMaxAge(int second) 메서드를 사용합니다. setMaxAge()메서드는 쿠키의 수명을 현재시간으로부터 얼마동안 더 살려둘것인지(?) 초단위로 지정합니다. -1로 지정하면 브라우저가 종료될 때 제거됩니다. 따라서 곧바로 제거하도록 하려면 0을 입력해야 합니다.
Cookie cookie = new Cookie("name", ""); //삭제하고 싶은 쿠키의 이름으로 쿠키를 생성
cookie.setMaxAge(0); //쿠키의 수명을 0으로 설정
response.addCookie(cookie); |
cs |
서버 사양에 따라 조금씩 다를 수 있는데, 톰캣8을 기준으로 수명을 0으로 지정하면 HTTP 응답메시지의 헤더에 쿠키의 수명이 다음과 같이 변경됩니다. 브라우저는 응답 메시지를 받은 이후 만료기한이 지난 쿠키설정이 있기때문에 해당 이름을 가진 쿠키를 가지고 있다면 제거합니다.
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Set-Cookie: name=""; Expires=Thu, 01-Jan-1970 00:00:10 GMT
Content-Type: text/html;charset=utf-8
Content-Length: 313
Date: Tue, 11 Sep 2018 13:27:49 GMT
Cookie 클래스의 메서드
Cookie 클래스가 가지고 있는 메서드는 다음과 같은 것들이 있습니다.
메서드 |
리턴타입 |
설명 |
setMaxAge(int second) |
void |
GMT(그리니치 평균시)를 기준으로 얼마의 시간동안 쿠키를 제거하지 않을것인지 쿠키의 유효기한을 초단위로 설정합니다. -1의 경우 브라우저가 종료될때까지 제거하지 않으며, 0으로 설정할 경우 곧바로 제거합니다. 300으로 지정할 경우 그리니치 평균시를 기준으로 5분 뒤 제거합니다. |
getMaxAge() |
int |
쿠키의 유효기간이 얼마나 남았는지 그리니치 평균시를 기준으로 하여 초단위로 얻습니다. 예를 들어 쿠키가 제거되는 만료 날짜가 2018-09-11 11:35분이고 현재 시각이 2018-09-11 11:30 이라면 5분이 남았으므로 300(초) 이 정수값으로 리턴됩니다. |
getValue() |
String |
쿠키 값을 얻습니다. |
setValue(String value) |
void |
쿠키 값을 설정합니다. |
getName() |
String |
쿠키를 구분하는 역할을 하는 쿠키 이름을 얻습니다. 쿠키 이름은 쿠키 생성시에 지정한 이름입니다. |
setDomain(String pattern) |
void |
쿠키 도메인 설정에 사용됩니다. 만약 여러 서버에 걸쳐 쿠키가 사용되어야 한다면 도메인명을 설정할 수 있습니다. 예를 들어 ".google.com" 으로 도메인을 설정하면 해당 쿠키는 www.google.com, www2.google.com, edu.google.com 등의 서버 요청시에도 전송됩니다. |
getDomain() |
String |
쿠키에 설정된 도메인을 얻습니다. |
setPath(String path) |
void |
쿠키 경로 설정에 사용됩니다. 특정 경로에 대해서만 쿠키를 서버측으로 전송하고 싶은 경우에 경로를 지정합니다. 지정된 경로와 그 하위 경로에 대해서만 쿠키를 HTTP 요청 헤더에 추가하여 전송합니다. |
getPath() |
String |
쿠키에 지정된 전송 경로를 얻습니다. |
다음글
'Servlet&Jsp' 카테고리의 다른 글
[서블릿/JSP] 쿠키(Cookie)의 path 속성으로 전송 URL 지정하기 (1) | 2018.09.20 |
---|---|
[서블릿/JSP] 쿠키(Cookie)의 domain 속성 설명. 쿠키 전송 범위 설정하기 (0) | 2018.09.15 |
[서블릿/JSP] 쿠키(Cookie)에 한글 데이터 저장하고 가져오기 (0) | 2018.09.11 |
[서블릿/JSP] 톰캣 쿠키(Cookie)에 한글 저장시 Control character in cookie value or attribute 오류 (1) | 2018.09.11 |
[서블릿/JSP] 자바빈(Java Beans)이란? <jsp:useBean> 액션 태그로 빈 객체 생성하기 (0) | 2018.09.06 |