쿠키란?

  • http는 stateless한 특징을 가지고 있다
  • cookie는 서버에서 브라우저에게 보내는 데이터이다. 보통 유저를 식별하는 용도로 사용되어 브라우저에서 서버에 request를 보낼때 cookie를 넣어서 보내면 서버에서 어떤 브라우저가 요청을 보냈는지 구분할때 사용된다. => cookie를 사용하면 http를 stateful하게 사용할 수 있다
  • 일반적으로
    • 세션 관리
    • 유저 세팅
    • 유저 행동을 tracking하기 위해 사용된다

쿠키 생성

  • 서버에서 http request 받은 후 Set-Cookie 헤더에 1개 이상의 쿠키를 넣어서 보낸다
  • 브라우저는 해당 쿠키를 저장한 후 서버에 request를 보낼때 마다 쿠키를 같이 보낸다
  • 서버에서는 domain, path로 쿠키를 받을 수 있는 곳을 제한하거나 expiration date로 쿠키가 보내질 수 있는 시간을 제한할 수 있다

쿠키 lifetime

  • permanent cookie는 expiration date가 명시되어 있으면 해당 date 이 후 삭제된다
  • session cookie는 브라우저에서 세션 종료 요청을 서버에 보낼 시 session이 종료되면서 삭제된다

쿠키 접근제한

  • HTTPS인 경우 브라우저가 서버에 Secure 옵션과 쿠키를 같이 보내는데 이렇게 보낼 경우 man in the middle attack에 보호가 되어 중간에 쿠키를 쉽게 가로챌 수 없게된다
  • HttpOnly 속성을 포함한 쿠키는 Javascript Document.Cookie API로 접근할 수 없게 되어 XSS 공격에 안전하다

Domain

  • Domain 속성은 어떤 호스트에서 쿠키를 받을 수 있는지에 대한 정보를 갖는다. 해당 속성을 기입하지 않은 경우 subdomain을 제외한 쿠키를 설정하는 host와 같은 host 에서만 쿠키를 받을 수 있다 (host domain: aaa.com, subdomain: bbb.aaa.com)
  • Domain 속성을 작성하면 subdomain에서도 쿠키를 받을 수 있다

Path

  • Path 속성은 request를 보낸 URL이 가져야할 path 정보이다. 예를 들어 Path=/docs 인 경우 /docs/test 와 같이 request URL이 /docs를 가지고 있어야지 Cookie header를 해당 host에 보내줄 수 있게 된다

SameSite

  • 서버에서 cross-site request를 허용하는 지에 대한 정보를 가지고 있는 속성이다 (cross-site request는 다른 domain에서의 요청이다)
  • CSRF 공격에 보호하기 위해 사용된다
  • default는 Lax이고 Strict, None 옵션을 줄 수 있다
    • Strict는 same site
    • Lax는 same site + 유저가 쿠키의 origin site로 이동 했을때
    • None은 same site + cross site

쿠키 prefix

  • 쿠키에 prefix를 주어서 어떤 경우 Set-Cookie header에 쿠키가 넣어지는지 명시 할 수 있다
  • __Host- = Secure 속성 포함 + secure origin + Domain 속성 없음 + Path=/ 인 경우 (요 속성은 domain에 제한된 속성이라고도 불린다)
  • __Secure- = Secure 속성 포함 + secure origin 인 경우

쿠키 관련 규정

  • 글로벌로 적용되는 규정에는 아래와 같은 것이 포함되어 있다
  • 유저가 쿠키 수집을 거부할 수 있어야함
  • 사이트에서 쿠키가 사용되는지 알려야함
  • 쿠키 없이 유저가 서비스의 대부분을 사용할 수 있어야함

😊