Network

HTTP 특징 (Stateless, connectionless)

경딩 2025. 1. 13. 13:24

HTTP 특징

  • http 는 클라이언트 서버 구조로 되어있다. (Request Response 구조)
  • 클라이언트가 http 메시지로 서버에 요청을 보내고 서버의 응답이 올때까지 기다린다.
  • 서버는 요청에 대한 결과를 만들어서 클라이언트에게 응답한다.

 

클라이언트 서버 구조는 클라이언트는 UI , 사용성에 집중할 수 있고 서버는 비즈니스 로직에 집중할 수 있는 이점이 있다.

양쪽이 독립적으로 진화할수 있다는것이 가장 큰 이점이다.

 

 

 무상태 프로토콜

stateless

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

장점 : 서버 확장성 높다. (스케일아웃)

단점 : 클라이언트가 추가 데이터 전송

 

Stateful, Stateless 차이

 

상태 유지 - Stateful

고객: 이 노트북 얼마인가요?

• 점원: 100만원 입니다.

 

• 고객: 2개 구매하겠습니다.

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

 

• 고객: 신용카드로 구매하겠습니다.

• 점원: 200만원 결제 완료되었습니다


Stateful, Stateless 차이

상태 유지 - Stateful, 점원이  중간에 바뀌면?

 

고객: 이 노트북 얼마인가요?

• 점원A: 100만원 입니다.

 

• 고객: 2개 구매하겠습니다.

• 점원 B: ? 무엇을 2개 구매하시겠어요?

 

• 고객: 신용카드로 구매하겠습니다.

• 점원C: ? 무슨 제품을 몇 개 신용카드로 구매하시겠어요?

 


Stateful, Stateless 차이

 

상태 유지 - Stateful, 정리

고객: 이 노트북 얼마인가요?

• 점원: 100만원 입니다. (노트북 상태 유지)

 

• 고객: 2개 구매하겠습니다.

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

 

• 고객: 신용카드로 구매하겠습니다.

• 점원: 200만원 결제 완료되었습니다 (노트북,2개, 신용카드 상태 유지)

 

Stateful 은 서버가 클라이언트의 이전상태(문맥)를 보존하고 있다.


Stateful, Stateless 차이

무상태 - Stateless

 

고객: 이 노트북 얼마인가요?

• 점원: 100만원 입니다.

 

• 고객: 노트북 2개 구매하겠습니다.

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

 

• 고객: 노트북 2개를 신용카드로 구매하겠습니다

• 점원: 200만원 결제 완료되었습니다.


Stateful, Stateless 차이

무상태 - Stateless, 점원이 중간에 바뀌면?

 

고객: 이 노트북 얼마인가요?

• 점원A: 100만원 입니다.

 

• 고객: 노트북 2개 구매하겠습니다.

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

 

• 고객: 노트북 2개를 신용카드로 구매하겠습니다

• 점원C: 200만원 결제 완료되었습니다.

 

stateful(상태유지) 인 경우 중간에 다른 점원으로 바뀌면  문맥을 알수 없게 된다.

Stateless(무상태) 인 경우  상황에따라 필요한 데이터를 모두 넘긴다. 따라서 중간에 다른 점원이 와도 정상동작이 된다.

 


Stateful, Stateless 차이

정리

  • 상태 유지  :중간에 다른 점원으로 바뀌면 안된다.
  • (중간에 다른 점원으로 바뀔때 상태 정보를 다른 점원에게 미리알려줘야한다.)
  • 무상태 : 중간에 다른 점원으로 바뀌어도 된다.
    • 갑자기 고객이 증가해도 점원을 대거투입할 수있다.
    • 갑자기 클라이언트 요청이 증가해도 서버를 대거 투입할 수 있다.
  • 무상태는 응답서버를 쉽게 바꿀 수 있다. -> 무한한 서버 증설 가능

상태 유지 - Stateful

항상 같은 서버가 유지되어야 한다

상태 유지 - Stateful

중간에 서버가 장애가 나면 상태유지가 되던 정보가 다 날라가서 클라이언트는 처음부터 다시 요청해야한다.

 

무상태 - Stateless

클라이언트가 요청시 필요한 데이터를 실어보낸다.

따라서 아무 서버나 호출해도 된다.

 

 

