HTTP : 무상태성, 비연결성

hzn·2022년 11월 12일
1

HTTP / 네트워크

목록 보기
1/9
post-thumbnail
post-custom-banner

HTTP의 역사

HTTP/1.1, HTTP/2 : TCP 기반 프로토콜
HTTP/3 : UDP 기반 프로토콜

HTTP의 특징

클라이언트 - 서버 구조

  • 클라이언트가 요청을 보내면 서버가 응답

무상태성(Stateless)

  • HTTP는 서버가 클라이언트의 상태를 보존하지 않는 무상태 프로토콜
  • 장점 : 서버 확장성 높음. 무한한 서버 증설 가능 (스케일 아웃)
  • 단점: 클라이언트가 추가 데이터를 전송해야 함 (서버에 저장되어 있지 않으므로)
  • 단순한 서비스 소개 화면 같은 경우엔 무상태로 설계할 수 있지만, 로그인 등 유저의 상태를 유지해야 하는 서비스라면 브라우저 쿠키, 서버 세션, 토큰 등을 이용해 상태를 유지해야 한다.
  • 클라이언트가 요청할 때 필요한 데이터를 다 담아서 보내기 때문에 같은 기능을 하는 아무 서버나 호출해도 된다.
  • 서버에 장애가 생겨도 다른 서버에서 응답을 전달하기 때문에 클라이언트는 다시 요청할 필요가 없다.
  • 응답 서버를 쉽게 바꿀 수 있기 때문에 무한한 서버 증설이 가능하다.

cf) 상태 유지(Stateful)

  • 상태 유지가 되어야 하는 프로토콜이라면 항상 같은 서버가 유지돼야 한다.
  • 만약 해당 서버가 장애가 생긴다면 유지되던 상태 정보가 다 날아가 버리므로 처음부터 다시 서버에 요청해야 한다.

비연결성(Connectionless)

  • (HTTP/1.0 기준으로) HTTP는 연결을 유지하지 않는 모델
  • 실제로 요청을 주고받을 때만 연결을 유지하고 응답을 주고 나면 TCP/IP 연결을 끊는다.
  • 이를 통해 최소한의 자원으로 서버 유지를 가능하게 한다.
  • 트래픽이 많지 않고 빠른 응답을 제공할 수 있는 경우 효율적.

비연결성의 한계와 해결

  • 트래픽이 많고 규모가 큰 서비스의 경우 한계를 가짐
    👉🏽 요청 시마다 TCP/IP 연결(3 way handshake), 종료 시간 추가
    👉🏽 웹사이트 요청 시 HTML, 자바스크립트, CSS, 추가 이미지 등 수많은 자원이 다운로드 되는데 각각의 자원마다 연결과 종료를 반복하는 것이 비효율적.

  • HTTP 지속 연결(Persistent Connections)로 문제 해결
    👉🏽 연결이 이뤄지고 난 뒤 각각의 자원들을 요청하고 모든 자원에 대한 응답이 돌아온 후 연결을 종료한다.


cf) 연결을 유지하는 모델

  • (비연결성을 가지는 HTTP가 아니라면) TCP/IP의 경우 기본적으로 연결을 유지한다.
  • 클라이언트가 요청을 보내지 않더라도 연결을 유지한다.
  • 서버의 자원이 계속 소모된다.


참고 : 커피 주문으로 보는 무상태(Stateless) vs 상태 유지(Stateful)

Ex) 무상태(Stateless) 커피 주문

  • 점원(서버)이 중간에 바뀌어도 주문(요청과 응답) 가능 👉🏽 서버 대거 투입 가능
  • 고객(클라이언트)이 이전 주문을 기억해야 함.

Ex) 상태 유지(Stateful) 커피 주문

  • 고객(클라이언트)이 이전 주문을 기억하지 않아도 되지만
  • 점원(서버)이 중간에 바뀌면 주문(요청과 응답) 불가능.
    (중간에 바뀌면 다른 점원에게 알려줘야 함)

post-custom-banner

0개의 댓글