◆ TURNING · BOARD

쿠키 vs 세션

무엇을 어디에 저장할 것인가

학습 목표

  • 쿠키와 세션의 저장 위치 차이를 안다
  • 두 도구의 보안 수준용량 한계를 안다
  • 상황별로 어느 것을 쓸지 결정 기준 을 갖는다
  • 세션도 사실은 쿠키를 쓴다는 사실을 안다

⚠️ 두 도구가 비슷해 보인다

학생들이 자주 헷갈리는 것

"쿠키도 사용자 정보를 저장하고, 세션도 사용자 정보를 저장하고 — 둘 중 어느 걸 쓰면 되나요?"

전 차시들에서 각자 따로 봤지만, 이번에 둘을 나란히 비교해서 의사결정 기준을 잡습니다.

🛠️ 두 도구 — 한 줄 정의

┌──────────────────────────────────────────────────┐ │ 쿠키 (Cookie) │ │ 브라우저에 저장되는 작은 메모 │ │ 매 요청에 자동으로 함께 보내짐 │ ├──────────────────────────────────────────────────┤ │ 세션 (Session) │ │ 서버에 저장되는 보관함 │ │ 사용자에겐 「열쇠」(JSESSIONID 쿠키)만 발급 │ └──────────────────────────────────────────────────┘

🛠️ 두 도구의 모습

손님이 들고 가느냐 / 가게가 보관하느냐

식당에 비유하면 — 쿠키는 「영수증」(손님 호주머니에 들어감), 세션은 「손목 도장」(가게 보관함의 열쇠).

영수증 손목 도장

🛠️ 영수증 vs 손목 도장 — 동작

쿠키 (영수증) 손님 호주머니에 영수증 자체가 들어감 다음 방문 때 영수증 보여주면 가게가 인식 → 데이터가 손님 쪽에 세션 (손목 도장 + 보관함) 손님은 손목 도장만 받음 (작은 코드) 진짜 정보(주문 내역·VIP 등급)는 가게 보관함에 다음 방문 때 도장 보여주면 가게가 보관함 열어 확인 → 데이터가 가게 쪽에

한눈에 비교

항목쿠키세션
저장 위치브라우저 (사용자 PC)서버 메모리
보안약함 (사용자가 보고 수정 가능)강함 (서버 내부)
용량~4 KB큼 (메모리 한계까지)
수명 제어maxAge 로 명시 (브라우저 닫혀도 유지 가능)설정된 시간 (보통 30 분)
서버 부하0 (브라우저가 보관)사용자당 메모리 점유
여러 서버 동기화자동 (각 요청에 동봉)별도 처리 필요 (Redis 등)
JS 접근가능 (httpOnly 옵션 시 차단)불가

중요 — 세션도 쿠키를 쓴다

"쿠키 vs 세션" 이라고 비교하지만, 사실 세션도 쿠키를 사용 합니다.


서버:  Set-Cookie: JSESSIONID=abc123xyz...
브라우저:  Cookie: JSESSIONID=abc123xyz... (자동 동봉)

차이는 「무엇을 보관하느냐」:

  • 쿠키만 — 데이터 자체를 쿠키에
  • 세션 — 데이터는 서버에, 「열쇠」만 쿠키에

흐름 비교 — 로그인 처리

① 쿠키만으로 로그인 (위험) 로그인 성공 ↓ Set-Cookie: userId=admin; userName=관리자; isVip=true ↓ 브라우저에 그대로 저장 다음 요청 시 사용자가 쿠키 변조 가능! → 일반 사용자가 isVip=true 로 변경 가능 → 보안 사고 ② 세션 사용 (안전) 로그인 성공 ↓ 서버: session.setAttribute("loginUser", member) 보관함에 모든 정보 저장 ↓ Set-Cookie: JSESSIONID=abc123 (열쇠만) ↓ 다음 요청 시 Cookie: JSESSIONID=abc123 ↓ 서버: 보관함에서 abc123 의 loginUser 꺼냄 사용자가 변조 불가

의사결정 기준 — 무엇을 어디에

데이터 종류예시저장 위치
로그인한 사용자 정보userId, role세션
권한 / VIP 등급관리자 여부세션
비밀번호 / 카드번호(절대로!)세션 (또는 아예 저장 X)
장바구니 (비회원)상품 ID 목록쿠키
장바구니 (로그인 사용자)상품 ID 목록세션 또는 DB
UI 설정다크모드, 폰트 크기쿠키
최근 본 상품상품 ID 목록쿠키 또는 LocalStorage
광고 추적방문 기록쿠키 (제 3 자 쿠키)

