Post

쿠키 (Cookie)

쿠키(Cookie)에 대해 정리한 페이지입니다.

쿠키 (Cookie)

Tags
Cookie

개요

쿠키(Cookie)에 대해 정리한 페이지입니다.

쿠키의 개념

쿠키(Cookie)는 웹 브라우저에서 사용하는 저장 수단으로, key-value 쌍으로 데이터가 저장됩니다. 쿠키는 HTTP 요청 시 자동으로 헤더에 포함되어 전송되기 때문에 주로 인증 정보와 같이 서버와의 통신에 필요한 데이터를 저장합니다. 많은 용량의 쿠키가 저장되어 있을 경우 통신 과정에서 오버헤드가 발생할 수 있기 때문에 일반적으로 쿠키 한 개의 용량을 4KB로 정도로 제한하며, 도메인 하나당 저장할 수 있는 쿠키의 개수는 약 20개입니다. 또한, 쿠키는 Expires 혹은 Max-Age 속성을 통해 데이터 저장 시 만료 날짜를 지정할 수 있고, Path 속성을 통해 같은 도메인 내에서도 쿠키가 전송될 URL의 범위를 설정할 수 있다는 특징이 있습니다.

쿠키의 동작 원리

  1. 브라우저에서 서버로 HTTP 요청을 보냅니다.
  2. 서버에서 HTTP 응답 헤더의 Set-Cookie로 쿠키를 전송하면 브라우저는 이를 저장합니다.

    1
    2
    
    HTTP/1.1 200 OK
    Set-Cookie: session_id=abc123; Expires=Sun, 13 Apr 2025 14:14:00 GMT; Secure; HttpOnly;
    
  3. 사용자가 동일 사이트를 재방문하면 브라우저는 HTTP 요청 헤더의 Cookie로 서버에 쿠키를 자동 전송합니다.
  4. 서버는 전송받은 쿠키를 활용하여 사용자를 식별하거나, 세션 관리, 또는 개인화된 응답을 제공합니다.

쿠키의 사용 예시

쿠키를 사용하는 예시는 다음과 같습니다.

  • 세션 관리(Session Management)

    로그인 상태, 장바구니 내용 등 사용자의 상태를 기억할 때 쿠키를 사용합니다.

  • 개인화(Personalization)

    사용자가 선택한 언어, 테마, 사용자 환경 설정 등을 저장하기 위해 쿠키를 사용합니다.

  • 트래킹(Tracking)

    웹 사이트 방문 기록, 사용자 행동 추적(Google Analytics 등), 사용자 맞춤형 광고를 위해 쿠키를 사용합니다.

쿠키의 종류

쿠키의 종류는 다음과 같습니다.

  • 세션 쿠키(Session Cookie)

    세션 쿠키는 ExpiresMax-Age 속성이 없는 쿠키로, 브라우저 메모리에 저장되며 브라우저 종료 시 자동 삭제됩니다. 로그인 세션이나 일시적인 상태 유지를 위해 사용됩니다.

  • 지속 쿠키(Persistent Cookie)

    지속 쿠키는 Expires 속성에 명시된 날짜에 삭제되거나 또는 Max-Age 속성으로 지정된 기간 동안 기기에 유지되는 쿠키입니다. 사용자의 환경 설정이나 방문 기록 저장에 주로 사용됩니다.

  • 퍼스트파티 쿠키(First-Party Cookie)

    퍼스트파티 쿠키는 사용자가 방문 중인 웹 사이트에서 직접 생성한 쿠키로, 해당 도메인에서만 읽거나 수정할 수 있습니다.

  • 서드파티 쿠키(Third-Party Cookie)

    웹 사이트에 삽입된 광고나 외부 스크립트 등 다른 도메인에서 생성한 쿠키로, 주로 광고 추적에 사용됩니다. 최근 개인정보 보호를 위해 차단하는 브라우저가 늘어나고 있습니다.

쿠키의 속성

1
2
HTTP/1.1 200 OK
Set-Cookie: session_id=abc123; Domain=example.com; Path=/account; Max-Age=6000; Secure; HttpOnly; SameSite=Lax;

