📘 Stateless란 무엇인가?

Stateless는 웹 서버 - 클라이언트 환경에서 서버가 클라이언트의 이전 정보를 저장하지 않는것을 의미합니다.

서버는 클라이언트의 모든 요청을 개별적으로 받아들여 처리합니다.

HTTP의 Stateless

HTTP는 초기에 매우 단순한 디자인을 가지고 설계되었습니다.

URL을 통해 html 파일을 요청하고 파일을 받으면 연결을 종료하는 식으로 동작했습니다.

단순한 설계상 그 어디에도 클라이언트의 추가적인 정보들을 서버는 알수 없었습니다.

그래서 우리는 HTTP가 Stateless 하다고 말합니다.

하지만 어떤 경우에는 우리가 클라이언트의 요청을 연속적으로 유지하고 싶을때가 있습니다.

이를태면 쇼핑몰 사이트에서 사용자가 장바구니를 클릭했을때입니다.

쇼핑몰을 잘 이용하던 사용자의 정보를 장바구니를 눌렀다고 서버가 “너 누구야?” 라고 다시 사용자 정보를 인증하게 한다면 곤란할 것 입니다.

이렇게 HTTP의 Stateless의 단점을 보완하기 위해 나온것들이 쿠키, 세션같은 기술 입니다.

📘 Stateless의 장점

HTTP는 왜 Stateless 할까요. 단점밖에 없었다면 사용되지 못했을 것입니다.

Stateless하게 구현을 했을때에는 Stateful하게 구현했을때보다 많은 사용자의 요청을 서버가 처리할 수 있게됩니다.

디비의 커넥팅풀과 같은 원리라고 생각이 드는데 간단히 예를들면,

우리가 Stateful하게 서버를 만든다면 어떤 사람이 10시에 데이터를 요청해서 받은 커넥션을 서버가 끊지않고 사용자가 볼일을 볼 시간동안 연결을 유지한다면 그 사용자가 데이터를 요청하지 않는 시간에 서버는 다른사람의 데이터를 처리하지않고 가만히 앉아서 놀고먹고 있기 때문에 그 노는 시간만큼의 자원이 낭비되는 것입니다.

우리가 샤워를 위해 샤워실을 만들었는데 샤워기에 물끄는 기능이 없다면 우리가 샤워하지 않을때에 물이 계속 버려지는 것과 같다고 쉽게 설명할수 있을것같습니다.

HTTP는 Stateless하기 때문에 데이터 응답이 완료되는 시점에 연결을 끊을수 있어 더 많은 사용자에대해 정보제공이 가능해 집니다.

📘 HTTP 2.0은 Stateless하나요?

갑자기 공부하다가 HTTP/2는 Stateful하다는 문장을 보게되었습니다.

HTTP 2.0이 되면서 기존 1.1과 바뀐 대표적인 차이점은 성능입니다.

HTTP 2.0에서는 성능을 위해 동일한 사용자에 대해 헤더 압축을 진행하고 데이터 전송을 병렬스트림의 형태로 스트림간 독립성을 제공해주는 기능이 추가되었습니다.

여기서 동일한 사용자의 요청의 헤더는 많은 부분이 동일하기 때문에 동일한 사용자의 요청에대해 헤더가 바뀐부분만 송신할수있게하여 헤더의 중복을 줄이는 기능이 있습니다.

이 기능을 구현하기위해 HPACK이라는 기술을 사용하고 이 기술은 정적테이블과 동적테이블을 두어 헤더를 저장합니다.

어? 그러면 이전의 헤더상태를 저장하니까 Stateful인가?? 라는 생각이 머릿속에서 스칩니다.

결론을 말하자면 HTTP2는 Stateless입니다.

왜냐하면 HTTP/2 공식문서 RFC7540 에서 기존의 HTTP의 의미를 변경하지 않은상태라고 말하고 있습니다. (첫페이지임)

이전의 상태는 HTTP1.1 공식문서에서 Stateless라고 직접적으로 언급하고 있는 상태입니다.

개인적으로 제일 햇깔렸던 이유는 HPACK때문입니다.

하지만 우리는 HTTP에서 쿠키를 사용하여 상태를 유지하는것을보고 HTTP가 Stateful하다고 말하지는 않습니다.

따라서 HPACK에서 상태를 유지한다고 해서 HTTP가 Stateful하다고 말할 수는 없을 것입니다.