[HTTP] 쿠키

JJBIN·2024년 3월 29일

HTTP

목록 보기
5/6

1. 쿠키

1) 개요

HTTP는 상태를 갖지 않는다. 각 요청을 별도로 처리하기 때문에 쉽고 빠르게 구현 및 확장가능하다.
그럼에도 불구하고 서버가 클라이언트의 상태를 기억해야 하는 경우 쿠키를 사용한다.

쿠키는 서버에 의해 생성되어 응답을 통해 클라이언트로 전달되며 클라이언트(브라우저)에 의해 관리된다.

HTTP/2.0 200 OK
Content-Type: text/html
Set-Cookie: yummy_cookie=choco
Set-Cookie: tasty_cookie=strawberry
  • 서버는 쿠키를 생성한 뒤 Set-cookie 헤더를 통해 응답에 포함시켜 클라이언트로 전송한다.
  • 서버는 여러개의 Set-cookie 헤더를 사용해 한번에 여러 쿠키를 생성 및 전달할 수 있다.

GET /sample_page.html HTTP/2.0
Host: www.example.org
Cookie: yummy_cookie=choco; tasty_cookie=strawberry
  • 클라이언트는 쿠키를 저장한다. 이후 브라우저에 의해 HTTP 요청 시 자동으로 쿠키를 포함하여 전달한다.
  • 클라이언트는 Cookie 헤더에 세미콜론(;)으로 구분하여 여러 쿠키를 전송할 수 있다.
  • 매번 클라이언트가 직접 정보를 전달할 필요가 없어 편리하다.


A. 쿠키의 용도

세션 관리

  • 로그인 정보, 장바구니, 게임 점수 또는 서버가 기억해야 하는 기타 모든 것

개인화

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

추적

  • 사용자 행동 기록 및 분석 (광고 및 추천 등에 사용)

B. 주의점

쿠키는 브라우저를 통해 자동으로 서버에 전송된다. 이는 편리하지만 몇가지 문제점도 야기한다.

  • 불필요한 네트워크 트래픽 추가
  • 매 요청마다 자동으로 같이 전송되기에 탈취당할 가능성이 높음
  • 쿠키에는 최소한의 정보만 사용해야 한다. (세션 id, 인증 토큰 등)

매번 서버에 전송하지 않고, 웹 브라우저 내부에 데이터를 저장하고 싶으면 localStorage나 sessionStorage를 사용하자.


2) Format

Set-cookie: id = "user1"; Expires = Mon, 16 Jan 2023 22:00:00 GMT;
		Max-age=3600; Domain="thedomain.com"; Path="/example"; Secure; HttpOnly

쿠키는 <이름>=<값> 쌍으로 이루어지는 필수 값과 그밖에 부가적인 속성들로 이루어진다.
각 부분들은 세미콜론을 통해 구분된다.
위 쿠키의 이름은 id이며 "user1"값을 가진다. 나머지 부분은 만료 시간, 보안 설정등 부가적인 정보를 나타낸다.


A. 시간(만료) 속성

만료 속성을 지정하지 않을 시 세션 쿠키가 된다.

영속 쿠키 : 브라우저가 종료되어도 해당 만료되기 전까지 유지된다.
세션 쿠키 : 브라우저 종료 시에 삭제된다.

Expires

  • Expires = Mon, 16 Jan 2023 22:00:00 GMT;
  • 쿠키 만료일을 나타낸다. 만료일이 되면 브라우저는 해당 쿠키를 삭제한다.

Max-age

  • Max-age=3600;
  • 쿠키의 최대 수명(초 단위). 해당 시간이 모두 흐르면 쿠키를 삭제한다.
  • 0이나 음수 지정시 즉시 쿠키를 만료시킨다.
  • Expires 보다 우선순위가 높다.


B. 범위 속성

HTTP 요청 시 브라우저가 자동으로 쿠키를 포함시킨다.
하지만 아무 쿠키나 포함시키는 것은 아니다.
브라우저는 Domain과 Path 속성을 확인하여 선택적으로 쿠키를 포함시킨다.

Domain

  • Domain="thedomain.com";
  • 쿠키가 전송될 호스트를 정의한다.
  • 명시된 도메인과 서브 도메인을 포함한다.
  • 생략시 현재 문서의 호스트로 설정된다. 이 경우 서브 도메인을 포함하지 않는다.

Path

  • Path="/example";
  • 해당 URL 경로를 포함한 하위 경로에만 쿠키 전송
  • 일반적으로 루트로 지정. Path="/"


C. 보안 관련 속성

Secrue

  • 해당 옵션 지정 시 HTTPS인 경우에만 쿠키 전송
  • 쿠키가 평문(HTTP)으로 전송되는 것을 막고 싶을 때 사용한다.

HttpOnly

  • Script를 통해 쿠키에 접근하는 것을 금지한다. (Documente.cookie 등)
  • XSS 공격으로 인한 쿠키 탈취를 방지한다.
    XSS(Cross-site scripting)는 사용자 정보를 해커에게 전송하는 등의 악성 스크립트가 실행되도록 유도하는 공격 방식이다.

SameSite

  • SameSite=<samesite-value>
  • CSRF(Cross-Site Request Forgery) 공격 방지
    CSRF(Cross-Site Request Forgery)는 신뢰할 수 있는 사용자를 사칭하여 공격자의 요청이 사용자의 요청인 것처럼 속이는 공격 방식이다.

samesite-value는 Strict, Lax, None 3가지가 있다.

  • Strict : 가장 보수적인 정책

    • 요청 도메인(referer)과 쿠키에 설정된 도메인이 같은 경우에만 쿠키 전송
    • 즉, 퍼스트 파티 쿠키만 전송
  • Lax : Strict에 비해 상대적으로 느슨한 정책

    • GET과 같은 서버의 상태를 변경하지 않는 안전한 메서드의 경우에는 서드 파티 쿠키 전송 허용
  • None : 기본 값, SameSite 속성을 지정하지 않은 것과 같은 상태

    • 크로스 사이트에도 쿠키 전송
    • Secure 속성과 같이 사용하지 않을 시 Secure 오류 발생

퍼스트 파티 쿠키(First-party cookies)

  • 클라이언트와 같은 도메인(same-site)으로 전송하는 쿠키
  • 즉 서버의 도메인과 referer가 같은 경우

서드 파티 쿠키(Third-party cookies)

  • 클라이언트와 다른 도메인(cross-site)으로 전송하는 쿠키


References

Mohamed Saleh, 『Browser Cookie Domains』, Baeldung
A. Barth, 『HTTP State Management Mechanism』, RFC6265
mdn web docs, 『HTTP/Cookies』
mdn web docs, 『HTTP headers/Set-Cookie』
이현섭, 『브라우저 쿠키와 SameSite 속성』, seob.dev(2021)

위키백과, 『사이트 간 스크립팅』
mdn web docs, 『Types of attacks』
Ilma Vienažindytė, 『크로스 사이트 요청 위조란?』, NordVPN

0개의 댓글