무엇을 어디에 저장할 것인가
"쿠키도 사용자 정보를 저장하고, 세션도 사용자 정보를 저장하고 — 둘 중 어느 걸 쓰면 되나요?"
전 차시들에서 각자 따로 봤지만, 이번에 둘을 나란히 비교해서 의사결정 기준을 잡습니다.
식당에 비유하면 — 쿠키는 「영수증」(손님 호주머니에 들어감), 세션은 「손목 도장」(가게 보관함의 열쇠).
| 항목 | 쿠키 | 세션 |
|---|---|---|
| 저장 위치 | 브라우저 (사용자 PC) | 서버 메모리 |
| 보안 | 약함 (사용자가 보고 수정 가능) | 강함 (서버 내부) |
| 용량 | ~4 KB | 큼 (메모리 한계까지) |
| 수명 제어 | maxAge 로 명시 (브라우저 닫혀도 유지 가능) | 설정된 시간 (보통 30 분) |
| 서버 부하 | 0 (브라우저가 보관) | 사용자당 메모리 점유 |
| 여러 서버 동기화 | 자동 (각 요청에 동봉) | 별도 처리 필요 (Redis 등) |
| JS 접근 | 가능 (httpOnly 옵션 시 차단) | 불가 |
"쿠키 vs 세션" 이라고 비교하지만, 사실 세션도 쿠키를 사용 합니다.
서버: Set-Cookie: JSESSIONID=abc123xyz...
브라우저: Cookie: JSESSIONID=abc123xyz... (자동 동봉)
차이는 「무엇을 보관하느냐」:
| 데이터 종류 | 예시 | 저장 위치 |
|---|---|---|
| 로그인한 사용자 정보 | userId, role | 세션 |
| 권한 / VIP 등급 | 관리자 여부 | 세션 |
| 비밀번호 / 카드번호 | (절대로!) | 세션 (또는 아예 저장 X) |
| 장바구니 (비회원) | 상품 ID 목록 | 쿠키 |
| 장바구니 (로그인 사용자) | 상품 ID 목록 | 세션 또는 DB |
| UI 설정 | 다크모드, 폰트 크기 | 쿠키 |
| 최근 본 상품 | 상품 ID 목록 | 쿠키 또는 LocalStorage |
| 광고 추적 | 방문 기록 | 쿠키 (제 3 자 쿠키) |
"민감한 정보 → 세션" / "사용자 편의 설정 → 쿠키"
사용자가 봐도 / 변조해도 문제없는 데이터만 쿠키. 그 외에는 세션.
// 쿠키로 다크모드 저장
@PostMapping("/setting/theme")
public String setTheme(@RequestParam String theme,
HttpServletResponse resp) {
Cookie c = new Cookie("theme", theme);
c.setMaxAge(60 * 60 * 24 * 30); // 30 일
c.setPath("/");
resp.addCookie(c);
return "redirect:/";
}
// 세션으로 로그인 정보 저장
@PostMapping("/login")
public String login(String userId, String password, HttpSession session) {
Member m = service.login(userId, password);
if (m != null) {
session.setAttribute("loginUser", m);
return "redirect:/";
}
return "redirect:/login?error";
}
쿠키 보기: F12 → Application → Cookies → 도메인 선택
세션 ID 가 매 요청에 동봉됨: F12 → Network → 한 요청 → Headers → Request Headers → Cookie 줄
| 옵션 | 의미 | 왜 중요 |
|---|---|---|
HttpOnly | JS 에서 접근 불가 | XSS 공격 방어 |
Secure | HTTPS 에서만 전송 | 중간자 공격 방어 |
SameSite | 크로스 도메인 요청 시 제한 | CSRF 방어 |
Domain | 유효 도메인 제한 | 의도치 않은 공유 방지 |
MaxAge | 유효 시간(초) | 오래된 쿠키 자동 삭제 |
👉 JSESSIONID 는 보통 HttpOnly 자동 적용 (Spring 기본).
대형 사이트는 서버가 여러 대(예: A, B, C). 사용자가 A 서버에서 로그인 → B 서버로 요청이 가면 → B 는 그 세션을 모름. 「Sticky Session」 또는 「세션 클러스터링」(Redis 등) 으로 해결.
동시 사용자 10 만 명 = 서버에 10 만 개 보관함. 메모리 압박. 큰 데이터는 DB 또는 외부 캐시(Redis)에.
👉 본 과정의 학습용 환경에서는 단일 서버 가정. 위 한계는 후속 과정에서.
최근에는 세션 대신 JWT (JSON Web Token) 도 자주 사용:
👉 본 과정에서는 세션만. JWT 는 후속 과정.
userId=admin)회원 관리 / 로그인 → HttpSession 사용
v3 부터 v∞ 까지 모든 인증·권한 처리는 세션 기반. 쿠키는 다음 경우에만:
쿠키와 세션을 따로따로 봤다. 둘이 어떻게 다른지, 언제 무엇을 쓸지 흐릿.
두 도구의 저장 위치·보안·용량 차이를 표로 정리. 의사결정 기준을 갖춘다.
다음: ★ v3 안전한 회원가입/로그인 — BCrypt + 세션 도입.