쿠키에 대해

Choi BinoChoi Bino
3 min read

쿠키는 브라우저에 저장되는 작은 텍스트 파일일 뿐이다. 쿠키에 대한 정보를 간직한 파일.

쿠키의 존재 목적

세션 관리

로그인, 쇼핑 카트, 게임 점수 또는 서버가 기억해야하는 기타 사항

개인화

사용자 기본 설정, 테마 및 기타 설정

추적

사용자 행동 기록 및 분석

But

쿠키는 모든 요청과 함께 전송되는 구조라 웹 앱의 성능이 저하될 수 있기 때문에 최소한으로 사용해야만 한다. 그래서 세션을 위해서만 사용되는 것이 일반적이며 나머지 용도로는 클라이언트 스토리지 API들이 권장됨.

쿠키 생성 과정

서버는 HTTP요청을 받은 뒤 Set-Cookie 응답 헤더를 보냄으로서 쿠키를 보낼 수 있음. 간단한 쿠키는 하단처럼 정의됨.

Set-Cookie: cookie-name=its+value

클라이언트에 응답하며 쿠키 생성 명령에 답장할 때

HTTP/2.0 200 OK
Content-Type: text/html
Set-Cookie: cookie-name=choco
Set-Cookie: session_id=1121231

이후 클라이언트가 이 쿠키를 가진 채로 페이지를 떠돌아다닐 시, 각 페이지 요청마다 쿠키가 띄워지게 된다.

GET /index.html HTTP/2.0
Host: bino.blog
Cookie: cookie-name=choco; session_id=1121231

쿠키 최대 개수

RFC 2109에 따르면 쿠키는 300개까지 만들 수 있으며 하나의 도메인 혹은 호스트에서는 최대 20개까지라고 나와있으나, 브라우저마다 상이하다.

쿠키 도메인

Domain=bino.blog

쿠키를 받을 수 있는 호스트를 지정할 수 있고, 지정하지 않는다면 하위 도메인을 포함한 현재 도메인이 기본값이 됨.

당연하겠지만 현재 내가 속하지 않은 도메인을 설정할 수 없음.

쿠키 경로

Path=/books

/ 를 적지 않거나 이상한 값을 넣는 등의 예외사항에서는 기본값인 현재 페이지가 속한 디렉토리가 주입됨.

쿠키의 수명

쿠키에 수명을 주는 방법은 두가지가 있음.

  • Expires (만료 날짜)

  • Max-age (최대 기간)

Expires

쿠키가 삭제되는 만료 날짜를 정함.

GMT로 표기

but, 브라우저와 서버간의 시간이 같다고 보장할 수 없기에 하단의 Max-age가 이후 출시되었고, 웬만하면 아래 방식을 권장.

Max-age

expires를 대체하기 위해 만들어짐. 서버와의 시간을 온전히 일치시킬 수 없는 문제를 대응하기 위한 존재 이유도 있지만 날짜를 직접 적는것보다 유효기간 카운트다운을 세는게 더 편리해서인 것도 있음.

쿠키 삭제 시점을 초 단위 (UNIX time) 로 설정함.

쿠키는 영구적인 목적으로 구현된 기술이 아니다.

하지만 그저 궁금증으로 상한선을 정하자면, 서버의 구조에 따라 달라지게 된다. 32비트 운영체제일 경우 2의 31승, 2147483647 값까지 유닉스 타임을 정할 수 있으며 이는 2038년까지의 기간이다. 그때까지 쿠키가 지속될 일은 없을 것이며, 있어서도 안될 것이다.

Max-age와 Expires가 동시에 적용되었을 경우

expires가 무시되고 max-age 적용

쿠키는 만료 날짜가 존재하며, 이를 지정하지 않으면 브라우저 종료와 함께 삭제됨. (만료 시간은 UTC 시간이어야 함)

값을 지정하지 않을 경우 세션 쿠키가 되어 브라우저 종료 시 사라짐.

SameSite

SameSite는 현재 페이지와 요청한 페이지의 도메인을 비교하여 쿠키를 전송할지 말지를 정하게 해주는 규칙이다. 쿠키는 요청한 대상의 도메인을 기준으로 전송될지 판단한다.

SameSite인지 판단하고 쿠키를 허용해주는 것.

값은 세가지가 올 수 있다.

  • Strict

  • Lax (기본값)

  • None

None

크롬의 정책이 바뀌기 이전에는 default 값이었다. 쿠키 사용 시 소스가 될 주소를 검증하지 않음. 쿠키를 가져가든 말든 신경쓰지 않음. (?) (https 진입만 허용)

Strict

강력히 제한함. 쿠키가 생성된 사이트와 동일한 곳에서만 쿠키가 전송됨.

Lax (default)

Strict처럼 작동하지만 a 태그나 link 태그 등의 몇가지 예외사항에서는 허용됨.

SameSite를 적절히 활용만 해도 CSRF에 쉽게 대응할 수 있음.

Priority

크롬에서만 지원. 쿠키 개수가 도메인 제한을 초과하게 되면 세 단계를 거쳐 삭제한다.

https://bugs.chromium.org/p/chromium/issues/detail?id=232693

쿠키 최대 크기

RFC 를 준수하는 브라우저라면 4096 미만으로 유지해야 하겠지만 브라우저마다 또 기기마다 다 미세하게 다르다. 것보단 쿠키 하나에 4000바이트나 넣는 행위부터 하지 말자

HttpOnly

브라우저에서 httpOnly를 지원하는 경우, 클라이언트에서 접근이 차단됨.

?? 옛날 브라우저면?

쿠키에 특정 속성을 부여할 때 접두사를 추가하여 속성의 필요를 브라우저에 알릴 수 있음.

"__Secure-" 로 시작하는 이름의 쿠키는 Secure 설정이 포함되어 있어야 하며, 그렇지 않을 시 거부됨.

Set-Cookie: __Secure-my-cookie;         # X
Set-Cookie: __Secure-my-cookie; Secure; # O

"__Host-"로 시작하는 이름의 쿠키는 path가 / 로 설정되어 있어야 하고, Domain 속성이 없어야 한다.

// / path가 없어서 거부됨
Set-Cookie: __Host-id=1; Secure

아직 작성되지 않은 내용

httpOnly는 안전한가

...

참조 문서

https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies

https://www.quirksmode.org/js/cookies.html

https://www.lifewire.com/cookie-size-limit-3466810

0
Subscribe to my newsletter

Read articles from Choi Bino directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Choi Bino
Choi Bino