쿠커 – 05.쿠키 규격

쿠키 규격에 관련된 자료

아래에는 쿠키 규격(HTTP Cookies Specification)에 관련된 문서를 링크시켜 놓았습니다.

  • 넷스케이프의 쿠키에 관한 예비 규격서(www.netscape.com/newsref/std/cookie_spec.html)
    (수정:2010.1.11) 오래된 문서라서 현재는 링크가 깨진 상태입니다.  복사본을 참조하세요.
  • RFC2109 : Proposed Standard “HTTP State Management Mechanism”(www.cis.ohio-state.edu/htbin/rfc/rfc2109.html)
    IETF(Internet Engineering Task Force)의 HTTP Working Group에서 쿠키의 표준화 작업을 하고 있으며 현재의 쿠키는 RFC 2109를 따르고 있습니다.
    (수정:2010.1.11) 오래된 문서라서 현재는 링크가 깨진 상태입니다. 복사본을 참조하세요.

쿠키의 설정

위 규격에 의해 HTTP 서버에서는 다음과 같은 구조의 Set-Cookie 헤더를 통해 쿠키를 클라이언트로 전달합니다.

  • Set-Cookie: NAME=VALUE; expires=DATE; path=PATH; domain=DOMAIN_NAME; secure

대문자는 사용자가 특정값을 입력하는 부분이고 소문자는 예약어로서 반드시 그대로 써야만 합니다.

쿠키 헤더 문법에는 쿠키내용, 유효기간, 유효경로, 유효도메인, 보안설정의 다섯가지의 구성요소를 가집니다. 여기에서 여기서 쿠키명과 쿠키값으로 이루어지는 실질적인 쿠키내용을 제외한 다른 구성요소는 모두 쿠키의 유효 여부를 판단하는데 사용됩니다. 즉 각 구성요소에 입력된 값과 모두 일치하는 서버만이 그 쿠키를 참조할 수 있는 것입니다.

구성요소 문법 필수/선택 예제
쿠키내용 NAME=VALUE 필수 ID=123456789
유효기간 expires=DATE 선택 expires=Tuesday, 06-Feb-01 13:57:21 GMT
유효경로 path=PATH 선택 path=/exam
유효도메인 domain=DOMAIN_NAME 선택 domain=.phpclass.com
보안설정 secure 선택 secure

쿠키내용 NAME=VALUE

실제 쿠키의 내용을 입력하는 곳으로 저장될 쿠키명과 쿠키값을 설정합니다. 쿠키내용은 Set-Cookie 헤더에서 반드시 설정하여야 하는 필수적인 필드입니다. 쿠키명이나 쿠키값의 문자열 중에는 세미콜론(;),콜론(,) 또는 공백값이 들어갈 수 없습니다. 이러한 특수문자들을 표현하기 위해서는 URL 인코딩 방식에 따라 %3B와 같은 형태로 기술해주면 된다.

URL 인코딩/디코딩함수 자바스크립트 PHP
인코딩 escape() urlencode()
디코딩 unescape() urldecode()

유효기간 expires=DATE

쿠키의 유효기간을 설정하는 항목으로 유효기간이 지난 쿠키는 자동으로 지워집니다. 생략이 가능하며 특별히 명시하지 않았을 경우 브라우저 세션이 종료되는 순간 쿠키값이 자동으로 사라집니다. 날짜의 형식은 “Wdy, DD-Mon-YYYY HH:MM:SS GMT”과 같으며 여기서 Wdy란 요일, DD-Mon-YYYY는 일-월-년, HH:MM:SS는 시:분:초, GMT는 그리니치 표준시를 나타냅니다.

  • Sun, 01-Jan-1995 01:00:00 GMT

유효경로 path=PATH

경로 정보는 쿠키의 유효한 경로를 설정하는 항목입니다. 유효경로는 현재 디렉토리의 하위디렉토리를 모두 포함합니다. /exam 라고 설정하면 /exam 뿐만 아니라 /exam/cookie에서도 유효합니다. 또한 경로명의 부분 문자열로 지정할 수 있습니다. 즉 /exam의 경로로 설정된 쿠키는 /exam뿐만 아니라 /example에서도 유효하다. 만약 부분문자열이 아닌 문자열 전부가 일치한 디렉토리만 유효하도록 하려면 /exam/ 와 같이 뒤에 “/”를 지정합니다. 유효경로를 생략하면 쿠키를 지정하는 HTTP 응답 헤더와 같이 넘어오는 문서의 경로로 지정됩니다. 유효경로를 /라고 지정하면 쿠키를 서버의 모든 페이지에서 사용할 수 있습니다.

