🍑 개요
stateful
과 stateless
는 컴퓨터 과학 및 소프트웨어 엔지니어링에서 사용되는 두 가지 중요한 개념이다. 이들은 특히 클라이언트-서버 아키텍처, 네트워킹, 프로그래밍 등에서 중요한 역할을 한다. 이 두 개념은 시스템이 사용자의 상태 정보 (예: 세션 정보, 사용자 설정, 이전 상호작용의 기록 등)를 어떻게 처리하는지를 기준으로 구분된다. 이것을 HTTP 관점에서 어떻게 정의되고 사용되는 지 한 번 알아보자. 🍋 HTTP에서의 Stateful
HTTP 프로토콜 자체는 기본적으로
Stateless
한 성격을 가진다. 즉, 웹 서버는 클라이언트 각 요청을 독립적으로 처리하고, 이전 요청에 대한 정보를 기억하지 않는다. 그러나 많은 웹 애플리케이션은 사용자의 로그인 상태, 사용자의 선호도, 구매 내역 등과 같은 상태 정보를 유지해야 한다. 이를 위해 HTTP는 쿠키, 세션, 토큰과 같은 매커니즘을 사용하여 Stateful
한 상호작용을 구현한다.
그럼 여기서
Statful
이 어떻게 클라이언트를 기억하는 방법들에 대해 좀 더 자세히 알아보도록 하자.1️⃣ 쿠키
웹 서버는 사용자의 브라우저에 특정 데이터 (쿠키)를 저장하고, 브라우저는 이후의 요청에 이 쿠키를 포함하여 서버에 전송한다. 이를 통해 서버는 사용자를 식별하고, 사용자의 이전 상호작용을 기억할 수 있다.

set-cookie
서버에서 클라이언트(웹 브라우저)로 쿠키를 전송할 때 사용된다. 웹 서버가 HTTP 응답의 일부로
set-cookie
를 헤더에 보내면, 브라우저는 이 정보를 사용하여서 로컬에 쿠키를 저장하게 된다. 
cookie
cookie
는 클라이언트가 서버로 HTTP 요청을 보낼 때 사용된다. 요청시 이 헤더에는 클라이언트가 저장하고 있는 쿠키정보가 포함되어 있으며, 서버는 이 정보를 사용하여 사용자를 식별하거나 상태 정보를 유지할 수 있게 된다. 
2️⃣ 세션
세션은 서버 측에서 사용자 정보를 저장하는 방식이다. 서버는 ID를 생성하여 클라이언트 (보통 쿠키를 통해서)에 전달하고, 클라이언트는 이후의 요청에서 이 ID를 사용하여 서버와 상태 정보를 공유한다.

- 서버 측에서 저장하는 세션
데이터는 서버에 저장되고, 클라이언트는 세션 ID를 가지고 있고, 이 세션ID는 쿠키에 포함되어있다.
- 보안
데이터가 서버에 저장되기 때문에 쿠키보다 보안이 강화된다.
- 용량 제한 없음
서버 측에 저장되기 때문에 크기 제한이 쿠키보다 덜 엄격하다.
- 서버 부하
모든 데이터가 서버에 저장되기 때문에 서버에 부담을 줄 수 있다.
- 시간 제한
세션은 사용자가 로그아웃하거나 일정 시간 동안 활동이 없을 때 종료될 수 있다. 은행을 가입을 해지하거나 계좌를 오래 사용하지 않으면 휴먼계좌가 해지되듯이!
🥭 HTTP에서의 Stateless
HTTP는 일반적으로 Stateless, 상태 비저장 프로토콜이다. 이는 HTTP 서버가 클라이언트의 이전 요청에 대한 상태 정보를 저장하지 않는다는 것을 의미한다.

하지만 HTTP가 상태 비저장 프로토콜로 설계된 데에는 여러가지 이유가 있다. 바로 이런 동작 방식이 웹의 확장성과 효율성 그리고 유연성에 많은 영향을 미치기 때문이다.
- 확장성
Stateless방식은 여러 서버 간의 요청을 쉽게 분산시킬 수 있다. 서버가 클라이언트의 이전 상태를 기억할 필요가 없으므로 대규모의 웹 서비스에서 서버 부하를 효과적으로 분산할 수 있다.
- 효율성
서버가 이전 상태를 유지하거나 관리할 필요가 없으므로, 속도가 빠르고 효율적으로 요청을 처리할 수 있다. 서버는 단순히 요청에 포함된 정보를 기반으로 응답을 생성하고 내보내면 되기 때문이다. 따라서 서버의 메모리 사용이 최적화 될 수 있고, 대규모 시스템에서 용이하다.
- 유연성
상태정보를 포함하지 않으므로, 프로토콜 자체적으로 단순하고 일관된 구조를 가질 수 있게 되었다. 이는 클라이언트와의 통신이 단순하고 명확해지므로, 새로운 기능을 추가하거나 확장하는데 더 유연해진다. 따라서 다양한 형태의 데이터 HTML, JSON, XML을 지원할 수 있다.
🍉 토큰 기반 인증
HTTP 프로토콜 자체는 토큰을 직접적으로 사용하지 않지만, 웹 애플리케이션에서 HTTP를 통해 클라이언트와 서버 간에 토큰을 전송하고 사용함으로서, 상태 비저장형식의 인증 방법으로 사용된다.

토큰은 인증 정보를 암호화하여 생성된 문자열, JWT (JSON Web Tokens)와 같은 토큰을 사용하여 사용자의 인증 상태를 유지한다. 사용자가 로그인하면 서버는 토큰을 생성하여 클라이언트에 전달하고, 클라이언트는 이 토큰을 요청에 포함 시켜 인증 상태를 유지한다.
🧐 토큰과 쿠키의 다른점??
토큰과 쿠키는 웹 상에서 사용자 인증 및 정보 저장을 위해 사용되지만, 그 목적과 사용 방식에서 차이점이 있다. 토큰을 쿠키에 저장하여 전송하는 경우가 있지만, 이것이 토큰을 ‘쿠키’로 변환 시키지는 않는다. 토큰의 구체적인 특징은 다음과 같다.
- 인증 및 권한 부여
토큰은 사용자의 인증 정보를 암호화하여 포함하고, 이를 서버에 제출하여 사용자가 누구인지 및 어떤 권한을 가지고 있는지를 증명한다. 쿠키는 클라이언트 측 데이터 저장과 세션 관리에 사용된다.
- 보안성
토큰은 서명되거나 암호화 되어있어, 데이터의 무결성과 보안을 제공한다. 쿠키는 웹 애플리케이션에서 클라이언트가 보관하기 때문에 상대적으로 보안에 취약하다.
- 저장 위치
토큰은 쿠키에 저장될 수도 있고, 클라이언트의 로컬 스토리지, 세션 스토리지 등에 저장될 수도 있다. 하지만 쿠키는 브라우저의 쿠키 저장소에 저장된다.
- HTTP 헤더 사용
토큰은 보통 HTTP 요청의
‘Authorization’
헤더에 실려 서버로 전송된다. 토큰은 HTTP 요청의 헤더에 포함되어 전송되는 반면, 쿠키는 모든 HTTP요청에 자동으로 포함된다.토큰은 JWT말고도 여러가지 종류가 있고 그 목적에 따라 용도가 다 다르다. 다음 기회에 이 토큰의 종류에 대해서 다뤄보도록 하겠다!
Share article