Stateful / Stateless

김재현·2024년 4월 22일
1

TIL

목록 보기
81/88
post-thumbnail

이전에 인증과 인가를 공부하다가 stateless를 살짝 짚고 넘어간 적이 있다.
HTTP의 통신은 비연결성(Connectionless) 무상태(Stateless)로 이루어지는데도 불구하고, stateful해야하는 '인증'을 어떻게 하는지에 관해서였다.
>이전 포스팅: Bean이란?, 인증과 인가란?

이번엔 stateful과 stateless에 대해 자세히 알아보고자 한다.

Stateful

stateful한 프로토콜은 요청 간에 상태를 유지한다. 이전 요청에서 발생한 정보나 상태를 계속 유지하고, 이를 다음 요청에서 활용하는 것이다.

즉, 서버에서 클라이언트의 상태 정보를 저장하는 것이다.

예를 들어, 홈페이지에 한번 로그인하여 인증하면 다른 페이지로 이동해도 인증이 풀리지 않고 유지되는 것이 바로 stateful한 것이다. 이런 로그인 정보는 일반적으로 브라우저의 쿠키(Cookie)에 저장되거나, 서버의 세션(Session) 메모리에 저장되어 상태를 유지한다.

장점

  • 편리함: 로그인 예시와 같이, 사용자가 서비스를 이용하는 동안 상태를 유지하여 일련의 작업을 보다 편리하게 수행한다.
  • 작업 복원: 시스템이 이전 상태를 기억하고 있기 때문에, 예기치 않은 오류가 발생했을 때 사용자가 이전 작업을 복원할 수 있다.
  • 효율적인 데이터 처리: 이전 상태를 활용하여 시스템이 효율적으로 데이터를 처리할 수 있어, 성능 향상에 도움이 된다.

단점

  • 확장성 제한: 서버 측에서 상태를 관리하고 저장해야 하기 때문에 서버의 부하가 증가되어 확장성이 제한될 수 있다.
  • 세션 관리 필요: 세션 관리에 의해 비용과 복잡성을 초래할 수 있으며, 보안 문제에 대비해야 한다.
  • 장애 복구의 어려움: 서버가 멈추거나 여러 이유로 해당 서버가 못쓰게 되어 다른 서버를 사용해야 할때 발생한다. 왜냐하면 새로운 서버에서는 이전 서버에서 가지고 있던 상태값들을 가지고 있지 않기 때문이다.

Stateful의 단점 보완 방법 : 캐시 서버

stateful의 이러한 단점을 보완하기 위해 클라이언트의 상태 데이터를 따로 캐시 서버(Redis)에 저장하여 이용한다.

나도 프로젝트를 진행하며 이메일 인증을 진행 할 때, redis에 클라이언트의 상태를 임시저장하여 부하를 분산시킨 경험이 있다.

redis의 장점으로는 데이터를 메모리에 캐싱하여 처리하기 때문에 응답시간이 빠르며, 분산 시스템 아키텍처를 지원하여 데이터의 가용성을 높이고, 시스템의 확장성을 향상시킬 수 있다.

Stateless

Stateless란 네트워크 통신에서 상태를 유지하지 않는 것을 의미한다. 각각의 요청이 서로 독립적으로 처리되며 이전 요청의 정보나 상태를 계속 유지하지 않는다는 것이다.

stateless를 그동안 프로젝트를 진행하며 사용해왔던 HTTP 프로토콜을 예로 들 수 있다.
클라이언트가 서버에 요청을 보내면(request) 서버는 그 요청에 대한 응답을 반환(response)하고 클라이언트와의 연결은 끊어져서, 이후의 요청은 서버가 이전 요청과는 독립적으로 처리되었다는걸 알 수 있다.

서버는 클라이언트의 상태를 추적하지 않고, 각각의 요청을 개별적으로 처리하는 것이다.

Stateless의 장점

  • 서버 부하 감소 : 서버는 단순히 받아서 응답만 해주기 때문에 상태 유지에 대한 부하가 현저히 줄어들게 된다.
  • 확장성: 각각의 요청을 독립적으로 처리하므로, 새로운 서버 인스턴스를 추가하거나 부하 분산을 쉽게 구현할 수 있다.
  • 간편한 관리: 세션 관리나 상태 관리와 같은 복잡한 기능이 필요하지 않아, 서버 관리 및 유지보수가 간편해진다.
  • 안정성: 하나의 요청이 실패하더라도 다른 요청에는 영향을 주지 않기 때문에, 시스템 전체의 안정성이 높아진다.

단점

  • 상태 유지의 어려움: 각각의 요청이 독립적으로 처리되기 때문에 상태를 유지하기가 어렵다. (일부 작업이나 기능을 구현이 까다로움)
  • 세션 관리의 어려움: 사용자의 상태를 유지하기 위해서는 보다 복잡한 세션 관리가 필요하다. (사용자 인증이나 상태 관리와 같은 기능을 구현이 까다로움)
  • 네트워크 부하: 각각의 요청에 필요한 모든 정보를 요청에 포함해야 하기 때문에, 데이터의 크기가 커질 수 있고 네트워크 부하가 발생할 수 있다.

stateless의 단점 보완 방법 : JWT 토큰

stateless 특징을 유지하면서도 로그인 상태 유지를 가능하게 하는 JWT(JSON Web Token)을 사용하여 단점을 보완할 수 있다.

Stateless: HTTP / REST

stateless라는 공통점을 가진 HTTP와 REST를 혼동하기 쉽다.

HTTP는 Statelss한 성격을 가진 '프로토콜'이며,
REST는 Stateless한 성격을 가진 '설계 구조'이다.

REST(Representational State Transfer)는 분산 시스템에서 리소스를 정의하고 관리하기 위한 아키텍처 스타일이다. 네트워크 상에서 서비스 간의 통신을 간소화하고, 확장성과 성능을 향상시키는 데 주로 사용한다.

RESTful

"RESTful"이라는 용어가 바로 "REST" 아키텍처 원칙을 준수하여 설계된 웹 서비스를 나타내는 용어이다.
HTTP를 통해 통신하고, 클라이언트와 서버 간의 상호 작용을 간소화하며, 확장성과 성능을 향상시킬 수 있는 특징이 있다.


출처


관련 포스팅

Previous Post

Following Post

profile
I live in Seoul, Korea, Handsome

0개의 댓글