유효도메인 domain=DOMAIN_NAME

도메인 정보는 쿠키가 유효한 서버를 지정할 때 사용됩니다. 즉 여기서 지정된 도메인 이외의 서버에서는 이 쿠키의 값을 참조할 수 없습니다. 유효도메인을 지정하지 않으면 쿠키에 값을 입력한 서버의 호스트 이름이 지정됩니다.

복수 도메인에서 쿠키를 사용하기 위해서는 호스트명 앞쪽을 생략할 수 있습니다. 예를 들어 쿠키를 www.phpclass.com과 hwooky.phpclass.com 모두에서 사용하려면 .phpclass.com으로 유효도메인을 설정합니다.

보안정보 secure

쿠키의 마지막에 secure 설정이 지정되면 실제로 쿠키의 정보가 암호화되어 저장됩니다. 그러나 호스트가 SSL(Secure Sockets Layer)을 지원할 때(예를 들어 HTTPS 서버)만 유효하며(쿠키를 전송하며) 그 이외는 무시됩니다. 이것은 서버와 브라우저가 모두 보안을 지원한다는 것을 의미합니다. 만일 secure 인수가 없다면 쿠키가 네트워크 상에서 암호화되지 않은 채로 전송될 수 있다는 것을 의미합니다.

쿠키의 요청

쿠키가 설정된 이후에는 클라이언트가 서버에 문서를 요청할 때, 쿠키가 유효한지 검사하기 위해서 쿠키 리스트를 검사하는데 이 때 우선 유효도메인 검사하게 됩니다. 이 때 유효도메인과 서버의 도메인이 일치하는가를 뒤에서 부터 검사하는 방법(tail matching)을 이용합니다. 즉 유효도메인이 .phpclass.com라고 지정되어 있으면 이 쿠키는 www.phpclass.com, hwooky.phpclass.com abc.mingky.phpclass.com 등의 도메인과 일치하는 것으로 처리되지만 www.phpschool.com과 같은 경우는 불일치로 처리됩니다.

일단 도메인 정보의 확인 작업이 통과된 후 쿠키가 유효한 경로를 한번 더 확인하게 됩니다. 이러한 쿠키의 유효성을 통과한 쿠키는 다음과 같은 HTTP 요구헤더를 통해 웹서버로 쿠키에 대한 정보를 넘겨주게 됩니다.

  • Cookie: ID=12345678; PW=abcdefghi

쿠키의 동작

쿠키의 설정과 요청이 실제로 어떠한 절차로 이루어지는지 살펴보면 아래와 같습니다.

① 클라이언트가 서버측의 문서를 요청하면 다음과 같은 응답 헤더를 통해 쿠키가 설정됩니다.

  • Set-Cookie: ID=123456789; path=/exam; expires=Tuesday, 06-Feb-01 13:57:21 GMT

② 브라우저가 ‘/exam’ 경로에 있는 웹문서를 요청할 때 서버로 요구 헤더를 통해 다음과 같은 쿠키 정보가 전달됩니다.

  • Cookie: ID=123456789

③ CGI 프로그램에서는 HTTP_COOKIE CGI 환경변수를 통해 쿠키명(ID)과 쿠키값(123456789)을 읽어 처리합니다.

쿠키의 제한사항

각 클라이언트는 여러 개의 쿠키를 가질 수 있습니다. 따라서 여러 서버에 접속하여도 각 서버에 해당하는 쿠키를 각각 따로 관리할 수 있습니다. 그러나 쿠키들의 남용을 방지하기 위해 웹브라우저가 관리하는 쿠키의 크기는 제한됩니다.

  • 최대 300개의 쿠키 저장
  • 하나의 쿠키는 공백을 포함하여 name/value의 합이 4KB로 제한
  • 서버/도메인별로 최대 20개의 쿠키 저장

쿠키의 최대 저장 개수를 초과하면 이전에 저장된 쿠키는 새로운 쿠키가 덮어 쓰게 되며 , 이때 LRU(Least Recently Used), 방식에 따라 최근에 가장 적게 사용된 쿠키가 차례로 지워지게 됩니다.

쿠키를 유효기간 전에 파기시키려면 expires 속성을 지나간 시간으로 하여 재지정 해주면 됩니다. 이때는 쿠키명과 유효경로 등이 지우려는 쿠키의 정보와 일치해야 합니다.

Set-cookie 하나당 하나의 쿠키만 보낼 수 있습니다.

답글 남기기