4월 16, 2022

TIL) Stateless

 

무상태 프로토콜 

"컴퓨팅에서 무상태 프로토콜(stateless protocol)은 어떠한 이전 요청과도 무관한 각각의 요청을 독립적인 트랜잭션으로 취급하는 통신 프로토콜로, 통신이 독립적인 쌍의 요청과 응답을 이룰 수 있게 하는 방식이다. 무상태 프로토콜은 서버가 복수의 요청 시간대에 각각의 통신 파트너에 대한 세션 정보나 상태 보관을 요구하지 않는다. 반면, 서버의 내부 상태 유지를 요구하는 프로토콜은 상태 프로토콜(stateful protocol)로 부른다."

(https://ko.wikipedia.org/wiki/%EB%AC%B4%EC%83%81%ED%83%9C_%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C)

위는 무상태 프로토콜(Stateless)에 대해 검색할때 나오는 정의입니다.

서버가 client에 대한 세션의 상태(state)를 보관하지 않고, server의 response가 client의 세션 state와 독립적으로 이루어진다고 합니다. 

세션이 뭘까요? web Session 또는 http session은 단순하게 생각해서, "같은 client와의 연이어진 request와 response를 의미합니다" 각 세션은 객체이기에, unique한 id를 가지고 있습니다.

stateful과 stateless 프로토콜은 이 "세션"을 다루는 방식이 다릅니다.


Stateful 

: server와 client간 세션 state에 기반하여 server는 response를 보냅니다. 이를 위해서는 세션 state를 포함한 세션 정보를 server에 저장해야 합니다.

대표적으로 TCP의 3way-handshake의 경우에, syn - synack - ack의 과정이 이루어진 후, 세션 상태가 설립(established)된 이후에야 client와 server가 데이터를 주고받을 수 있게 됩니다. 이는 TCP가 세션 상태에 따라 server의 응답이 달라지게 되는 stateful한 프로토콜임을 의미합니다.

이때 

1. 세션 정보가 server에 저장되고

2. 세션 state에 따라 응답이 이뤄집니다.


Stateless

이와 반대로 stateless에서는 server의 응답과 client의 세션 상태가 독립적입니다.

server는 요청에 대해 응답을 보내는 역할만을 수행하며, 세션에 대한 관리는 client에게 일임됩니다. 따라서 

1. 서버는 client 와의 세션 정보를 저장하지 않습니다. 

2. 세션에 무관하게 응답을 보냅니다 (필요에 따라 외부 DB에 저장합니다)


UDP와 HTTP가 대표적인 stateless 프로토콜입니다.



위 사진은 http 프로토콜의 예시인데, server는 client와의 세션 정보를 저장하지 않기에, A가 재차 요청을 보냈을 시 A를 기억하지 못하고 있습니다.


이러한 stateless 구조의 가장 큰 장점은 수평확장(Scale out) 입니다.

증가하는 트래픽으로 인하여 서버를 추가로 증설했다고 가정했을 시, stateful 구조에서는 기존 서버에 존재하던 client의 세션 정보를 추가 서버에 옮겨주는 과정이 필요한 반면, 

stateless 구조에서는 server가 세션 관리를 하지 않으며, 경우에 따라 해당 정보가 외부 DB에 저장돼 있기에, 새로운 서버가 세션에 대한 정보를 저장할 필요도 없고, 필요하다면 취득하기도 용이해집니다. 


참조 : https://5equal0.tistory.com/entry/StatefulStateless-Stateful-vs-Stateless-%EC%84%9C%EB%B9%84%EC%8A%A4%EC%99%80-HTTP-%EB%B0%8F-REST

https://medium.com/@maheshlsingh8412/cookie-session-story-of-a-stateless-http-3cd09cc01541