HTTP의 비상태성(Stateless)

Posted by , November 16, 2022
HTTP

안녕하세요, 이번 포스팅에서는 HTTP 의 비상태성이라는 특징에 대해 알아보겠습니다. 비상태성, 즉 Stateless 를 이해하기 위해선 Stateful 과의 차이를 비교해봐야 할텐데, 이를 자세히 살펴보는 방식으로 진행해보겠습니다.


HTTP의 특성

HTTP 의 특징의 크게 3가지를 가진다고 보시면됩니다.

  1. 무상태 프로토콜 : Stateless
  2. 비 연결성 : Connectionless
  3. HTTP 메시지 관련

이들에 대해 자세히 알아보겠습니다.


무상태 프로토콜 : Stateless

HTTP 의 중요한 특징중 하나는 무상태 프로토콜을 지향한다는 것입니다. 이를 영어로 표현하면 Stateless 라고 표현합니다. 이게 무슨 말이냐면, 서버가 클라이언트가 보내준 정보를 저장 하지 않는다. 즉, 상태를 계속해서 보존하지 않는다라는 것입니다.

Stateless 의 뜻을 잘 이해하기 위해서, 저희는 Stateful 과 Stateless 의 차이에 알 필요가 있습니다.


Stateful VS Stateless

설명에 앞서, 미리 정리를 해보면 아래와 같습니다.

Stateless

  • 클라이언트가 보내준 정보를 서버에 저장(유지)하지 않고, 보내준 정보를 기반으로 일련의 과정들을 처리후에 클라이언트에게 응답해주는 방식
  • 장점 : 스케일 아웃 - 수평 확장에 있어서 유리 (동일한 기능을 수행하는 수많은 서버로 확장가능)

Stateful 은 항상 같은 상태의 정보를 들고있는 상태의 서버가 지속되어야 합니다.. 만일 클라이언트가 A가 서버에게 여러 전자기기중 "노트북"을 사겠다는 정보를 보내고, 뒤이어서 "2개"를 구매하겠다는 정보를 보냈다고 가정해봅시다. 이때 여러 서버중에서 서버1이 "노트북", "2개" 라는 키워드를 저장 및 유지하고 있는 상태가 됩니다.

그런데 만일 서버1이 터졌다면, "노트북", 그리고 "2개" 에 대한 정보를 잃게될겁니다.

클라이언트는 노트북 2개에 대한 가격을 알수가없어서, 클라이언트는 처음부터 다시 결제 과정을 진행해야할겁니다.

여기서 알수 있는것은, Stateful하게 서버를 유지하는 것은 힘들다는 것을 알 수 있습니다.

반면 무상태(Stateless) 에서는 애초에 맨처음부터 클라이언트가 "노트북"을 "2개" 사겠다는 정보를 가지고 요청을 보냅니다. 그러면 서버는 노트북, 2개에 대한 정보를 보관(유지)하지 않습니다.

이 무상태, Stateless 의 장점은 뭘까요? 만일 서버1이 터지더라도, 서버2가 대신해서 클라이언트로부터 받은 "노트북", "2개" 라는 정보를 기반으로 결제를 진행해주면 되는 것입니다. 이는 Stateless 특징으로 인해 가능해진 것입니다.

또한 이 Stateless 는 스케일 아웃, 즉 수평확장에 있어서 정말 유리합니다. 같은 기능을 하는 서버를 여러개로 확장시킬 수 있는 것이죠.


그런데 이런 Stateless 에도 한계가 있습니다. 모든 것을 무상태로 설계할 수 잇는 경우도 있겠지만, 반대로 무상태로 설계할 수 없는 경우도 존재합니다.

1. 로그인 상태여부 : 쿠키(Cookie), 세션(Session)

대표적으로, 상태를 유지해야 하는 경우가 바로 "로그인"입니다. 서버에 현재 로그인되어 있는 유저에 대한 정보를 계속 유지해야 하는데, Stateless 의 특성상 서버에 유저에 대한 정보를 계속 유지를 시키지 못합니다.

즉, 로그인한 사용자에 대해 로그인 했다는 상태를 서버에 계속 유지시켜야하는데, statesless 특성상 서버에 로그인 상태여부를 저장하지 못하는 것입니다.

그래서, 일반적으로 브라우저의 쿠키와 서버 세션등을 사용해서 상태를 유지하는 방식으로 로그인 상태여부를 유지시켜줄 수 있습니다. 이렇게 했을떄 세션정보가 날라가거나, 세션 정보가 만료가되어서 죽어버린다면 로그인이 해제되는 방식인 것이죠.

2. Stateful 를 최소한으로 사용하자.

또한 상태 유지는 최소한으로 사용하며 꼭 필요한 경우에만 어쩔 수 없이 사용해야 합니다. 방금 말씀드린 로그인 관련 이슈에 대해서 상태 유지를 시켜야하므로, 이럴떄만 사용해야 하겠죠?

3. 서버 입장에서 한번에 많은 데이터를 수용해야한다.

마지막으로 클라이언트로 부터 서버는 정말 많은 데이터를 받아야합니다.

Stateful 의 경우는 클라이언트로 부터 하나씩 차근차근 "노트북", "2개" 라는 정보를 받아서 서버에 계속 저장하고 유지해나가는 방식입니다.

그러나 Stateless 의 경우는 클라이언트로 부터 한번에 "노트북", "2개" 라는 정보를 받아야합니다.