쿠키(Cookie)는 서버가 클라이언트(브라우저)에 저장하는 작은 텍스트 데이터로, HTTP의 무상태성을 보완하는 수단입니다.
HTTP는 무상태(Stateless) 프로토콜입니다. 서버는 이전 요청을 기억하지 않아 로그인 상태를 유지할 수 없습니다. 쿠키를 사용하면 서버가 브라우저에 정보를 저장하고, 이후 요청마다 자동으로 전송받아 상태를 식별할 수 있습니다.
1. 클라이언트 → 서버: 로그인 요청
2. 서버 → 클라이언트: Set-Cookie 헤더로 쿠키 설정
3. 클라이언트 → 서버: 이후 모든 요청에 Cookie 헤더 자동 첨부
Set-Cookie: sessionId=abc123; Path=/; HttpOnly; Secure; SameSite=Strict
설정하지 않으면 세션 쿠키로 동작하여 브라우저 종료 시 삭제됩니다. 설정하면 지정된 시간까지 유지됩니다.
쿠키를 전송할 도메인 범위를 지정합니다. Domain=example.com 설정 시 하위 도메인(sub.example.com)에도 전송됩니다.
쿠키를 전송할 URL 경로를 제한합니다. Path=/api로 설정하면 /api로 시작하는 경로에만 전송됩니다.
document.cookie로 쿠키를 읽을 수 없게 합니다. XSS 공격으로 쿠키를 탈취하는 것을 방지합니다. 세션 쿠키에는 반드시 설정해야 합니다.
HTTPS 연결에서만 쿠키를 전송합니다. HTTP 연결에서는 전송하지 않아 도청을 방지합니다.
| 값 | 동작 |
|---|---|
| Strict | 같은 사이트에서의 요청에만 전송 |
| Lax | 안전한 메서드(GET)의 상위 탐색에는 전송 |
| None | 항상 전송 (Secure 속성 필수) |
CSRF 공격 방지를 위해 Strict 또는 Lax로 설정하는 것이 권장됩니다.
악성 스크립트가 document.cookie로 쿠키를 탈취합니다. HttpOnly 속성으로 방지합니다.
다른 사이트에서 쿠키를 자동 전송하여 의도하지 않은 요청을 발생시킵니다. SameSite=Strict로 방지합니다.
| 항목 | 쿠키 | localStorage |
|---|---|---|
| 서버 자동 전송 | 예 | 아니오 |
| 만료 설정 | 가능 | 없음(영구) |
| 용량 | 4KB | 5-10MB |
| 접근 | JS + 서버 | JS만 |