핵심 의사결정 한 줄

"민감한 정보 → 세션" / "사용자 편의 설정 → 쿠키"

사용자가 봐도 / 변조해도 문제없는 데이터만 쿠키. 그 외에는 세션.

코드 비교 — Spring 에서


// 쿠키로 다크모드 저장
@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 로 직접 확인

쿠키 보기: F12 → Application → Cookies → 도메인 선택

스크린샷
F12 Application 탭의 Cookies 영역. theme=dark, JSESSIONID=abc123 등이 표 형태로 나열

세션 ID 가 매 요청에 동봉됨: F12 → Network → 한 요청 → Headers → Request Headers → Cookie 줄

쿠키 옵션 — 보안 강화

옵션의미왜 중요
HttpOnlyJS 에서 접근 불가XSS 공격 방어
SecureHTTPS 에서만 전송중간자 공격 방어
SameSite크로스 도메인 요청 시 제한CSRF 방어
Domain유효 도메인 제한의도치 않은 공유 방지
MaxAge유효 시간(초)오래된 쿠키 자동 삭제

👉 JSESSIONID 는 보통 HttpOnly 자동 적용 (Spring 기본).

세션의 한계 — 알아둘 것

서버가 여러 대일 때

대형 사이트는 서버가 여러 대(예: A, B, C). 사용자가 A 서버에서 로그인 → B 서버로 요청이 가면 → B 는 그 세션을 모름. 「Sticky Session」 또는 「세션 클러스터링」(Redis 등) 으로 해결.

메모리 부담

동시 사용자 10 만 명 = 서버에 10 만 개 보관함. 메모리 압박. 큰 데이터는 DB 또는 외부 캐시(Redis)에.

👉 본 과정의 학습용 환경에서는 단일 서버 가정. 위 한계는 후속 과정에서.

현대 웹의 흐름 — JWT

최근에는 세션 대신 JWT (JSON Web Token) 도 자주 사용:

  • 서버가 토큰을 발급 → 토큰 자체에 사용자 정보 (서명되어 있어 변조 불가)
  • 서버는 보관함 안 가짐 — 토큰만 검증
  • 여러 서버 환경에 유리
  • 모바일 앱 / SPA 와 잘 맞음

👉 본 과정에서는 세션만. JWT 는 후속 과정.

실험 — 세션 vs 쿠키 직접 비교

  1. 로그인 후 F12 → Application → Cookies 에서 JSESSIONID 확인
  2. JSESSIONID 값을 변경 (인스펙터에서 직접 편집)
  3. 새로고침 → 로그인 풀림 (세션 키가 안 맞아서)
  4. 반대로 — 쿠키로 직접 사용자 정보 저장 시도 (userId=admin)
  5. 변조해도 서버가 무시 — 세션이 진짜 정보 보관자이기 때문

본 과정의 결정

회원 관리 / 로그인 → HttpSession 사용

v3 부터 v∞ 까지 모든 인증·권한 처리는 세션 기반. 쿠키는 다음 경우에만:

  • JSESSIONID (자동 — Spring 이 알아서)
  • UI 설정 (필요 시)

🔄 Before / After

전 차시 끝

쿠키와 세션을 따로따로 봤다. 둘이 어떻게 다른지, 언제 무엇을 쓸지 흐릿.

이번 차시 끝

두 도구의 저장 위치·보안·용량 차이를 표로 정리. 의사결정 기준을 갖춘다.

📊 한 그림 정리

이번 차시의 데이터 흐름

민감 데이터
세션 (서버)
JSESSIONID 쿠키
브라우저
데이터는 서버에, 사용자에겐 「열쇠」만 — 보안 패턴의 기본

정리

오늘 들고 가는 것

  • 쿠키 = 브라우저 보관 / 세션 = 서버 보관
  • 세션도 쿠키(JSESSIONID)를 「열쇠」로 사용
  • 의사결정: 민감 정보 → 세션, 편의 설정 → 쿠키
  • 쿠키 옵션: HttpOnly · Secure · SameSite
  • 본 과정은 모든 인증을 세션 으로

다음: ★ v3 안전한 회원가입/로그인 — BCrypt + 세션 도입.