6장_ : 쿠키와 세션

2026. 2. 7. 21:44·Book/자바 웹 프로그래밍 Next Step

 

웹 개발을 하다 보면 반드시 마주치는 말이 있다.
“HTTP는 무상태 프로토콜이다” 라는 말이다.
그리고 이어서 항상 등장하는 개념이 쿠키 와 세션 이다.

 

 

 

HTTP는 왜 “무상태 프로토콜”인가

HTTP의 본질은 매우 단순하다.

클라이언트가 요청(Request)을 보내고
서버가 응답(Response)을 보내면
그 연결은 즉시 끊어진다.

서버는 다음 요청이 들어왔을 때,

  • 이 요청이 누가 보낸 것인지
  • 이전에 무슨 요청을 했는지
  • 로그인한 상태인지

를 기억하지 못한다.

그래서 HTTP는 기본적으로
“이전 요청을 기억하지 않는 프로토콜”,
즉 무상태라고 부른다.

하지만 실제 웹 애플리케이션은 다르다.

  • 로그인 상태 유지
  • 장바구니 유지
  • 사용자 맞춤 화면

같은 기능들은 반드시 상태를 기억해야 한다.

이 모순을 해결하기 위해 등장한 것이 쿠키다.

 

 

쿠키란 무엇인가

쿠키는 한 문장으로 정리하면 다음과 같다.

서버가 브라우저에게 “이 값을 저장해 두었다가, 다음 요청 때 다시 보내라”라고 시키는 작은 데이터다.

쿠키의 기본 동작 흐름

1. 서버가 응답(Response)을 보낼 때 `Set-Cookie` 헤더로 쿠키를 내려준다.

Set-Cookie: logined=true

2. 브라우저는 이 값을 자기 내부 저장소에 저장한다.

3. 이후 같은 서버로 요청을 보낼 때마다 브라우저가 자동으로 Cookie 헤더에 붙여서 보낸다.

Cookie: logined=true

이렇게 해서 서버는 다음 요청에서도
“아, 이 사용자는 logined=true 상태였구나”
라고 판단할 수 있다.

즉,

HTTP 자체는 상태를 기억하지 못하지만,
쿠키를 통해 상태 정보를 ‘요청마다 다시 보내는 방식’으로 우회한 것이다.

 

 

 

쿠키 방식의 치명적인 문제점

쿠키는 간단하고 강력하지만, 큰 단점이 있다.

1) 보안에 취약하다

쿠키는 브라우저에 저장된다.

  • 개발자 도구에서 볼 수 있다
  • HTTP 요청/응답 헤더에서 그대로 노출된다
  • 값 자체가 클라이언트에 있다

즉, 쿠키에 이런 값을 넣으면 위험하다.

  • 비밀번호
  • 이메일
  • 개인정보
  • 권한 정보

예를 들어,

Set-Cookie: password=1234

같은 방식은 절대 사용하면 안 된다.

2) 클라이언트가 조작 가능하다

쿠키는 브라우저에 있으므로,
사용자가 값을 바꿔서 요청을 보낼 수도 있다.

이 때문에 “쿠키에 중요한 상태 자체를 저장하는 방식”은 위험하다.

이 문제를 해결하기 위해 등장한 개념이 세션(Session) 이다.

 

 

세션은 왜 등장했는가

세션의 핵심 아이디어는 단순하다.

상태 데이터를 브라우저에 두지 말고, 서버에 두자.

세션의 기본 구조

  • 상태 데이터: 서버에 저장
  • 식별자(ID): 브라우저에 저장

즉,

  1. 서버가 로그인 성공 시
    • 서버 메모리(또는 저장소)에 사용자 정보를 저장한다
  2. 해당 저장 공간을 식별할 고유한 세션 ID를 만든다
  3. 이 세션 ID만 쿠키로 브라우저에 내려준다
Set-Cookie: JSESSIONID=ABC123
 

브라우저는 이후 요청마다

Cookie: JSESSIONID=ABC123

를 자동으로 보낸다.

서버는 이 값을 보고

“ABC123 세션 → 이 사용자구나”

라고 판단한다.

 

 

세션은 쿠키 없이 동작할 수 있을까?

여기서 중요한 오해가 하나 있다.

❌ 세션은 쿠키와 전혀 다른 기술이다
❌ 세션은 쿠키를 사용하지 않는다

이건 완전히 틀린 생각이다.

