HTTP 쿠키

HTTP 쿠키(HTTP cookie)란 하이퍼 텍스트의 기록서(HTTP)의 일종으로서 인터넷 사용자가 어떠한 웹사이트를 방문할 경우 사용자의 웹 브라우저를 통해 인터넷 사용자의 컴퓨터나 다른 기기에 설치되는 작은 기록 정보 파일을 일컫는다.[1] 쿠키, 웹 쿠키, 브라우저 쿠키라고도 한다. 이 기록 파일에 담긴 정보는 인터넷 사용자가 같은 웹사이트를 방문할 때마다 읽히고 수시로 새로운 정보로 바뀐다. 이 수단은 넷스케이프의 프로그램 개발자였던 루 몬툴리(Lou Montulli)가 고안한 뒤로 오늘날 많은 서버 및 웹사이트들이 브라우저의 신속성을 위해 즐겨 쓰고 있다.[2]

쿠키는 소프트웨어가 아니다. 쿠키는 컴퓨터 내에서 프로그램처럼 실행될 수 없으며 바이러스를 옮길 수도, 악성코드를 설치할 수도 없다. 하지만 스파이웨어를 통해 유저의 브라우징 행동을 추적하는데에 사용될 수 있고, 누군가의 쿠키를 훔쳐서 해당 사용자의 웹 계정 접근권한을 획득할 수도 있다.

배경

HTTP 쿠키는 저명한 구운 간식과 같은 이름을 공유한다.

이름의 기원

"쿠키"라는 용어는 웹 브라우저 프로그래머 루 몬툴리가 만들어냈다. 이는 유닉스 프로그래머들이 사용한, 프로그램이 수신 후 변경하지 않은 채로 반환하는 데이터의 패킷을 의미하는 매직 쿠키라는 용어에서 비롯된 것이다.[3][4]

역사

매직 쿠키는 루 몬툴리가 1994년 6월 웹 통신에서 이것들을 사용하겠다는 생각을 했을 때 컴퓨팅에 이미 사용되고 있었다.[5] 당시 그는 넷스케이프 커뮤니케이션스의 직원이었으며 MCI를 위한 전자 상거래 애플리케이션을 개발하고 있었다. 빈트 서프와 존 클렌신은 넷스케이프 커뮤니케이션스와의 기술 토론에서 MCI를 제시했다. MCI는 서버가 부분적인 트랜잭션 상태를 보유하는 것을 원치 않았으나 이러한 이유로 이들은 넷스케이프에게 각 사용자의 컴퓨터의 상태를 저장하는 방법을 강구할 것을 대신 요청하였다. 쿠키는 가상 쇼핑 카트를 신뢰성있게 구현할 때의 문제의 해결책을 제공하였다.[6][7]

구조

쿠키는 다음의 요소로 구성된다:[8][9]

  1. 이름
  2. 0개 이상의 속성 (이름/값 쌍). 속성은 쿠키의 만료 기간, 도메인, 플래그(예: SecureHttpOnly) 등의 정보를 저장한다.

구현

웹 페이지를 담고 있는 웹 서버와 웹 브라우저 간에 가능한 통신. 여기서 서버는 쿠키를 브라우저에 보내고 브라우저는 다른 페이지를 요청할 때 해당 쿠키를 다시 보낸다.

쿠키는 임의 조각의 데이터로서, 웹 브라우저에 의해 선별되어 처음 송신되며 웹 브라우저에 의해 클라이언트 컴퓨터에 저장된다. 이후 브라우저는 상태(이전 이벤트 기억)를 무상태 HTTP 트랜잭션으로 유입시키면서 모든 요청을 서버로 되돌려 보낸다. 쿠키가 없으면 웹 페이지의 각각의 검색 또는 웹 페이지의 구성 요소가, 대체적으로 웹사이트상에서 사용자가 만드는 다른 모든 페이지와 무관한 별개의 이벤트로 취급된다. 쿠키가 일반적으로 웹 서버에 의해 설정되지만 자바스크립트와 같은 스크립트 언어를 사용하여 클라이언트에 의해 설정이 가능하다.(스크립트 언어에 의해 쿠키를 수정하지 못하게 하는 쿠키의 HttpOnly 플래그가 설정되어 있지 않는 경우에 한해)

