쿠키와 세션의 차이에 대해 설명해 주세요.
쿠키와 세션은 HTTP의 무상태(Stateless) 특성을 보완하여 클라이언트의 상태 정보를 유지하기 위한 두 가지 대표적인 메커니즘입니다.
왜 필요한가?
HTTP는 요청-응답이 끝나면 연결 정보를 유지하지 않기 때문에, 로그인 상태나 장바구니 같은 상태 유지가 필요한 경우 쿠키 또는 세션을 사용합니다.
쿠키 (Cookie)
- 저장 위치: 클라이언트(브라우저)
- 서버가
Set-Cookie헤더로 클라이언트에 전달하고, 이후 요청마다 브라우저가 자동으로Cookie헤더에 포함하여 전송 - 만료 시간을 설정할 수 있으며, 설정하지 않으면 브라우저 종료 시 삭제(세션 쿠키)
- 용량 제한: 도메인당 약 4KB
// 서버 → 클라이언트
Set-Cookie: user=hong; Max-Age=3600; HttpOnly; Secure
// 클라이언트 → 서버 (이후 요청)
Cookie: user=hong
세션 (Session)
- 저장 위치: 서버 (메모리, DB, Redis 등)
- 서버가 고유한 Session ID를 생성하여 쿠키에 담아 클라이언트에 전달
- 클라이언트는 Session ID만 보관하고, 실제 데이터는 서버에서 관리
- 브라우저 종료 또는 서버의 타임아웃 설정에 따라 만료
// Java Servlet 기준
// 세션 생성 및 값 저장
HttpSession session = request.getSession();
session.setAttribute("loginUser", "hong");
// 세션 값 조회
String user = (String) session.getAttribute("loginUser");
// 세션 무효화 (로그아웃)
session.invalidate();
쿠키 vs 세션 비교
| 항목 | 쿠키 | 세션 |
|---|---|---|
| 저장 위치 | 클라이언트(브라우저) | 서버 |
| 보안 | 상대적으로 취약 (노출·변조 가능) | 상대적으로 안전 (ID만 전달) |
| 용량 | 약 4KB 제한 | 서버 자원에 따라 유연 |
| 속도 | 서버 부담 적음 | 서버 조회 비용 발생 |
| 생명주기 | 만료 시간 직접 설정 | 서버 타임아웃 or 브라우저 종료 |
| 사용 예시 | 자동 로그인, 광고 추적, 테마 설정 | 로그인 상태 유지, 장바구니 |
동작 흐름 요약
1. 클라이언트 → 서버 : 최초 요청 (로그인 등)
2. 서버 : 세션 생성 + Session ID 발급
3. 서버 → 클라이언트 : Set-Cookie: JSESSIONID=abc123
4. 클라이언트 → 서버 : 이후 요청마다 Cookie: JSESSIONID=abc123
5. 서버 : Session ID로 저장된 상태 정보 조회
면접 포인트
- 세션도 결국 Session ID를 쿠키를 통해 전달하므로, 세션은 쿠키에 의존합니다.
- 쿠키의 보안 강화를 위해
HttpOnly(JS 접근 차단),Secure(HTTPS만 전송),SameSite(CSRF 방지) 속성을 활용합니다. - 서버가 여러 대인 경우 세션 불일치 문제가 생길 수 있으며, 이를 해결하기 위해 Sticky Session, 세션 클러스터링, 또는 Redis 같은 외부 세션 저장소를 사용합니다.