쿠키와 세션 (Cookie, Session)
한눈에 보기
쿠키는 서버가 브라우저에 저장하도록 지시하는 작은 키와 값의 쌍이고, 세션은 쿠키를 운반 수단으로 삼아 사용자별 상태를 서버 저장소에 보관하는 기법이다. 두 개념의 동작 원리와 보안 속성, 위협 대응을 다룬다.
최종 업데이트 2026.09.17
쿠키(Cookie)는 서버가 브라우저에 저장하도록 지시하는 작은 키와 값의 쌍이며, 브라우저는 같은 사이트로 요청을 보낼 때마다 저장된 쿠키를 자동으로 첨부한다. 세션(Session)은 이 쿠키를 운반 수단으로 삼아, 사용자별 상태 정보를 서버 쪽 저장소에 보관하는 상태 유지 기법이다. 두 개념은 대립하는 선택지가 아니라, 쿠키가 전달 통로이고 세션이 그 위에서 동작하는 구조로 서로 맞물려 있다.
쿠키의 동작 원리
서버는 HTTP 응답의 Set-Cookie 헤더로 쿠키를 내려주고, 브라우저는 이를 도메인별로 저장한다. 이후 같은 도메인으로 요청을 보낼 때 브라우저가 Cookie 헤더에 값을 자동으로 실어 보내므로, 개발자가 매 요청마다 값을 챙길 필요가 없다.
HTTP/1.1 200 OK
Set-Cookie: theme=dark; Path=/; Max-Age=2592000
Set-Cookie: sid=a8f3c1; HttpOnly; Secure; SameSite=Lax
GET /mypage HTTP/1.1
Host: example.com
Cookie: theme=dark; sid=a8f3c1
쿠키에는 수명 개념이 있다. Max-Age나 Expires를 지정하면 디스크에 저장되어 브라우저를 껐다 켜도 남는 지속 쿠키(Persistent Cookie)가 되고, 지정하지 않으면 브라우저 세션이 끝날 때 사라지는 세션 쿠키(Session Cookie)가 된다. 보안 속성도 중요하다. HttpOnly를 붙이면 자바스크립트(JavaScript)의 document.cookie로 접근할 수 없어 XSS로 인한 탈취를 막고, Secure는 HTTPS 연결에서만 전송되게 하며, SameSite는 다른 사이트에서 시작된 요청에 쿠키를 붙일지 제어해 CSRF를 완화한다. 최신 브라우저는 SameSite를 명시하지 않으면 Lax를 기본값으로 적용한다.
세션의 동작 과정
세션은 민감한 상태를 브라우저가 아니라 서버에 두는 방식이다. 전형적인 로그인 흐름은 다음과 같다.
- 사용자가 아이디와 비밀번호를 제출하면 서버가 자격 증명을 검증한다.
- 서버가 세션 저장소에 사용자 식별 정보를 기록하고, 추측 불가능한 무작위 세션 식별자(Session ID)를 생성한다.
- 서버가 이 식별자를 Set-Cookie로 내려주면 브라우저가 저장한다.
- 이후 모든 요청에 쿠키가 자동 첨부되고, 서버는 식별자로 저장소를 조회해 어떤 사용자인지 복원한다.
- 로그아웃하면 서버가 저장소에서 세션을 삭제하고 쿠키를 만료시킨다.
핵심은 쿠키에 담기는 값이 의미 없는 난수라는 점이다. 사용자 정보의 원본은 서버에만 있으므로, 클라이언트가 쿠키 값을 조작해도 저장소에 해당 항목이 없으면 무시된다. 세션 저장소로는 초기에 웹 서버의 메모리를 쓰지만, 서버가 여러 대가 되면 레디스(Redis) 같은 외부 공용 저장소로 옮기는 것이 일반적이다.
쿠키와 세션 비교
| 구분 | 쿠키에 직접 저장 | 세션 |
|---|---|---|
| 저장 위치 | 브라우저 | 서버(쿠키에는 식별자만) |
| 용량 제한 | 이름과 값 합쳐 약 4KB | 서버 자원이 허용하는 만큼 |
| 보안 | 값이 노출되고 위조 가능 | 원본이 서버에 있어 위조 곤란 |
| 서버 부하 | 없음 | 요청마다 저장소 조회 |
| 수평 확장 | 영향 없음 | 공유 저장소 필요 |
| 적합한 데이터 | 테마, 언어 같은 비민감 설정 | 로그인 상태, 권한, 장바구니 |
보안 위협과 대응
세션 방식의 대표 위협은 세션 하이재킹(Session Hijacking)이다. 공격자가 어떤 경로로든 세션 식별자를 알아내면 그 사용자로 행세할 수 있다. 그래서 식별자는 충분히 긴 난수여야 하고, HttpOnly와 Secure 속성으로 탈취 경로를 줄여야 한다. 또 로그인 성공 직후에는 세션 식별자를 새로 발급해야 하는데, 이는 공격자가 미리 심어 둔 식별자를 피해자가 그대로 쓰게 만드는 세션 고정(Session Fixation) 공격을 막기 위해서다. 유휴 시간 기반의 만료 정책을 두어 방치된 세션이 오래 살아 있지 않게 하는 것도 기본이다. 브라우저 저장소 중 로컬 스토리지(localStorage)는 쿠키와 달리 자동 전송되지 않고 HttpOnly 같은 보호 장치도 없으므로, 인증 정보 보관처로는 쿠키보다 신중히 선택해야 한다.
면접에서 이렇게 물어본다
- 쿠키와 세션의 차이를 저장 위치와 보안 관점에서 설명해 보라.
- HttpOnly, Secure, SameSite 속성이 각각 어떤 공격을 어떻게 완화하는지 말해 보라.
- 서버를 여러 대로 확장할 때 세션 방식에서 생기는 문제와 해결책은 무엇인가.
- 로그인 성공 직후 세션 식별자를 재발급해야 하는 이유를 설명해 보라.
- 로컬 스토리지와 쿠키의 차이를 들고, 인증 정보는 어디에 두는 것이 좋은지 논해 보라.
웹에서 같이 읽기
- 웹 인증 방식 총정리 (Authentication)웹 서비스의 인증은 요청을 보낸 사용자가 누구인지 확인하는 절차다. HTTP는 무상태 프로토콜이므로 로그인 이후 요청마다 사용자를 식별할 수단이 필요하며, 세션, 토큰, API 키, OAuth를 비교해 각 방식의 적합한 상황을 정리한다.
- CSR과 SSR (Client Side Rendering, Server Side Rendering)CSR은 브라우저가 자바스크립트로 화면을 그리는 방식, SSR은 서버가 완성된 HTML을 내려보내는 방식이다. 초기 로딩, SEO, 서버 부하 관점의 차이와 SSG, ISR을 포함한 혼합 전략까지 정리한다.
- CSRF와 XSS (Cross Site Request Forgery, Cross Site Scripting)XSS는 공격자의 스크립트를 피해자 브라우저에서 실행시키는 공격이고, CSRF는 로그인된 브라우저를 속여 피해자 명의의 요청을 보내는 공격이다. 두 공격이 악용하는 신뢰 관계의 차이와 방어 수단을 정리한다.
- 브라우저 동작 원리 (Browser Rendering)브라우저가 URL을 받아 서버에서 자원을 가져오고 HTML, CSS, 자바스크립트를 해석해 픽셀로 바꾸는 과정을 다룬다. DNS 조회부터 파싱, 레이아웃, 페인트, 합성까지 렌더링 파이프라인과 이벤트 루프를 설명한다.
이 개념, 내 코드에서는 어떻게 물어볼까요
데브핏(DevFit)에 채용공고 URL을 붙여 넣고 레포지토리를 연결하면, 내가 쓴 커밋에서 예상 질문과 어필 포인트를 만듭니다. 하루 10회까지 무료입니다. 합불 판정이나 지원자 랭킹은 만들지 않고, 최종 판단은 사람이 합니다.
공고 넣고 시작하기