퉁탕퉁탕 만들어보자

[HTTP 완벽 가이드] 쿠키 본문

Computer/Network

[HTTP 완벽 가이드] 쿠키

호숀티 2023. 2. 26. 18:29
반응형

Cookie 란? (너를 위해 구웠지)

작은 key-value 쌍으로 이루어진 데이터다.
사용자 식별을 위해 매우 널리 사용되는 방식이나, 단독으로 사용하기 보다는 여러 다양한 기술을 함께 사용한다.

쿠키의 종류

쿠키는 크게 세션쿠키/지속쿠키 두가지로 나뉜다. (차이점은 오직 파기되는 시점)

  • 세션쿠키: 브라우저를 닫으면 삭제됨. 사이트 탐색시의 설정/선호등을 임시저장
  • 지속쿠키: 디스크에 저장하여 브라우저를 닫거나 컴터 재시작에도 삭제되지 않음. 설정정보나 로그인이름을 유지
    쿠키에는 Discard 파라미터가 설정되어 있거나, Expires 혹은 Max-Age 파라미터가 없으면 세션쿠키가 된다.

동작 방식

쿠키는 key-value 형태의 리스트를 갖고, 그 데이터를 Set-Cookie 혹은 Set-Cookie2(확장헤더) 같은 HTTP response 헤더에 기술하여 서버에서 사용자로 전달한다.

 

사용자                                            서버

               ------- 접속 ------>

                                                  쿠키 생성

             <----- 응답 w/쿠키 ----

               ----- 요청 w/쿠키 ---->

예1)
Cookie: id=34294 (서버에서 식별가능한 사용자 ID)

 

예2)
Cookie: name="Eddie Munson": phone="010-111-2222"

 

브라우저는 받은 쿠키를 브라우저의 쿠키 데이터베이스에 저장한다. 사용자가 동일한 사이트에 재방문 시, 브라우저는 서버가 이 사용자에게 주었던 쿠키를 쿠키 요청 헤더에 넣어서 전송한다.

쿠키 상자

브라우저마다 쿠키 저장방식은 약간 다르지만 크롬의 예를 보자
크롬은 SQLite 파일에 아래와 같이 쿠키를 저장한다.

사이트마다 다른 쿠키

브라우저는 쿠키를 생성한 서버에게만 쿠키 정보를 보낸다.

www.naver.com  에서 생된 쿠키는 www.naver.com 에만 보내고, www.google.com  에는 보내지 않는다.

위의 Domain 속성을 통해서 어떤 사이트가 그 쿠키를 읽을 수 있는지 제어한다.

 

쿠키 명세와 구성요소

현재 사용되는 쿠키 spec 에는 Version 0 쿠키 (넷스케이프 쿠키) 와 Version 1 쿠키 (RFC 2965) 가 있다.

Version 1 쿠키는 Version 0 의 확장으로, 널리 쓰이지는 않는다. 

 

버전 0 쿠키의 Set-Cookie 필드들

* Domain: 쿠키를 발행한 도메인. 특정 도메인에만 쿠키를 제한적으로 전달할 수 있게 한다. 도메인이 없다면 Set-Cookie 응답을 생성한 서버의 호스트명을 기본값으로 사용한다.

* Name: (Mandatory) 쿠키이름

* Value: (Mandatory) 값

* Path: 도메인 하위 경로. 해당 path 에서만 쿠키를 받게된다.

* Expires/Max-age: 쿠키의 파기 시점. 파기 일자에 다다르면 쿠키는 삭제되고 전달되지 않는다. 해당 필드가 없다면 session 종료시 파기된다.

* Secure: SSL커넥션에만 보낼것인가 여부

 

쿠키와 캐시

쿠키와 관련된 문서를 캐시할 때 주의해서 해야한다.

 

응답에 Set-Cookie 헤더가 있다면 본문은 캐시 할 수 있자만 Set-Cookie 헤더는 캐시하지 않는 것이 좋다.

왜냐하면 캐시를 통해 Set-Cookie 헤더를 여러 사용자에게 보내면 추적이 안되기 때문.

어떤 캐시는 응답 저장 전 Set-Cookie 헤더를 제거하고 캐시를 한다. 하지만, 그러면 클라이언트가 캐시된 응답을 받을 때 Set-Cookie 헤더가 없는 데이터를 받게 되는 문제가 있다.

 

이 문제는 다음과 같이 해결한다.

캐시가 모든 요청마다 원 서버와 재검사를 해서 클라이언트로 가는 응답에 Set-Cookie 헤더를 만들어준다.

서버는 다음과 같은 헤더를 캐시문서에 추가해서 재검사를 하도록 만들 수 있다.

Cache-Control: must-revalidate, max-age=0

 

더 보수적인 캐시는 캐시되는 데이터라도 Set-Cookie 헤더를 갖고있다면 아얘 캐시하지 않음을 선택한다.

해당 문서가 Set-Cookie 를 제외하고 캐시되어야 할 때는 Cache-Control: no-cache="Set-Cookie" 라고 기술한다.

(하지 않는 서버도 있다)

쿠키와 보안 개인정보

쿠키에 대한 보안상의 공포가 있는데, 서버 쪽 원격 DB에 개인정보를 저장하고, 해당 키를 쿠키에 보내는 식으로 사용하면 서버-클라 간에 예민한 데이터가 오가는 것을 줄일 수 있다. 잘 활용하면 매우 유용!

 

 

728x90
반응형