JSP 책을 보다가 쿠키와 관련된 챕터가 등장했다. 물론 쿠키가 브라우저에서 서버와 연결할 때 쓰인다는 것에 대해서는 알지만, 내부 기능에 대해 자세히 정리해보고자 글을 작성하게 되었다.


쿠키란 ?

쿠키는 웹 브라우저가 보관하는 데이터다. key-value로 구성되고 String 형태로 이루어져 있다. 웹 브라우저는 웹 서버에 요청을 보낼 때 쿠키를 함께 전송하며, 웹 서버는 웹 브라우저가 전송한 쿠키를 사용하여 필요한 데이터를 읽을 수 있다. 초기 쿠키는 웹 서버측에 생성하며, 아래의 동작방식으로 구성된다.

  1. 쿠키 생성 단계 : 클라이언트가 쿠키를 사용하기 위해서는, 초기에 서버가 먼저 쿠키를 생성해야한다. 웹 서버는 생성한 쿠키를 응답 데이터의 헤더에 저장해 웹 브라우저에 전송한다.
  2. 쿠키 저장 단계 : 웹 브라우저는 응답 데이터에 포함된 쿠키를 쿠키 저장소에 보관한다. 쿠키의 종류에 따라 메모리 혹은 파일에 저장한다.
  3. 쿠키 전송 단계 : 웹 브라우저는 저장한 쿠키를 요청이 있을 때마다 웹 서버에 전송한다. 웹 서버는 웹 브라우저가 전송한 쿠키를 사용해 필요한 작업을 수행한다.

일단, 웹 브라우저에 쿠키가 저장되면, 웹 브라우저는 쿠키가 삭제되기 전까지 웹 서버에 쿠키를 전송한다. 따라서 웹 어플리케이션을 사용하는 동안 지속적으로 유지해야 하는 정보는 쿠키를 사용해 저장하면 된다. ***

쿠키의 구성

  • 이름 : 각각의 쿠키 구별시 사용되는 이름
  • : 쿠키의 이름과 관련된 값
  • 유효시간 : 쿠키의 유지시간
  • 도메인 : 쿠키를 전송할 도메인
  • 경로: 쿠키를 전송할 요청경로

이름과 값은 콤마, 세미콜론, 공백, 등호기호를 제외한 출력가능한 아스키 문자로 구성된다. 쿠키 유효시간의 경우, 별도로 지정하지 않으면 웹 브라우저를 종료할 때 쿠키를 함꼐 삭제한다.


쿠키의 사용처

  • 세션 관리 : 로그인, 사용자 닉네임, 접속시간 등 서버가 알아야 할 정보 저장
  • 개인 설정 유지 : 사용자마다 다르게 그 사람에게 적절한 페이지 노출(X일간 보지 않기, 장바구니)
  • 사용자 트래킹 : 사용자의 행동과 패턴 분석 (최근 검색한 정보 광고 추천등)

쿠키의 한계

  • 서버가 가지고 있는 것이 아니라, 사용자에게 저장되어 임의로 고치거나 지울 수 있고 가로채기도 쉬워 보안이 취약하다.
  • 요청 시 쿠키 값을 그대로 보내 보안에 취약하다.
  • 사이트당 20개, 모두 합쳐 300개가 최대이며 각 쿠키는 4kb를 넘길 수 없다.
  • 웹브라우저 변경시, 다른 웹브라우저에서 저장한 쿠키 값을 사용할 수 없다.
  • 사용자가 보안상 문제로 거부시 사용 불가능하다.
  • 한 번에 하나의 정보만 저장 가능하다.

쿠키 관련 사용법

쿠키 생성하기

Java에서 쿠키 생성시에는 Cookie 클래스를 사용하며, 아래와 같이 생성한다.

Cookie cookie = new Cookie("cookieName", "cookieValue");
response.addCookie(cookie);

위 코드를 보면 알겠지만, 서버 응답 객체에서 쿠키 데이터를 추가하여 클라이언트에게 전달한다.

