{{위키데이터 속성 추적}}
{{HTTP}}
'''HTTP 쿠키'''({{lang|en|HTTP cookie}})란 [[웹 서버]]에 의해 사용자의 컴퓨터에 저장되는, '이름을 가진 작은 크기의 [[데이터]]'이다. [[인터넷]] 사용자가 어떠한 웹사이트를 방문할 경우 사용자의 웹 브라우저를 통해 인터넷 사용자의 컴퓨터나 다른 기기에 설치되는 작은 기록 정보 파일을 일컫는다.<ref>{{저널 인용|제목=Design ＆ Implementation of License-based Digital Rights Management System|저널=The KIPS Transactions:PartC|url=http://dx.doi.org/10.3745/kipstc.2004.11c.1.055|날짜=2004-02-01|권=11C|호=1|쪽=55–62|doi=10.3745/kipstc.2004.11c.1.055|issn=1598-2858}}</ref> '''쿠키''', '''웹 쿠키''', '''브라우저 쿠키'''라고도 한다. 이 기록 파일에 담긴 정보는 인터넷 사용자가 같은 웹사이트를 방문할 때마다 읽히고 수시로 새로운 정보로 바뀐다. 이 수단은 [[넷스케이프]]의 프로그램 개발자였던 [[루 몬툴리]]가 고안한 뒤로 오늘날 많은 서버 및 웹사이트들이 브라우저의 신속성을 위해 즐겨 쓰고 있다.<ref>{{뉴스 인용|url=https://www.nytimes.com/2001/09/04/business/giving-web-a-memory-cost-its-users-privacy.html|제목=Giving Web a Memory Cost Its Users Privacy|성=Schwartz|이름=John|날짜=2001-09-04|뉴스=The New York Times|언어=en-US|issn=0362-4331|확인날짜=2020-07-16}}</ref>

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

== 배경 ==
[[파일:Cookie stack.jpg|섬네일|HTTP 쿠키는 저명한 구운 간식과 같은 이름을 공유한다.]]
=== 이름의 기원 ===
"쿠키"라는 용어는 웹 브라우저 프로그래머 [[루 몬툴리]]가 만들어냈다. 이는 [[유닉스]] 프로그래머들이 사용한, 프로그램이 수신 후 변경하지 않은 채로 반환하는 데이터의 패킷을 의미하는 [[매직 쿠키]]라는 용어에서 비롯된 것이다.<ref>{{웹 인용|url=http://dominopower.com/article/where-cookie-comes-from/|title=Where cookie comes from :: DominoPower|website=dominopower.com|accessdate=19 October 2017}}</ref><ref>{{웹 인용|last1=Raymond|first1=Eric (ed.)|title=magic cookie|url=http://catb.org/jargon/html/M/magic-cookie.html|website=The Jargon File  (version 4.4.7)|accessdate=8 September 2017}}</ref>
=== 역사 ===
매직 쿠키는 루 몬툴리가 1994년 6월 웹 통신에서 이것들을 사용하겠다는 생각을 했을 때 컴퓨팅에 이미 사용되고 있었다.<ref>{{뉴스 인용|url=https://www.nytimes.com/2001/09/04/technology/04COOK.html |work=The New York Times |first=John |last=Schwartz |title=Giving Web a Memory Cost Its Users Privacy |date=2001-09-04 }}</ref> 당시 그는 [[넷스케이프 커뮤니케이션스]]의 직원이었으며 [[MCI]]를 위한 [[전자 상거래]] 애플리케이션을 개발하고 있었다. [[빈트 서프]]와 [[존 클렌신]]은 넷스케이프 커뮤니케이션스와의 기술 토론에서 MCI를 제시했다. MCI는 서버가 부분적인 트랜잭션 상태를 보유하는 것을 원치 않았으나 이러한 이유로 이들은 넷스케이프에게 각 사용자의 컴퓨터의 상태를 저장하는 방법을 강구할 것을 대신 요청하였다. 쿠키는 [[쇼핑 카트 소프트웨어|가상 쇼핑 카트]]를 신뢰성있게 구현할 때의 문제의 해결책을 제공하였다.<ref name="ks">Kesan, Jey; and Shah, Rajiv ; [http://papers.ssrn.com/sol3/papers.cfm?abstract_id=597543 ''Deconstructing Code''], SSRN.com, chapter II.B (Netscape's cookies), Yale Journal of Law and Technology, 6, 277–389</ref><ref name="kristol">Kristol, David; ''HTTP Cookies: Standards, privacy, and politics'', ACM Transactions on Internet Technology, 1(2), 151–198, 2001 {{DOI|10.1145/502152.502153}} (an expanded version is freely available at [https://arxiv.org/abs/cs.SE/0105018 arXiv:cs/0105018v1 [cs.SE&#93;])</ref>

== 구조 ==
쿠키는 다음의 요소로 구성된다:<ref name="Peng, Weihong 2000">{{웹 인용|title=HTTP Cookies, A Promising Technology|work=Proquest|publisher=Online Information Review|author=Peng, Weihong|author2=Cisna, Jennifer|year=2000|id={{ProQuest|194487945}}}}</ref><ref name="Stenberg, Daniel 2009">Jim Manico quoting Daniel Stenberg, [http://manicode.blogspot.it/2009/08/real-world-cookie-length-limits.html Real world cookie length limits] {{Webarchive|url=https://web.archive.org/web/20130702114435/http://manicode.blogspot.it/2009/08/real-world-cookie-length-limits.html |date=2013-07-02 }}</ref>

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

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

쿠키 사양<ref name="httponlyrfc">IETF [//tools.ietf.org/html/rfc6265 HTTP State Management Mechanism, Apr, 2011] Obsoletes RFC 2965</ref><ref>{{웹 인용|title=Persistent client state HTTP cookies: Preliminary specification |url=http://wp.netscape.com/newsref/std/cookie_spec.html |archiveurl=https://web.archive.org/web/20070805052634/http://wp.netscape.com/newsref/std/cookie_spec.html |publisher=Netscape |archivedate=2007-08-05 |date=c. 1999 }}</ref>은 쿠키 지원을 위해 브라우저가 다음의 요건을 충족할 것을 명시한다.
* 4,096바이트 크기의 쿠키를 지원할 것
* 한 도메인 당 최소 50개 쿠키를 지원할 것(예: 각 웹사이트 당)
* 총 최소 3,000개 쿠키를 지원할 것.

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

한 예로 브라우저는 <code>www.example.org</code> 웹사이트 홈페이지의 최초 요청을 송신한다:
<syntaxhighlight lang="http">
GET /index.html HTTP/1.1
Host: www.example.org
...
</syntaxhighlight>

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

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

그 다음 브라우저는 웹사이트에서 <code>spec.html</code>를 방문하기 위해 다른 요청을 보낸다. 이 요청은 <code>Cookie</code> HTTP 헤더가 포함되어 있으며 이는 서버가 브라우저에 설정을 지시하는 2개의 쿠키를 담고 있다:
<syntaxhighlight lang="http">
GET /spec.html HTTP/1.1
Host: www.example.org
Cookie: theme=light; sessionToken=abc123
…
</syntaxhighlight>

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

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

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

쿠키 크럼(cookie crumb)이라는 용어는 쿠키의 이름-값 쌍을 의미하기 위해 사용되기도 한다.<ref name="CrumbExample">{{웹 인용|url=http://msdn2.microsoft.com/en-us/library/ms533693.aspx |title=Cookie Property |work=MSDN |publisher=Microsoft |accessdate=2009-01-04 |archive-url=https://web.archive.org/web/20080405180445/http://msdn2.microsoft.com/en-us/library/ms533693.aspx |archive-date=2008-04-05 |url-status=live }}</ref>

쿠키는 브라우저 내에서 실행되는 [[자바스크립트]]와 같은 스크립트 언어에 의해 설정할 수도 있다. 자바스크립트에서 <code>document.cookie</code> 객체는 이 목적을 위해 사용된다. 이를테면 <code>document.cookie = "temperature=20"</code>는 temperature의 쿠키 이름과 값 20을 만든다.<ref>{{뉴스 인용|first=Ross |last=Shannon |url=http://www.yourhtmlsource.com/javascript/cookies.html |title=Cookies, Set and retrieve information about your readers |publisher=HTMLSource |date=2007-02-26 |accessdate=2009-01-04 |archive-url=https://www.webcitation.org/61DWzt4OP?url=http://www.yourhtmlsource.com/javascript/cookies.html |archive-date=2011-08-26 |url-status=live }}</ref>

== 같이 보기 ==
* [[DHTML]]

== 각주 ==
{{각주}}

== 외부 링크 ==
{{위키공용분류|2=}}
* RFC 6265, the current official specification for HTTP cookies

{{웹 브라우저}}
{{기본정렬:Http 쿠키}}

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