HTTP 쿠키

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

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

## 배경
섬네일|HTTP 쿠키는 저명한 구운 간식과 같은 이름을 공유한다.
### 이름의 기원
"쿠키"라는 용어는 웹 브라우저 프로그래머 루 몬툴리가 만들어냈다. 이는 유닉스 프로그래머들이 사용한, 프로그램이 수신 후 변경하지 않은 채로 반환하는 데이터의 패킷을 의미하는 매직 쿠키라는 용어에서 비롯된 것이다.
### 역사
매직 쿠키는 루 몬툴리가 1994년 6월 웹 통신에서 이것들을 사용하겠다는 생각을 했을 때 컴퓨팅에 이미 사용되고 있었다. 당시 그는 넷스케이프 커뮤니케이션스의 직원이었으며 MCI를 위한 전자 상거래 애플리케이션을 개발하고 있었다. 빈트 서프와 존 클렌신은 넷스케이프 커뮤니케이션스와의 기술 토론에서 MCI를 제시했다. MCI는 서버가 부분적인 트랜잭션 상태를 보유하는 것을 원치 않았으나 이러한 이유로 이들은 넷스케이프에게 각 사용자의 컴퓨터의 상태를 저장하는 방법을 강구할 것을 대신 요청하였다. 쿠키는 가상 쇼핑 카트를 신뢰성있게 구현할 때의 문제의 해결책을 제공하였다.

## 구조
쿠키는 다음의 요소로 구성된다:

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

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

쿠키 사양은 쿠키 지원을 위해 브라우저가 다음의 요건을 충족할 것을 명시한다.
* 4,096바이트 크기의 쿠키를 지원할 것
* 한 도메인 당 최소 50개 쿠키를 지원할 것(예: 각 웹사이트 당)
* 총 최소 3,000개 쿠키를 지원할 것.

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

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

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


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

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

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

```http
GET /spec.html HTTP/1.1
Host: www.example.org
Cookie: theme=light; sessionToken=abc123
…
```


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

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

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

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

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

## 같이 보기
* DHTML

## 각주

## 외부 링크

* RFC 6265, the current official specification for HTTP cookies

분류:컴퓨터 접근 제어
분류:HTTP 헤더
분류:인터넷 프라이버시
분류:웹 취약점 공격
분류:추적