쿠키 사양[10][11]은 쿠키 지원을 위해 브라우저가 다음의 요건을 충족할 것을 명시한다.

  • 4,096바이트 크기의 쿠키를 지원할 것
  • 한 도메인 당 최소 50개 쿠키를 지원할 것(예: 각 웹사이트 당)
  • 총 최소 3,000개 쿠키를 지원할 것.

쿠키 설정

쿠키는 Set-Cookie HTTP 헤더를 사용하여 설정되며 이는 웹 서버의 HTTP 응답을 통해 송신된다. 이 헤더는 웹 브라우저가 쿠키를 저장하고 이를 차기 서버 요청 시 송신할지를 지시한다. (브라우저는 쿠키가 미지원이거나 비활성화되어 있을 경우 이 헤더를 무시한다)

한 예로 브라우저는 www.example.org 웹사이트 홈페이지의 최초 요청을 송신한다:

GET /index.html HTTP/1.1Host: www.example.org...

서버는 2개의 Set-Cookie 헤더와 함께 응답한다:

서버의 HTTP 응답에는 웹사이트의 홈페이지 내용이 포함된다. 그러나 이는 브라우저가 2개의 쿠키를 설정할 것 또한 지시한다. 처음 theme은 세션 쿠키로 간주되는데 이는 Expires 또는 Max-Age 속성이 존재하지 않기 때문이다. 세션 쿠키는 브라우저가 닫힐 때 브라우저에 의해 삭제되는 구조이다. 두 번째 sessionToken은 영구 쿠키로 간주되는데 브라우저가 특정 날짜와 시간에 삭제하도록 지시하는 Expires 속성을 포함하기 때문이다.

그 다음 브라우저는 웹사이트에서 spec.html를 방문하기 위해 다른 요청을 보낸다. 이 요청은 Cookie HTTP 헤더가 포함되어 있으며 이는 서버가 브라우저에 설정을 지시하는 2개의 쿠키를 담고 있다:

GET /spec.html HTTP/1.1Host: www.example.orgCookie: theme=light; sessionToken=abc123

이러한 방식으로, 서버는 이 요청이 이전 것과 관련되어 있는지를 인지하게 된다. 서버는 요청된 페이지를 송신함으로써 응답하며 여기에는 새 쿠키 추가, 기존 쿠키 수정, 쿠키 삭제를 위해 응답에 더 많은 Set-Cookie 헤더를 포함할 수 있다.

쿠키 값은 페이지 요청에 응답하여 Set-Cookie 헤더를 포함시킴으로써 서버에 의해 수정이 가능하다. 브라우저는 이후 오래된 값을 새로운 값으로 치환한다.

쿠키의 값은 ,;, 공백 문자를 제외한 인쇄 가능한 모든 ASCII 문자(!에서 ~까지, 유니코드 \u0021에서 \u007E까지)로 구성될 수 있다. 쿠키의 이름은 = 및 동일 문자를 제외하는데, 그 이유는 이름과 값 사이를 구별하는 구분자 역할을 하기 때문이다. 쿠키 표준 RFC 2965는 더 제약이 있으나 브라우저에 의해 구현되지는 않는다.

쿠키 크럼(cookie crumb)이라는 용어는 쿠키의 이름-값 쌍을 의미하기 위해 사용되기도 한다.[12]

쿠키는 브라우저 내에서 실행되는 자바스크립트와 같은 스크립트 언어에 의해 설정할 수도 있다. 자바스크립트에서 document.cookie 객체는 이 목적을 위해 사용된다. 이를테면 document.cookie = "temperature=20"는 temperature의 쿠키 이름과 값 20을 만든다.[13]

같이 보기

각주

외부 링크

  • RFC 6265, the current official specification for HTTP cookies