HTTP 쿠키

HTTP **HTTP 쿠키**(HTTP cookie)란 웹 서버에 의해 사용자의 컴퓨터에 저장되는, '이름을 가진 작은 크기의 데이터'이다. 인터넷 사용자가 어떠한 웹사이트를 방문할 경우 사용자의 웹 브라우저를 통해 인터넷 사용자의 컴퓨터나 다른 기기에 설치되는 작은 기록 정보 파일을 일컫는다.issn=1598-2858 **쿠키**, **웹 쿠키**, **브라우저 쿠키**라고도 한다. 이 기록 파일에 담긴 정보는 인터넷 사용자가 같은 웹사이트를 방문할 때마다 읽히고 수시로 새로운 정보로 바뀐다. 이 수단은 넷스케이프의 프로그램 개발자였던 루 몬툴리가 고안한 뒤로 오늘날 많은 서버 및 웹사이트들이 브라우저의 신속성을 위해 즐겨 쓰고 있다.확인날짜=2020-07-16 쿠키는 소프트웨어가 아니다. 쿠키는 컴퓨터 내에서 프로그램처럼 실행될 수 없으며 바이러스를 옮길 수도, 악성코드를 설치할 수도 없다. 하지만 스파이웨어를 통해 유저의 브라우징 행동을 추적하는데에 사용될 수 있고, 누군가의 쿠키를 훔쳐서 해당 사용자의 웹 계정 접근권한을 획득할 수도 있다.
# 배경
HTTP 쿠키는 저명한 구운 간식과 같은 이름을 공유한다.
## 이름의 기원
"쿠키"라는 용어는 웹 브라우저 프로그래머 루 몬툴리가 만들어냈다. 이는 유닉스 프로그래머들이 사용한, 프로그램이 수신 후 변경하지 않은 채로 반환하는 데이터의 패킷을 의미하는 매직 쿠키라는 용어에서 비롯된 것이다.accessdate=19 October 2017accessdate=8 September 2017
## 역사
매직 쿠키는 루 몬툴리가 1994년 6월 웹 통신에서 이것들을 사용하겠다는 생각을 했을 때 컴퓨팅에 이미 사용되고 있었다.date=2001-09-04 당시 그는 넷스케이프 커뮤니케이션스의 직원이었으며 MCI를 위한 전자 상거래 애플리케이션을 개발하고 있었다. 빈트 서프와 존 클렌신은 넷스케이프 커뮤니케이션스와의 기술 토론에서 MCI를 제시했다. MCI는 서버가 부분적인 트랜잭션 상태를 보유하는 것을 원치 않았으나 이러한 이유로 이들은 넷스케이프에게 각 사용자의 컴퓨터의 상태를 저장하는 방법을 강구할 것을 대신 요청하였다. 쿠키는 가상 쇼핑 카트를 신뢰성있게 구현할 때의 문제의 해결책을 제공하였다.Kesan, Jey; and Shah, Rajiv ; *Deconstructing Code*, SSRN.com, chapter II.B (Netscape's cookies), Yale Journal of Law and Technology, 6, 277–389Kristol, David; *HTTP Cookies: Standards, privacy, and politics*, ACM Transactions on Internet Technology, 1(2), 151–198, 2001 10.1145/502152.502153 (an expanded version is freely available at arXiv:cs/0105018v1 [cs.SE])
# 구조
쿠키는 다음의 요소로 구성된다:194487945Jim Manico quoting Daniel Stenberg, Real world cookie length limits date=2013-07-02 # 이름 # 값 # 0개 이상의 속성 (이름/값 쌍). 속성은 쿠키의 만료 기간, 도메인, 플래그(예: `Secure` 및 `HttpOnly`) 등의 정보를 저장한다.
# 구현
웹 페이지를 담고 있는 웹 서버와 웹 브라우저 간에 가능한 통신. 여기서 서버는 쿠키를 브라우저에 보내고 브라우저는 다른 페이지를 요청할 때 해당 쿠키를 다시 보낸다. 쿠키는 임의 조각의 데이터로서, 웹 브라우저에 의해 선별되어 처음 송신되며 웹 브라우저에 의해 클라이언트 컴퓨터에 저장된다. 이후 브라우저는 상태(이전 이벤트 기억)를 무상태 HTTP 트랜잭션으로 유입시키면서 모든 요청을 서버로 되돌려 보낸다. 쿠키가 없으면 웹 페이지의 각각의 검색 또는 웹 페이지의 구성 요소가, 대체적으로 웹사이트상에서 사용자가 만드는 다른 모든 페이지와 무관한 별개의 이벤트로 취급된다. 쿠키가 일반적으로 웹 서버에 의해 설정되지만 자바스크립트와 같은 스크립트 언어를 사용하여 클라이언트에 의해 설정이 가능하다.(스크립트 언어에 의해 쿠키를 수정하지 못하게 하는 쿠키의 HttpOnly 플래그가 설정되어 있지 않는 경우에 한해) 쿠키 사양IETF [//tools.ietf.org/html/rfc6265 HTTP State Management Mechanism, Apr, 2011] Obsoletes RFC 2965date=c. 1999은 쿠키 지원을 위해 브라우저가 다음의 요건을 충족할 것을 명시한다. * 4,096바이트 크기의 쿠키를 지원할 것 * 한 도메인 당 최소 50개 쿠키를 지원할 것(예: 각 웹사이트 당) * 총 최소 3,000개 쿠키를 지원할 것.
## 쿠키 설정
쿠키는 `Set-Cookie` HTTP 헤더를 사용하여 설정되며 이는 웹 서버의 HTTP 응답을 통해 송신된다. 이 헤더는 웹 브라우저가 쿠키를 저장하고 이를 차기 서버 요청 시 송신할지를 지시한다. (브라우저는 쿠키가 미지원이거나 비활성화되어 있을 경우 이 헤더를 무시한다) 한 예로 브라우저는 `www.example.org` 웹사이트 홈페이지의 최초 요청을 송신한다: 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개의 쿠키를 담고 있다: 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)이라는 용어는 쿠키의 이름-값 쌍을 의미하기 위해 사용되기도 한다.url-status=live 쿠키는 브라우저 내에서 실행되는 자바스크립트와 같은 스크립트 언어에 의해 설정할 수도 있다. 자바스크립트에서 `document.cookie` 객체는 이 목적을 위해 사용된다. 이를테면 `document.cookie = "temperature=20"`는 temperature의 쿠키 이름과 값 20을 만든다.url-status=live