TL;DR
- 쿠키(cookie)는 브라우저가 저장했다가 전송 조건이 맞는 요청에 자동으로 붙이는 작은 키-값이다.
- 쿠키는 클라이언트의 저장·운반 수단이고 세션은 여러 요청에 상태를 연결하는 논리적 범위다.
- 흔히 쿠키가 세션 식별자를 실어 나르지만 둘은 같은 것이 아니다.
쿠키: 브라우저가 기억하고 되돌려보내는 키-값
쿠키는 브라우저가 저장하는 이름=값 쌍이다. 서버는 응답의 Set-Cookie 헤더로 쿠키를 설정할 수 있고 JavaScript로 설정하는 쿠키도 있다. 브라우저는 도메인·경로·보안 속성·SameSite·브라우저 정책 등 전송 조건이 맞으면 Cookie 헤더에 값을 담는다. 인증용 쿠키를 받은 서버는 그 값을 검증하거나 세션 저장소에서 조회해 로그인 상태를 판단한다.1
쿠키가 오가는 흐름
서버가 Set-Cookie로 설정하고 브라우저가 저장한 쿠키는 전송 조건이 맞는 후속 요청에 자동으로 붙는다. 아래 chat-42는 설명용 값이며 실제 인증 세션 ID는 예측하기 어렵게 생성해야 한다.
sequenceDiagram participant B as 브라우저 participant S as 서버 (example.com) B->>S: 첫 요청 (쿠키 없음) S-->>B: 응답 · Set-Cookie: session=chat-42 Note over B: 브라우저가 쿠키 저장 (도메인·만료와 함께) B->>S: 이후 요청 · Cookie: session=chat-42 Note over B,S: 쿠키 전송 조건을 만족하면 자동 전송 S-->>B: 세션 ID 검증·조회 후 응답
웹 화면에서 실제로 겪는 쿠키
- 쿠키는 일반적으로 같은 브라우저 프로필의 탭 사이에서 공유되므로 탭 하나를 닫는 것만으로 로그아웃되지는 않는다.
- 만료 설정이 없는 세션 쿠키(session cookie)는 브라우저가 정하는 세션 종료 시점까지 보관된다. 세션 복원 기능으로 브라우저 재시작 후에도 복원될 수 있다.
- 지속 쿠키(persistent cookie)는 만료 설정에 따라 재시작 후에도 남을 수 있지만 서버 세션이 만료·취소됐다면 로그인은 유지되지 않는다.
- "이 사이트는 쿠키를 사용합니다" 배너는 로그인 유지·분석·광고 추적에 쿠키를 쓴다는 고지다.
- 개발자도구 > Application > Cookies에서 사이트가 심어 둔 쿠키의 이름·값·만료·도메인을 직접 볼 수 있다.
세션 쿠키와 지속 쿠키
| 구분 | 세션 쿠키 | 지속 쿠키 |
|---|---|---|
| 만료 설정 | 없음 (Expires/Max-Age 미지정) | 있음 (특정 시각까지) |
| 수명 | 브라우저가 정하는 세션 동안; 세션 복원으로 유지될 수 있음 | 설정한 만료까지 보관 가능; 사용자 삭제·정책 등에 따라 먼저 제거될 수 있음 |
| 예 | 임시 로그인, 일회성 폼 상태 | "로그인 상태 유지" 체크 |
여기서 "세션 쿠키"의 세션은 브라우저가 정하는 수명을 가리키며 서버의 로그인 세션과는 다른 층위다. 쿠키 보관 기간과 서버의 인증 유효 기간은 일치하지 않을 수 있다.2
세션과 쿠키의 차이
쿠키와 세션은 층이 다르다. 쿠키는 클라이언트의 저장·운반 메커니즘이고 세션은 여러 요청을 하나로 묶어 상태를 적용하는 논리적 범위다. 서버 저장형 세션에서는 쿠키가 세션 식별자를 운반한다.
| 질문 | 쿠키 | 세션 |
|---|---|---|
| 어디에 있나 | 클라이언트(브라우저) | 상태는 서버 저장소 또는 클라이언트 등에 보관 |
| 무엇인가 | 저장·운반 수단(HTTP 헤더) | 상태를 묶는 논리적 범위 |
| 무엇을 담나 | 세션 ID 또는 작은 값 | 로그인 여부, 권한, 진행 상태 |
| 대안 | 다른 헤더 등으로 식별자 전달 | 필요한 문맥을 요청마다 직접 전달하는 방식 등 |
쿠키 없이 다른 헤더로 식별자를 보내도 세션은 성립한다. 서명 쿠키에 세션 상태를 담으면 서버 측 세션 저장소 없이 구현할 수도 있지만 논리적 세션까지 없어지는 것은 아니다. Flask의 기본 세션이 이 방식을 사용한다.3
로그인 쿠키에는 HTTPS와 Secure·HttpOnly·용도에 맞는 SameSite 설정을 적용하고 서버에서 만료·취소를 검증한다. URL에 인증 세션 ID를 넣으면 로그 등에 노출될 수 있어 피한다.4
Connections
- 세션 - 여러 요청에 상태를 잇는 논리적 범위 — 저장 위치와 독립적인 세션의 논리적 범위를 정의한다.
- 토큰과 JWT - 조회 없이 검증되는 자격증명 — 쿠키가 웹에서 실어 나르는 자격증명 문자열(세션 ID·JWT)의 정체를 다룬다.
Discussion
Comments
댓글은 승인 후 공개됩니다.