무상태 - Stateless

클라이언트가 필요한 정보를 보내기때문에 별도의 문맥이 필요하지않는다.

중간에 서버가 장애가나면? 다른서버로 요청해도 문제가 없다.

 

무상태 - Stateless

필요한 정보를 실어보내기때문에 어떤 서버로 가던 상관이 없다. 때문에 스케일아웃에 유리하다.

스케일 아웃 - 수평 확장 유리


Stateless

실무 한계

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

  • 무상태
    • 예) 로그인이 필요 없는 단순한 서비스 소개 화면
  • 상태 유지
    • 예) 로그인
  • 로그인한 사용자의 경우 로그인했다는 상태를 서버에 유지
  • 일반적으로 브라우저 쿠키와 서버 세션등을 사용해서 상태 유지
  • 상태 유지는 최소한만 사용, 꼭 필요한 경우에만 사용하는 것이 좋다.
  • 또한 stateful보다는 전송해야하는 데이터 양이 많다.

애플리케이션 설계는 최대한 무상태 설계를 하고 꼭 필요한 경우만 상태유지를 적용하자!


연결을 유지하는 모델

비 연결성(connectionless)

TCP/IP 은 연결형 프로토콜로 기본적으로 연결을 유지한다. 

클라언트1이 서버의 요청을 하고 응답을 받는다.

클라언트2이 서버의 요청을 하고 응답을 받는다. 이때 아까 연결을 맺은 클라이언트1 연결이 지속되고 있다.

 

클라언트3이 서버의 요청을 하고 응답을 받는다. 이때 아까 연결을 맺은 클라이언트1, 2 연결이 지속되고 있다.

따라서 연결을 유지하고 있는 서버의 자원이 계속 소모되고 있다.

 

그  후 클라이언트 1이 요청을 하고 서버에 응답을 받는다.

이떄 클라이언트 2, 3 을 사용하지 않아도 계속 서버에 연결을 하고 있어야한다는 단점이 있다.

 


연결을 유지하지 않는 모델

 

 

 

클라이언트1 과 서버와 TCP/IP 연결후 요청-> 응답 과정을 거친후 TCP/IP 연결을 끊어버린다.


클라이언트2 과 서버와 TCP/IP 연결후 요청-> 응답 과정을 거친후 TCP/IP 연결을 끊어버린다.

 


클라이언트3 과 서버와 TCP/IP 연결후 요청-> 응답 과정을 거친후 TCP/IP 연결을 끊어버린다.

서버는 현재 요청을 주고 받을때만 연결을 하고 응답후 연결을 끊기 때문에 서버가 유지하는 자원을 최소화할수 있다.

 

 

비연결성

  • HTTP 에 기본이 연결을 유지하지 않는 모델
  • 일반적으로 초단위의 이하의 빠른 속도로 응답
  • 1시간동안 수천명이 서비스를 사용해도 실제 서버에서 동시에 처리하는 요청은 수십개 이하로 매우  적음
    • 예) 웹브라우저에서 계속 연속해서 검색 버튼을 누르지않는다.
  • 서버자원을 매우 효율적으로 사용할 수 있다.

무상태성은 클라이언트와 서버 간에 상태 정보를 들고있지 않아 클라이언트가 상태 정보를 일일히 http에 실어 요청해야되는 것을 말하고, 비연결성은 클라이언트와 서버 간에 네트워크 연결이 끊어져 단절된다고 이해하면 된다.

 

비연결성

한계와 극복

  • 매 요청마다 TCP/IP 연결을 새로 맺어야 한다 - 3 way handshake 시간이 추가됨
  • 웹 브라우저로 사이트를 요청하면 HTML 뿐만 아니라, 자바스크립트, css, 추가 이미지 등 수많은 자원이 함께 다운로드된다.
  • 따라서 기본적으로 HTTP 지속 연결(Persistent Connections)로 문제를 해결한다.
  • HTTP/2, HTTP/3에서 더 많은 최적화가 이뤄졌다.

 

 

매번 연결을 맺고 끊어서 재연결시 발생하는 시간을 줄이기 위해 HTTP 지속연결을 사용하고 있다.

즉 기본은 비연결성이지만, 성능최적화를 위해서, 약간의 연결유지를 가져간다고 생각하면 된다.