쿠키의 주요 속성은 다음과 같습니다.

  • Domain

    1
    2
    
    HTTP/1.1 200 OK
    Set-Cookie: <cookie-name>=<cookie-value>; Domain=<domain-value>;
    

    쿠키가 어느 도메인에서 전송될 수 있는지를 제한합니다. 별도 설정이 없으면 기본적으로 쿠키가 생성된 서버의 도메인으로 설정됩니다. 도메인이 명시되면 하위 도메인에 한해 사용이 허용됩니다.

  • Path

    1
    2
    
    HTTP/1.1 200 OK
    Set-Cookie: <cookie-name>=<cookie-value>; Path=<path-value>;
    

    쿠키를 어느 URL 경로에서 전송할지를 정의합니다. 예를 들어, Path=/docs로 설정하면 /docs 또는 그 하위 경로에서만 쿠키가 전송됩니다.

  • Expires / Max-Age

    1
    2
    
    HTTP/1.1 200 OK
    Set-Cookie: <cookie-name>=<cookie-value>; Expires=<date>;
    
    1
    2
    
    HTTP/1.1 200 OK
    Set-Cookie: <cookie-name>=<cookie-value>; Max-Age=<number>;
    

    쿠키의 유효 기간을 정의합니다. Expires는 특정 시간과 날짜, Max-Age는 쿠키 생성 시점부터의 유효 시간을 초 단위로 설정합니다. ExpiresMax-Age를 둘 다 설정했을 경우, Max-Age가 우선순위를 갖습니다.

    Info.
    쿠키 만료 시점을 설정할 때, 만료 시점의 시간과 날짜는 서버의 시간이 아니라 쿠키가 저장되는 클라이언트의 시간을 기준으로 합니다.

  • Secure

    1
    2
    
    HTTP/1.1 200 OK
    Set-Cookie: <cookie-name>=<cookie-value>; Secure;
    

    이 속성이 설정된 쿠키는 HTTPS 프로토콜 상에서 암호화된 요청일 경우에만 전송됩니다.

  • HttpOnly

    1
    2
    
    HTTP/1.1 200 OK
    Set-Cookie: <cookie-name>=<cookie-value>; HttpOnly;
    

    이 속성이 설정된 쿠키는 JavaScript(Ex. document.cookie)를 통해 접근할 수 없습니다. 해당 쿠키는 서버에 전송하는 용도로만 사용할 수 있습니다. XSS(Cross-Site Scripting) 공격을 방지하기 위해 HttpOnly 속성을 사용합니다.

  • SameSite

    1
    2
    
    HTTP/1.1 200 OK
    Set-Cookie: <cookie-name>=<cookie-value>; SameSite=Strict;
    
    1
    2
    
    HTTP/1.1 200 OK
    Set-Cookie: <cookie-name>=<cookie-value>; SameSite=Lax;
    
    1
    2
    
    HTTP/1.1 200 OK
    Set-Cookie: <cookie-name>=<cookie-value>; SameSite=None; Secure;
    

    쿠키가 크로스 사이트(Cross-Site) 요청과 함께 전송되는 것을 제한합니다. 이 속성은 CSRF(Cross-Site Request Forgery) 공격을 방지하기 위해 사용됩니다. 가능한 속성 값으로는 다음 3가지가 존재하며, 기본 값은 SameSite=Lax입니다.

    Info.
    동일 사이트와 교차 사이트에 대해선 다음 링크를 참고하시길 바랍니다.
    사이트 (Site)

    • Strict

      브라우저가 동일 사이트 요청에만 쿠키를 전송되도록 제한합니다. SameSite=Strict 속성이 있는 쿠키는 다른 도메인 요청에서 전송되지 않습니다.

    • Lax

      기본적으로 Strict와 동일하게 동작하나, 사용자가 링크를 클릭했을 때처럼 외부 사이트에서 원래 사이트로 이동할 때는 쿠키가 전송됩니다. <a href>, <link>, <form method=get>에서는 쿠키가 전송됩니다. 쿠키에 SameSite 속성을 지정하지 않은 경우 SameSite=Lax가 적용됩니다.

    • None

      모든 크로스 사이트 요청에 쿠키를 전송합니다. 이 값을 사용하는 경우, 반드시 Secure 속성이 설정되어야 합니다.

참고 자료

This post is licensed under CC BY 4.0 by the author.