쿠키(Cookie)
HTTP는 기본적으로 상태를 유지하지 않는(Stateless) 프로토콜이다. 이 말은, 요청을 보내고 응답을 받으면 그 후의 모든 요청에 대해 서버가 이전 요청 정보를 기억하지 않는다는 뜻이다. 하지만 실제 웹 서비스에서는 로그인 유지, 장바구니, 사용자 맞춤 정보 제공 등 클라이언트 상태를 인지하는 기능이 필수적이다. 이러한 기능을 구현하기 위해 웹 브라우저와 서버 간 쿠키(Cookie) 라는 데이터를 교환한다.
1. 쿠키의 개념
쿠키(Cookie) 란, 서버에서 생성하여 클라이언트(웹 브라우저)에 저장하는 작은 데이터를 의미한다. 쿠키에는 클라이언트의 로그인 상태, 사용자 ID, 장바구니 정보 등 상태 추적을 위한 정보가 담길 수 있으며, 브라우저는 같은 서버에 요청할 때마다 이 쿠키 정보를 자동으로 함께 전송한다.
(그림 출처: 혼자 공부하는 컴퓨터 네트워크)
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. 쿠키의 동작 구조
쿠키를 통해 서버가 클라이언트 상태를 파악하는 전체 흐름은 다음과 같다.
- 서버가
Set-Cookie
헤더를 통해 쿠키를 생성하여 클라이언트에게 전달한다. - 클라이언트(웹 브라우저)는 전달받은 쿠키를 저장한다.
- 이후 동일 서버에 HTTP 요청을 보낼 때, 웹 브라우저는 저장된 쿠키를
Cookie
헤더에 담아 자동 전송한다. - 서버는 전송받은 쿠키 정보를 확인해 클라이언트 상태(로그인 여부, 장바구니 내용 등)를 인식한다.
(그림 출처: 혼자 공부하는 컴퓨터 네트워크)
2.1 세션 쿠키 vs. 영구 쿠키
- 세션 쿠키(Session Cookie)
만료 시간이 지정되지 않아, 브라우저가 종료될 때 자동으로 삭제된다. - 영구 쿠키(Persistent Cookie)
만료 시간(Expires) 또는 유효 기간(Max-Age)을 설정하여 브라우저 종료 후에도 보관된다.
3. 세션 인증(Session Authentication)
서버가 로그인 상태를 유지하기 위해 자주 사용하는 방식은 세션 아이디(Session ID) 쿠키다. 이를 세션 인증이라고 부른다.
- 클라이언트가 아이디·비밀번호 같은 인증 정보를 서버에 전송한다.
- 서버가 인증에 성공하면, 세션 아이디를 새로 발급한다.
- 이 세션 아이디를 서버 측 DB나 메모리 등에 저장해 두고,
Set-Cookie
헤더로 클라이언트에 전달한다. - 클라이언트는 이후 요청마다 세션 아이디가 담긴 쿠키를 자동 전송한다.
- 서버는 쿠키에 담긴 세션 아이디를 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
헤더를 여러 번 사용할 수 있다. - 각 쿠키는
이름=값
형식을 기본으로 하고, 세미콜론(;
)으로 속성들을 구분한다.
(그림 출처: 혼자 공부하는 컴퓨터 네트워크)
4.2 클라이언트에서 쿠키 전송: Cookie
클라이언트는 저장된 쿠키를 동일 서버로 요청할 때 아래와 같이 Cookie
헤더에 담아 보낸다.
GET /index.html HTTP/1.1
Host: www.example.com
Cookie: session_id=abc123; theme=dark
(그림 출처: 혼자 공부하는 컴퓨터 네트워크)
이때 쿠키가 여러 개라면 세미콜론(;
)으로 구분해 한 줄에 이어붙여 전송한다.
5. 쿠키 활용 예시
아래와 같이 서버가 쿠키를 내려주고, 클라이언트가 해당 쿠키를 다시 전송하는 예시를 통해 전체 흐름을 좀 더 직관적으로 볼 수 있다.
(그림 출처: 혼자 공부하는 컴퓨터 네트워크)
이처럼 특정 이름(name) 의 쿠키에 여러 정보를 담아 상황에 맞게 사용할 수 있다.
6. 브라우저에서의 쿠키 관리
브라우저 개발자 도구의 [Application] → [Storage] → [Cookies] 패널에서 현재 사이트가 설정한 쿠키들을 직접 확인할 수 있다. 각 쿠키에 이름, 값, 도메인, 경로, 만료 시점(Expires) 등을 볼 수 있다.
(그림 출처: 혼자 공부하는 컴퓨터 네트워크)
7. 주요 쿠키 속성
7.1 Domain
- 어떤 도메인에 대해 쿠키가 유효한지 지정한다.
- 예:
domain=www.example.com
은 해당 도메인에서만 쿠키 전송이 이루어진다. domain=example.com
처럼 설정하면 하위 도메인(www.example.com
,sub.example.com
등)까지 쿠키를 전송할 수 있다.
(그림 출처: 혼자 공부하는 컴퓨터 네트워크)
7.2 Path
- 쿠키가 적용될 경로를 지정한다.
- 예:
path=/lectures
이라면www.example.com/lectures
하위 경로로 요청 시에만 쿠키가 전송된다. path=/
이면 해당 도메인의 모든 경로에서 쿠키가 전송된다.
(그림 출처: 혼자 공부하는 컴퓨터 네트워크)
7.3 Expires / Max-Age
- 쿠키의 만료 시점을 설정한다.
Expires
는 특정 시점(날짜와 시간),Max-Age
는 초 단위의 기간을 의미한다.- 시간(기간)이 지나면 브라우저는 해당 쿠키를 자동 삭제하며, 이후 서버로 전송되지 않는다.
(그림 출처: 혼자 공부하는 컴퓨터 네트워크)
7.4 Secure / HttpOnly
- Secure
HTTPS 프로토콜일 때만 쿠키를 전송해 중간 탈취 위험을 낮춘다. - HttpOnly
자바스크립트(클라이언트 스크립트)에서 쿠키에 접근할 수 없게 하여 악의적인 스크립트(예: XSS 공격)로부터 쿠키를 보호한다.
8. 쿠키의 보안 이슈와 한계
쿠키는 기본적으로 문자열 형태로 전송되므로, 악의적인 공격자가 탈취하거나 변조할 가능성이 있다.
- 쿠키에 민감 정보(비밀번호, 주민등록번호 등)를 직접 담는 것은 피해야 한다.
- HTTPS 및
Secure
,HttpOnly
속성을 통해 공격 표면을 줄일 수 있다. - 세션 아이디와 같은 정보를 이용해 서버에서 사용자 식별을 수행하되, 만료 기간을 적절히 짧게 유지하고 필요하면 재인증 절차를 거치는 등 보안을 강화해야 한다.
9. 웹 스토리지(Web Storage)
쿠키 외에도, 웹 브라우저에는 웹 스토리지(Local Storage, Session Storage)라는 공간이 있다. 웹 스토리지는 쿠키와 달리 자동으로 서버에 전송되지 않으며, 보통 쿠키보다 더 많은 데이터를 저장할 수 있다.
- Local Storage: 영구적으로(브라우저가 닫혀도) 보존된다.
- Session Storage: 브라우저 탭(세션)을 닫으면 함께 사라진다.
이는 로그인 상태 유지 등 서버와의 자동 동기화보다는, 클라이언트 측 로직이나 상태 유지에 주로 활용된다.
참고 자료
'컴퓨터 네트워크 > 응용계층' 카테고리의 다른 글
콘텐츠 협상과 표현 (0) | 2025.01.15 |
---|---|
캐시(Cache) (0) | 2025.01.13 |
HTTP 헤더 (HTTP Headers) (0) | 2025.01.12 |
HTTP 상태 코드 (0) | 2025.01.07 |
HTTP 메서드 (0) | 2025.01.04 |