주요 메소드 :

  • getName() : String, 쿠키 이름을 구한다.
  • getValue() : String, 쿠키 값을 구한다.
  • setValue(String value) : void, 쿠키 값을 지정한다.
  • setDomain(String pattern) : void, 이 쿠키가 전송될 서버의 도메인을 지정한다.
  • getDomain() : String, 쿠키의 도메인을 구한다.
  • setPath(String uri) : void, 쿠키를 전송할 경로를 지정한다.
  • getPath() : String, 쿠키의 전송 경로를 구한다.
  • setMaxAge(int expiry) : void, 쿠키의 유효시간을 초단위로 지정한다. 음수 입력시, 웹 브라우저를 닫을 때 쿠키가 삭제된다.
  • getMaxAge() : int, 쿠키의 유효시간을 구한다.


쿠키 값 읽어오기

웹서버가 쿠키를 생성하고, 브라우저가 전달받으면 그 이후부터 쿠키를 사용할 수 있다. 웹 브라우저는 요청 헤더에 쿠키를 저장해서 보내며, 자바에서는 아래 코드를 사용해 쿠키 값을 읽어 올 수 있다.

Cookie[] cookies = request.getCookies();


쿠키 값 변경 및 삭제하기

쿠키 값을 변경하려면, 같은 이름의 쿠키를 새로 생성해 응답 데이터로 보내면 된다.

Cookie cookie = new Cookie("name", URLEncoder.encode("새로운 값","utf-8"));
response.addCookie(cookie);

이렇게 같은 이름을 가진 쿠키를 새로 만들어 response에 추가하면 기존 값에서 덮어씌워진다.
그렇다면 삭제는 어떻게 할까?
쿠키를 삭제하려면, Cookie클래스의 setMaxAge()메소드를 호출해 매개변수로 0을 설정하면 된다.

Cookie cookie = new Cookie("name","value");
cookie.setMaxAge(0);
response.addCookie(cookie);

Cookie클래스는 따로 삭제하는 메소드를 제공하지 않기에, 유효시간을 0으로 지정해주는 방식으로 삭제기능을 대체한다.


쿠키의 도메인

기본적으로, 쿠키는 그 쿠키를 생성한 서버에만 전송된다. 예를들어, “http://www.google.com”으로 연결되어 생성한 쿠키는 네이버, 다음과 같은 곳에서 사용되면 안된다.
하지만, 같은 도메인을 사용하는 모든 서버에 쿠키를 보내야 할 때가 있다. 예를 들어, www.somehost.com 서버에서 생성한 쿠키를 mail.somehost.com, blog.somehost.com등에 전송해야 할 때가 있다. 이 때 이 쿠키의 도메인 범위를 지정하기 위해 setDomain()을 사용한다.

주의 : setDomain()을 통해 현재 서버의 도메인 및 상위 도메인만 전달 할 수 있다.


쿠키의 경로

도메인이 쿠키를 공유할 도메인 범위를 지정한다면, 경로는 쿠키를 공유할 기존 경로를 지정한다. setPath()메서드를 사용한다.

Cookie cookie = new Cookie("name","value");
cookie.setPath("/user/showlists");
response.addCookie(cookie);


쿠키의 유효시간

쿠키는 유효시간을 갖는다. 쿠키의 유효시간을 지정하지 않으면 웹 브라우저를 종료할 때 쿠키를 함께 삭제한다. 만일 특정 시간동안 쿠키를 유지하려면setMaxAge()메소드를 사용한다.

Cookie cookie = new Cookie("name","value");
cookie.setMaxAge(0);
response.addCookie(cookie);


쿠키와 헤더

response.addCookie()로 쿠키를 추가하면, 실제로 헤더의 Set-Cookie를 통해서 전달된다. 한 개의 Set-Cookie 헤더는 한 개의 쿠키 값을 전달한다. Set-Cookie 헤더의 구성은 아래와 같다.

쿠키이름=쿠키값; 도메인=도메인값; Path=경로값; Expires=GMT형식의 만료일시

Set-Cookie: id=hi; Domain=.somehost.com

출력 버퍼에 저장되어 있는 내용을 플러시해서 웹 브라우저에 데이터가 전송되면, 그 다음부터는 응답 헤더에 새로운 값을 추가 할 수 없다. 쿠키는 응답 헤더를 사용해 웹 브라우저에 전달하기 때문에, 쿠키 역시 출력 버퍼를 플러시 하기 전에 추가해야 한다.


참고 자료 :

  1. 최범균의 JSP 2.3 웹 프로그래밍: 기초부터 중급까지

oksusutea's blog

꾸준히 기록하려고 만든 블로그