티스토리 뷰

공부일지(TIL)/Web

쿠키

Alledy 2021. 3. 18. 16:04

HTTP 트랜잭션은 상태가 없다(stateless). 각 요청 및 응답은 독립적으로 일어난다.

하지만 웹사이트는 사용자의 상태를 남기고 싶어한다. 예를 들어서 로그인하지 않고도 장바구니에 담은 기록이 유지되도록 하고 싶을 수 있다.

상태를 유지하려면 웹사이트는 각 사용자에게서 오는 HTTP 트랜잭션을 식별할 방법이 필요하다.

HTTP가 사용자를 식별하는 방법에는 아래와 같은 것들이 있는데, 쿠키에 대해서만 보려고 한다.

  • 식별 정보가 있는 HTTP 헤더
  • 클라이언트 IP 주소 추적
  • 사용자 로그인 인증
  • URL에 식별자를 포함하는 fat url
  • 쿠키

쿠키

쿠키는 일종의 클라이언트 상태 정보로, 사용자를 식별하기 위해 서버가 생성하여 브라우저에게 전달하는 것이다. 브라우저는 받은 쿠키를 갖고 있다가 유효한 서버에 재전달하여 내가 어떤 클라이언트인지 서버가 식별할 수 있도록 한다.

종류

  • 세션 쿠키: 임시 쿠키. 브라우저를 닫으면 삭제된다.
  • 지속 쿠키: 디스크에 저장되어 브라우저를 닫거나 컴퓨터를 재부팅해도 남아 있다. 지속 쿠키는 사용자가 주기적으로 방문하는 사이트에 대한 정보를 유지하려고 사용한다. 예를 들어 자동 로그인 같은 것이 있다.

두 타입이 다른 점은 파기 시점뿐이다. Discard 파라미터가 설정돼 있거나, 파기되기까지 남은 시간을 가리키는 Expires 혹은 Max-Age 파라미터가 없으면 세션 쿠키이다.

쿠키의 동작 방법

웹 서버는 사용자가 처음 방문했을 때 해당 사용자를 식별하기 위한 유일한 값을 쿠키에 할당한다.

이 쿠키는 이름, 값 형태의 리스트를 갖게 되고 이 리스트는 Set-Cookie 혹은 Set-Cookie2 같은 HTTP Response 헤더에 기술되어 사용자에게 전달한다.

브라우저는 서버로부터 받은 Set-Cookie, Set-Cookie2 헤더에 있는 쿠키 컨텐츠를 브라우저 쿠키 DB에 저장한다.

그러면 그 사이트를 재방문하게 될 때 브라우저는 해당 쿠키를 Cookie 요청 헤더에 담아서 쿠키를 줬던 서버에게 다시 보낸다.

보통 브라우저는 여러 사이트로부터 받은 쿠키를 갖고 있지만, 쿠키를 생성한 서버에게만 그 쿠키를 보낸다. 서버는 HTTP 응답 헤더에 Domain 속성을 이용해서 어떤 사이트가 그 쿠키를 읽을 수 있는지 제어할 수 있다.

Set-cookie: user="dy1111"; domain="tistory.com"

예를 들어 응답 헤더에 위와 같은 필드가 있었다면 도메인이 tistory.com 인 모든 사이트(e.g. developer-alle.tistory.com)에만 user="dy1111" 라는 정보를 전달하라는 의미이다.

이 특성을 활용하여 광고사는 거대한 데이터를 구축하기도 한다. 예를 들어서 하나의 광고사 서버를 여러 개의 웹사이트들이 사용하고, 지속 쿠키를 심어둔다면 한 유저가 여러 사이트에 방문하더라도 계속 똑같은 쿠키를 광고사 서버에 보내게 된다. 왜냐하면 지속 쿠키의 Domain이 같기 때문이다. 그래서 A 쇼핑몰에서 청바지를 봤더라도 전혀 무관한 B 사이트에 방문했을 때 청바지 광고가 뜰 수도 있는 것이다.

쿠키는 특정 경로에서만 받도록 설정할 수도 있다.

쿠키에 담긴 정보

쿠키는 기본적으로 사용자를 식별하기 위해 붙이는 값이므로, 기본적으로 아이디와 같은 식별 정보가 포함되지만 이 외에도 어떤 정보든 포함시킬 수 있다.

쿠키 명세에는 Version 0 쿠키(넷스케이프 쿠키)Version 1 쿠키가 있는데, Version 0 쿠키가 널리 쓰이므로 이를 기준으로 Set-cookie 필드를 보자.

  • 이름=값: Set-cookie 에 필수적으로 하나 이상의 이름=값 쌍이 필요하다. 사용자가 다시 웹 서버를 방문했을 때 읽어올 값이다.
  • Expires (optional): 쿠키의 생명 주기를 나타낸다. 이 필드가 없으면 그 쿠키는 세션이 끝날 때 파기된다.
  • Domain (optional): 도메인 속성을 설정하면 이 도메인을 사용하는 서버에게만 쿠키를 전송할 수 있게 제한된다. 도메인이 명시되어 있지 않으면 Set-Cookie 응답을 생성한 서버의 호스트명을 기본값으로 사용한다.
  • Path (optional): 특정 경로에 방문할 때 쿠키를 보내도록 한다. 예를 들어 /foo 경로는 /foobar 이나 /foo/bar 에도 들어맞는다.
  • Secure (optional): 이 속성이 있으면 HTTP가 SSL 보안 연결을 사용할 때에만 쿠키를 전송한다.

예시로 회사 사이트에 방문했을 때 보이는 HTTP 응답 헤더 중 하나를 꺼내왔다. 네이버 애널리틱스 서버에서 보낸 헤더인데, 아마도 식별값으로 보이는 필드와 Expires, Domain, Path, Secure 속성 등을 볼 수 있다.

set-cookie: NWB=8fee552dcdbdcb2c575e1a9095075fcb.1612521503114; Expires=Wed, 20-May-26 16:17:46 GMT; Domain=wcs.naver.com; Path=/; Secure; SameSite=None

반대로 클라이언트 요청 헤더에는, 위에서 본 필터들이 현재 방문하는 사이트에 들어맞으면 아직 파기되지 않은 쿠키들을 함께 Cookie 필드에 붙여 보낸다.

Ref

HTTP 완벽 가이드 (프로그래밍 인사이트 출판)

'공부일지(TIL) > Web' 카테고리의 다른 글

스크립트 로딩 (async, defer)  (0) 2021.07.20
Window vs Document  (0) 2021.07.20
NPM & Yarn Dependency model  (0) 2021.03.10
History Type - Browser, Hash  (0) 2021.02.16
History Object and Methods  (0) 2021.02.15
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함