본문 바로가기

CS/HTTP

무상태 프로토콜 ( Stateless ) 지향

HTTP 의 중요한 특징중 하나는, 무상태 프로토콜을 지향한다는 점이다.

서버가 클라이언트의 상태를 보존하지 않는다.

장점 : 서버 확장성 높음 ( 스케일 아웃 )
단점 : 클라이언트가 추가 데이터 전송

Stateful - Stateless 의 차이점

상황에 빗대어 예를 들어보자면,

 

상태 유지 ( stateful )

고객 : 이 노트북 얼마인가요?
점원 : 100만원 입니다.

고객 : 2개 구매하겠습니다.
점원 : 200만원 입니다. 신용카드, 현금중 어떤걸로 구매하시겠어요?

고객: 신용카드로 구매하겠습니다.
점원 : 200만원 결제 완료 되었습니다.

 

상태 유지 ( stateful, 점원이 중간에 바뀐다면 ? )

고객 : 이 노트북 얼마인가요?
점원A : 100만원 입니다.

고객 : 2개 구매하겠습니다.
점원B : ? 무엇을 2개 구매하시는데요?

고객: 신용카드로 구매할게요.
점원C : ? 무슨 제품을 몇개 신용카드로 구매하세요?

 

이 상황에 빗대어 표현한것은 stateful 이다.

stateful 한 서버는 서버가 클라이언트의 이전상태 ( 문맥 ) 을 보존하는것

다시 Stateful 한 지점을 짚어서 대화를 살펴보면,

고객 : 이 노트북 얼마인가요?
점원 : 100만원 입니다. ( 노트북 상태 유지 )

고객 : 2개 구매하겠습니다.
점원 : 200만원 입니다. 신용카드, 현금중 어떤걸로 구매하시겠어요?
( 노트북, 2개 상태 유지 )

고객: 신용카드로 구매하겠습니다.
점원 : 200만원 결제 완료 되었습니다.
( 노트북, 2개, 신용카드 상태유지 )

 

다음은 Stateless 한 대화이다.

 

고객 : 이 노트북 얼마인가요?
점원 : 100만원 입니다.

고객 : 노트북 2개 구매하겠습니다.
점원 : 노트북 2개는 200만원 입니다. 신용카드, 현금중 어떤걸로 구매하시겠어요?

고객: 노트북 2개 를 신용카드로 구매하겠습니다.
점원 : 200만원 결제 완료 되었습니다.

 

이 대화는 중간에 점원이 바뀌더라도 이어질수 있다.

 

고객 : 이 노트북 얼마인가요?
점원A : 100만원 입니다.

고객 : 노트북 2개 구매하겠습니다.
점원B : 노트북 2개는 200만원 입니다. 신용카드, 현금중 어떤걸로 구매하시겠어요?

고객: 노트북 2개 를 신용카드로 구매하겠습니다.
점원C : 200만원 결제 완료 되었습니다.

 

무상태 대화는 점원이 필요한 데이터를 그때그때 고객에게 전달 받음으로써 점원이 바뀌더라도 고객이 원하는 응답을 해줄수 있는것이다.

 

정리

상태 유지 : 중간에 다른 점원으로 바뀌면 안된다.
( 중간에 다른 점으로 바뀔 때 상태 정보를 다른 점원에게 미리 알려줘야 한다. )

무상태 : 중간에 다른 점원으로 바뀌어도 된다.

- 갑자기 고객이 증가해도 점원을 대거 투입할수 있다.

- 갑자기 클라이언트 요청이 증가해도 서버를 대거 투입할수 있다.

무상태는 응답 서버를 쉽게 바꿀수 있다. -> 무한한 서버 증설 가능

 

만약 서버가 Stateful 하다면 어떤일이 생길까?

1. 하나의 클라이언트에 항상 하나의 같은 서버가 유지되어야 한다. ( 클라이언트가 보낸 정보를 기억하고 있어야 하기 때문 )

2. 그렇게 대화중이던 서버가 갑자기 장애가 나서 연결이 끊킨다면, 클라이언트는 모든것을 처음부터 다시 해야한다.

 

Stateless 한 서버의 경우에는 위의 문제가 없다.

1. 아무 서버나 호출해도, 클라이언트가 서버에게 필요한 정보를 모두 보내주기 때문에 요청 에 대한 단순한 응답만 해주면 된다.

2. 요청 - 응답 중간에 서버가 장애가 난다면, 중계 서버가 다른 서버로 연결해버리고, 요청은 필요한 모든 정보를 가지고 있기 때문에 클라이언트는 같은 응답을 받을수가 있게된다.

3. 따라서 스케일 아웃 ( 수평적인 확장 ) 에 유리하다. 같은 기능을 하는 서버들을 수십대 수백대를 늘릴수 있는것이다.

 

Stateless 의 한계점

모든 것을 무상태로 설계 할수 있는 경우도 있고, 없는 경우도 있다.

무상태 의 예 : 로그인이 필요 없는 단순한 서비스 소개화면

상태 유지 의 예 : 로그인

로그인한 사용자의 경우 로그인 했다는 상태를 서버에 유지 시켜줘야함.

일반적으로 브라우저 쿠키와 서버 세션등을 사용해서 상태 유지

서버 세션에 저장해뒀다면, 세션이 풀리거나 세션 서버가 죽을경우 로그인한 유저들은 로그인이 풀리게 된다.

어쩔수 없는 한계가 있지만, 상태 유지는 최소한만 사용한다.

한가지더 단점이 있다면, 한번에 많은 데이터양을 필요로 한다.

 

한마디로 요약하자면, stateless 하다는 것은 서버와 클라이언트의 요청 응답간 데이터를 기억하지 않도록 지향하는것을 의미한다.

 

'CS > HTTP' 카테고리의 다른 글

HTTP API 를 만들어보자 - URI 설계  (0) 2022.09.06
HTTP 메시지  (0) 2022.09.06
비 연결성 ( Connectionless )  (0) 2022.09.05
HTTP 란 무엇을 의미하는가?  (0) 2022.09.05
웹 브라우저 요청 흐름  (0) 2022.09.05