웹 개발을 하다 보면 반드시 마주치는 말이 있다.
“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): 브라우저에 저장
즉,
- 서버가 로그인 성공 시
- 서버 메모리(또는 저장소)에 사용자 정보를 저장한다
- 해당 저장 공간을 식별할 고유한 세션 ID를 만든다
- 이 세션 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 |
