티스토리 뷰
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
- Conflict
- getter
- Data Structure
- c언어
- this
- JavaScript
- jQuery
- 리덕스
- 알고리즘
- react
- Session
- useEffect
- 깃
- GIT
- Redux
- SQL
- 포인터 변수
- til
- CSS
- 제네릭스
- youtube data api
- 인스턴스
- 자바
- rxjs
- package.json
- linkedlist
- oracle
- Java
- 개발 공부
- Prefix Sums
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |