iOS Developer 2025. 1. 14. 20:12

쿠키(Cookie)

HTTP는 기본적으로 상태를 유지하지 않는(Stateless) 프로토콜이다. 이 말은, 요청을 보내고 응답을 받으면 그 후의 모든 요청에 대해 서버가 이전 요청 정보를 기억하지 않는다는 뜻이다. 하지만 실제 웹 서비스에서는 로그인 유지, 장바구니, 사용자 맞춤 정보 제공 등 클라이언트 상태를 인지하는 기능이 필수적이다. 이러한 기능을 구현하기 위해 웹 브라우저와 서버 간 쿠키(Cookie) 라는 데이터를 교환한다.

 


1. 쿠키의 개념

쿠키(Cookie) 란, 서버에서 생성하여 클라이언트(웹 브라우저)에 저장하는 작은 데이터를 의미한다. 쿠키에는 클라이언트의 로그인 상태, 사용자 ID, 장바구니 정보 등 상태 추적을 위한 정보가 담길 수 있으며, 브라우저는 같은 서버에 요청할 때마다 이 쿠키 정보를 자동으로 함께 전송한다.

image

(그림 출처: 혼자 공부하는 컴퓨터 네트워크)

1.1 쿠키의 기본 구조

쿠키는 이름(name)값(value) 쌍 형태가 기본이며, 추가적으로 만료 기간(Expires/Max-Age), 도메인(Domain), 경로(Path), 보안 속성(Secure, HttpOnly) 등을 설정해 사용할 수 있다.

  • 예: session_id=abc123; Expires=Wed, 09 Jun 2024 10:18:14 GMT; HttpOnly; Secure

 


2. 쿠키의 동작 구조

쿠키를 통해 서버가 클라이언트 상태를 파악하는 전체 흐름은 다음과 같다.

  1. 서버Set-Cookie 헤더를 통해 쿠키를 생성하여 클라이언트에게 전달한다.
  2. 클라이언트(웹 브라우저)는 전달받은 쿠키를 저장한다.
  3. 이후 동일 서버에 HTTP 요청을 보낼 때, 웹 브라우저는 저장된 쿠키를 Cookie 헤더에 담아 자동 전송한다.
  4. 서버는 전송받은 쿠키 정보를 확인해 클라이언트 상태(로그인 여부, 장바구니 내용 등)를 인식한다.

image

(그림 출처: 혼자 공부하는 컴퓨터 네트워크)

2.1 세션 쿠키 vs. 영구 쿠키

  • 세션 쿠키(Session Cookie)
    만료 시간이 지정되지 않아, 브라우저가 종료될 때 자동으로 삭제된다.
  • 영구 쿠키(Persistent Cookie)
    만료 시간(Expires) 또는 유효 기간(Max-Age)을 설정하여 브라우저 종료 후에도 보관된다.

 


3. 세션 인증(Session Authentication)

서버가 로그인 상태를 유지하기 위해 자주 사용하는 방식은 세션 아이디(Session ID) 쿠키다. 이를 세션 인증이라고 부른다.

  1. 클라이언트가 아이디·비밀번호 같은 인증 정보를 서버에 전송한다.
  2. 서버가 인증에 성공하면, 세션 아이디를 새로 발급한다.
  3. 이 세션 아이디를 서버 측 DB나 메모리 등에 저장해 두고, Set-Cookie 헤더로 클라이언트에 전달한다.
  4. 클라이언트는 이후 요청마다 세션 아이디가 담긴 쿠키를 자동 전송한다.
  5. 서버는 쿠키에 담긴 세션 아이디를 DB와 비교하여 동일 사용자임을 인지하고, 로그인 상태를 유지한다.

이렇게 하면 매 요청마다 사용자 로그인 정보(아이디·비밀번호)를 반복해 확인할 필요가 없어, 웹 서비스에 매우 효율적이다.

 


4. 쿠키 헤더 살펴보기

4.1 서버에서 쿠키 전송: Set-Cookie

서버는 아래 예시와 같이 응답 헤더에서 Set-Cookie를 통해 클라이언트에게 쿠키를 전송한다.

HTTP/1.1 200 OK 
Content-Type: text/html 
Set-Cookie: session_id=abc123; HttpOnly; Secure; Path=/; Domain=www.example.com 
Set-Cookie: theme=dark; Max-Age=86400
  • 여러 개의 쿠키를 보낼 경우 Set-Cookie 헤더를 여러 번 사용할 수 있다.
  • 각 쿠키는 이름=값 형식을 기본으로 하고, 세미콜론(;)으로 속성들을 구분한다.

image

(그림 출처: 혼자 공부하는 컴퓨터 네트워크)

4.2 클라이언트에서 쿠키 전송: Cookie

클라이언트는 저장된 쿠키를 동일 서버로 요청할 때 아래와 같이 Cookie 헤더에 담아 보낸다.

GET /index.html HTTP/1.1 
Host: www.example.com 
Cookie: session_id=abc123; theme=dark

image

(그림 출처: 혼자 공부하는 컴퓨터 네트워크)

이때 쿠키가 여러 개라면 세미콜론(;)으로 구분해 한 줄에 이어붙여 전송한다.

 


5. 쿠키 활용 예시

아래와 같이 서버가 쿠키를 내려주고, 클라이언트가 해당 쿠키를 다시 전송하는 예시를 통해 전체 흐름을 좀 더 직관적으로 볼 수 있다.

image

(그림 출처: 혼자 공부하는 컴퓨터 네트워크)

이처럼 특정 이름(name) 의 쿠키에 여러 정보를 담아 상황에 맞게 사용할 수 있다.

 


6. 브라우저에서의 쿠키 관리

브라우저 개발자 도구의 [Application] → [Storage] → [Cookies] 패널에서 현재 사이트가 설정한 쿠키들을 직접 확인할 수 있다. 각 쿠키에 이름, , 도메인, 경로, 만료 시점(Expires) 등을 볼 수 있다.

image

(그림 출처: 혼자 공부하는 컴퓨터 네트워크)

 


7. 주요 쿠키 속성

7.1 Domain

  • 어떤 도메인에 대해 쿠키가 유효한지 지정한다.
  • 예: domain=www.example.com 은 해당 도메인에서만 쿠키 전송이 이루어진다.
  • domain=example.com 처럼 설정하면 하위 도메인(www.example.com, sub.example.com 등)까지 쿠키를 전송할 수 있다.

image

(그림 출처: 혼자 공부하는 컴퓨터 네트워크)

7.2 Path

  • 쿠키가 적용될 경로를 지정한다.
  • 예: path=/lectures 이라면 www.example.com/lectures 하위 경로로 요청 시에만 쿠키가 전송된다.
  • path=/ 이면 해당 도메인의 모든 경로에서 쿠키가 전송된다.

image

(그림 출처: 혼자 공부하는 컴퓨터 네트워크)

7.3 Expires / Max-Age

  • 쿠키의 만료 시점을 설정한다.
  • Expires는 특정 시점(날짜와 시간), Max-Age초 단위의 기간을 의미한다.
  • 시간(기간)이 지나면 브라우저는 해당 쿠키를 자동 삭제하며, 이후 서버로 전송되지 않는다.

image

(그림 출처: 혼자 공부하는 컴퓨터 네트워크)

7.4 Secure / HttpOnly

  • Secure
    HTTPS 프로토콜일 때만 쿠키를 전송해 중간 탈취 위험을 낮춘다.
  • HttpOnly
    자바스크립트(클라이언트 스크립트)에서 쿠키에 접근할 수 없게 하여 악의적인 스크립트(예: XSS 공격)로부터 쿠키를 보호한다.

 


8. 쿠키의 보안 이슈와 한계

쿠키는 기본적으로 문자열 형태로 전송되므로, 악의적인 공격자가 탈취하거나 변조할 가능성이 있다.

  • 쿠키에 민감 정보(비밀번호, 주민등록번호 등)를 직접 담는 것은 피해야 한다.
  • HTTPS 및 Secure, HttpOnly 속성을 통해 공격 표면을 줄일 수 있다.
  • 세션 아이디와 같은 정보를 이용해 서버에서 사용자 식별을 수행하되, 만료 기간을 적절히 짧게 유지하고 필요하면 재인증 절차를 거치는 등 보안을 강화해야 한다.

 


9. 웹 스토리지(Web Storage)

쿠키 외에도, 웹 브라우저에는 웹 스토리지(Local Storage, Session Storage)라는 공간이 있다. 웹 스토리지는 쿠키와 달리 자동으로 서버에 전송되지 않으며, 보통 쿠키보다 더 많은 데이터를 저장할 수 있다.

  • Local Storage: 영구적으로(브라우저가 닫혀도) 보존된다.
  • Session Storage: 브라우저 탭(세션)을 닫으면 함께 사라진다.

이는 로그인 상태 유지 등 서버와의 자동 동기화보다는, 클라이언트 측 로직이나 상태 유지에 주로 활용된다.

 


참고 자료