Stateless는 “서버 기억력 0”이라 확장과 배포가 편하고,
Stateful은 “서버가 너를 기억”해 사용자 경험이 쉽다.
프로젝트 성격·스케일링·보안 요구사항에 따라 둘을 적절히 섞어 쓰면 된다.
1. 기본 개념 한 줄 정리
| 구분 | 정의 | 핵심 특징 |
|---|
| Stateless | “요청 ↔ 응답” 사이에 서버가 클라이언트 상태를 기억하지 않는다 | 확장성↑, 유지보수 쉬움, 매 요청에 모든 정보 포함 |
| Stateful | 서버가 클라이언트의 세션·컨텍스트를 보존해 다음 요청을 이어받는다 | 사용자 경험↑, 로직 단순, 스케일링·장애복구 부담 |
2. 왜 중요할까? – 웹·API 관점
| 항목 | Stateless 방식 | Stateful 방식 |
|---|
| HTTP 기본 성격 | 본래 HTTP = Stateless. REST API·Serverless·JWT 인증 등이 이 전제를 활용 | 세션(Cookie, 서버 메모리/Redis 등)에 상태를 저장해 “무상태” 한계를 보완 |
| 스케일링 | 아무 서버나 요청 받아도 동작 → 로드 밸런서 라운드로빈 OK | “세션 붙잡기(Sticky Session)” 필요하거나 외부 세션 저장소로 옮겨야 함 |
| 복원/무중단 배포 | 새 인스턴스 기동해도 상태 의존성 없음 → 배포 부드러움 | 세션 클러스터·레플리케이션 구성, 장애 시 세션 유실 리스크 |
| 보안 모델 | 매 요청에 토큰·서명 포함 → 전송 계층·토큰 관리 중요 | 서버가 상태 보유(세션 ID) → 세션 하이재킹·고정 공격 방어 필요(CSRF, SameSite 등) |
3. 실무 예시 (자바·Spring 관점)
✅ Stateless 구현 흐름 (JWT + Spring Security)
- 로그인 시 JWT 발급 →
Authorization: Bearer <token> 헤더 반환
- 이후 요청마다 토큰 전송 → 필터에서 서명 검증 후
SecurityContext 생성
- 서버 재시작·오토스케일링과 무관하게 동작 (토큰 자체에 클레임 내장)
- 토큰 만료·갱신 로직이 필수, 탈취 시 피해가 크므로 HTTPS + 짧은 만료를 사용
String jwt = resolveToken(request);
if (jwtProvider.validate(jwt)) {
Authentication auth = jwtProvider.getAuthentication(jwt);
SecurityContextHolder.getContext().setAuthentication(auth);
}
chain.doFilter(request, response);
✅ Stateful 구현 흐름 (HttpSession + 서블릿)
- 첫 요청에서
HttpSession session = request.getSession(true)
- 로그인 성공 후
session.setAttribute("user", userDto);
- JSESSIONID 쿠키를 브라우저가 보관 → 다음 요청 시 자동 전송
- 세션이 서버 메모리(또는 Redis) 에 존재해야 하므로
‑ 서버 간 세션 복제(Sticky Session x) or 외부 세션 스토리지 필요
HttpSession session = request.getSession();
session.setAttribute("userId", user.getId());
session.setMaxInactiveInterval(30 * 60);
4. 선택 가이드
| 상황 | 추천 접근 |
|---|
| 모바일·SPA 프론트 + 마이크로서비스 + 클라우드 오토스케일링 | Stateless(JWT/OAuth2) → API Gateway, CDN 캐시와 궁합 좋음 |
| 전통적 기업 내부 시스템, 로그인 상태로 복잡한 워크플로우 유지 | Stateful 세션 → 구현 단순, 프레임워크 기본 기능 활용 |
| 하이브리드 – 파일 업로드·결제처럼 긴 상태 유지 vs 나머지 REST API | 필요 구간만 State 패턴 사용, 다른 서비스는 Stateless 로 설계 |
5. 기억하면 좋은 키워드
- Sticky Session : L4·L7 로드밸런서가 같은 사용자를 같은 서버로 붙여주는 방식
- Session Store : Redis, Hazelcast, DB 등 외부 저장소에 세션 데이터 공유
- Idempotency : Stateless API 에서 재전송 보장 위해
Idempotency-Key 사용
- CSRF / SameSite : Stateful 쿠키 기반 인증 시 필수 보안 헤더
- Serverless : Lambda, Cloud Functions 같이 완전 무상태로 설계 → 호출마다 초기화
한 줄 요약
Stateless는 “서버 기억력 0”이라 확장과 배포가 편하고,
Stateful은 “서버가 너를 기억”해 사용자 경험이 쉽다.
프로젝트 성격·스케일링·보안 요구사항에 따라 둘을 적절히 섞어 쓰면 된다.