정확한 관계는 이렇다

  • 상태 데이터는 서버에 있다 → 세션
  • 그 상태를 식별하기 위한 값은 클라이언트로 전달해야 한다
  • HTTP에서 클라이언트 → 서버로 값을 전달하는 유일한 표준 방식은 쿠키다

즉,

세션은 “쿠키를 기반으로 동작하는 서버 측 상태 관리 기법”이다.

아무리 세션이 서버에 데이터를 저장하더라도,
그 세션을 식별할 ID를 서버에 전달하지 않으면
서버는 사용자를 구분할 수 없다.

그 ID를 전달하는 수단이 바로 쿠키다.

 

 

“HTTP에서 상태를 유지하는 방법은 쿠키밖에 없다”

  • HTTP는 요청과 요청 사이를 기억하지 못한다
  • 요청마다 상태를 전달해야 한다
  • 그 상태를 전달하는 표준 메커니즘이 쿠키다

세션이든,
로그인이든,
장바구니든,

결국 HTTP 요청에 실려서 전달되는 건 쿠키다.

차이점은 단 하나다.

구분 쿠키 기반 세션 기반
상태 데이터 위치 브라우저 서버
쿠키에 담긴 값 실제 상태 값 세션 ID
보안성 낮음 높음
실무 사용 거의 안 씀 표준

 

 

정리

  • HTTP는 본질적으로 상태를 기억하지 못한다
  • 상태를 유지하기 위해 요청마다 값을 다시 보내야 한다
  • 그 값을 보내는 표준 방식이 쿠키다
  • 쿠키에 중요한 정보를 직접 저장하는 것은 위험하다
  • 그래서 상태 데이터는 서버에 저장하는 세션이 등장했다
  • 하지만 세션도 쿠키 없이는 동작할 수 없다
  • 세션은 쿠키 위에 만들어진 상태 관리 기법이다

쿠키와 세션은 경쟁 관계가 아니라,
세션이 쿠키를 이용해 동작하는 구조다.

 

 

 

 

 


출처 : 《자바 웹 프로그래밍 Next Step》, 박재성, 로드북

'Book > 자바 웹 프로그래밍 Next Step' 카테고리의 다른 글

6장_ : JSP 중심 구조에서 MVC 패턴으로의 변화  (0) 2026.02.08
6장_ : 쿠키와 UUID로 세션 아이디 직접 생성  (0) 2026.02.08
6장_ 요구사항4 : 회원 목록 및 개인정보 수정 보안 강화  (0) 2026.02.07
6장_ 요구사항3 : 세션 기반 로그인/로그아웃 상태 만들기  (0) 2026.02.07
6장_ 요구사항1: 개인정보 수정  (0) 2026.02.06
'Book/자바 웹 프로그래밍 Next Step' 카테고리의 다른 글
  • 6장_ : JSP 중심 구조에서 MVC 패턴으로의 변화
  • 6장_ : 쿠키와 UUID로 세션 아이디 직접 생성
  • 6장_ 요구사항4 : 회원 목록 및 개인정보 수정 보안 강화
  • 6장_ 요구사항3 : 세션 기반 로그인/로그아웃 상태 만들기
sqaxe1
sqaxe1
woojoo-devlog 님의 블로그 입니다.
  • sqaxe1
    Woojoo's Devlog
    sqaxe1
  • 전체
    오늘
    어제
    • 분류 전체보기 (148)
      • Backend (9)
        • Servlet (7)
        • Spring (2)
      • Frontend (1)
      • CS (0)
      • Book (33)
        • 자바 웹 프로그래밍 Next Step (30)
        • 테스트 주도 개발: 고품질 쾌속개발을 위한 TDD.. (1)
        • 성공과 실패를 결정하는 1%의 네트워크 원리 (2)
      • Engineering (0)
        • Testing (0)
      • Infra (6)
        • AWS (6)
      • Java (4)
      • Network (1)
      • 김영한 (28)
        • 자바 입문 (8)
        • 실전 자바 - 기본편 (6)
        • 실전 자바 - 중급편 (10)
        • 실전 자바 - 고급편 (4)
      • Web (39)
        • Web Basics (39)
      • Project (24)
        • NeoSquare (0)
        • Memo Evolution (24)
      • 정보처리기사 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    aws
    java
    개발서적
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
sqaxe1
6장_ : 쿠키와 세션
상단으로

티스토리툴바