Stateful : Stateless

moon.kick·2025년 4월 19일

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)

  1. 로그인 시 JWT 발급 → Authorization: Bearer <token> 헤더 반환
  2. 이후 요청마다 토큰 전송 → 필터에서 서명 검증SecurityContext 생성
  3. 서버 재시작·오토스케일링과 무관하게 동작 (토큰 자체에 클레임 내장)
  4. 토큰 만료·갱신 로직이 필수, 탈취 시 피해가 크므로 HTTPS + 짧은 만료를 사용
// AuthenticationFilter.doFilterInternal() 요약
String jwt = resolveToken(request);
if (jwtProvider.validate(jwt)) {
    Authentication auth = jwtProvider.getAuthentication(jwt);
    SecurityContextHolder.getContext().setAuthentication(auth);
}
chain.doFilter(request, response);

✅ Stateful 구현 흐름 (HttpSession + 서블릿)

  1. 첫 요청에서 HttpSession session = request.getSession(true)
  2. 로그인 성공 후 session.setAttribute("user", userDto);
  3. JSESSIONID 쿠키를 브라우저가 보관 → 다음 요청 시 자동 전송
  4. 세션이 서버 메모리(또는 Redis) 에 존재해야 하므로
    ‑ 서버 간 세션 복제(Sticky Session x) or 외부 세션 스토리지 필요
// LoginServlet.doPost()
HttpSession session = request.getSession();
session.setAttribute("userId", user.getId());
session.setMaxInactiveInterval(30 * 60);  // 30분

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은 “서버가 너를 기억”해 사용자 경험이 쉽다.
프로젝트 성격·스케일링·보안 요구사항에 따라 둘을 적절히 섞어 쓰면 된다.

profile
@mgkick

0개의 댓글