HTTP란? 무상태성과 비연결성에 대해 알아보자.

HTTP (HyperText Transfer Protocol)

인터넷에서 데이터를 주고받을 수 있는 프로토콜(규칙)으로 이렇게 규칙을 정해두었기 때문에, 모든 프로그램이 이 규칙에 맞춰 개발해서 서로 정보를 교환할 수 있습니다.

 

지금은 HTTP 시대라 할 만큼 모든 형태의 데이터를 HTTP를 사용해 전송할 수 있습니다.

  • HTML, TEXT
  • IMAGE, 음성, 영상, 파일
  • JSON, XML
  • 서버간의 데이터를 주고 받을 때
  • 거의 모든 형태의 데이터 전송 가능

 

HTTP의 역사
  • HTTP/0.9 - 1991년 : GET 메서드만 지원, HTTP 헤더 X
  • HTTP/1.0 - 1996년 : 메서드, 헤더 추가
  • HTTP/1.1 - 1997년 : 현재 가장 많이 사용하는 버전
  • HTTP/2 - 2015년 : 성능 개선
  • HTTP/3 - 현재 진행중 : TCP 대신 UDP 사용, 성능 개선

 

HTTP의 특징

HTTP는 다음과 같은 특징들을 갖고 있습니다.

  • 클라이언트 - 서버 구조
  • 무상태성(Stateless)
  • 비연결성(Connectionless)

 

자 이제 각 특징들에 대해 알아보도록 하겠습니다.

 

클라이언트 - 서버 구조란?

Request(요청)과 Response(응답) 구조로,

클라이언트는 HTTP 메세지를 통해 서버에 요청을 보내고, 서버에서 응답이 올때 까지 기다립니다.

서버는 요청에 대한 결과를 만들어서 클라이언트에게 응답합니다.

클라이언트 - 서버 구조를 만드는 이유는, 클라이언트는 서버 내부의 구조를 알지 못합니다.

그렇기 때문에 서버의 구조가 바뀐다하더라도 클라이언트에게 영향이 가서는 안됩니다.

이렇게 클라이언트 서버 구조를 만들게 되면, 서버의 구조가 바뀌어도 클라이언트는 요청을 보내고 서버가 응답할 때 까지 기다리므로 아무런 영향이 가지 않아

양쪽이 독립적으로 진행할 수 있게 됩니다.

 

무상태성(Statless)와 상태성(Stateful)에 대해

상태성(Stateful) 이란?

상태성은 말 글대로 상태를 유지하는 것입니다.

상태를 유지하기 때문에 클라이언트와 연결된 서버는 클라이언트 요청에 대한 정보를 계속 갖고 있게 됩니다.

하지만, 이 연결된 서버가 장애가 발생해 작동하지 않는다면 클라이언트는 다른 서버와 다시 연결을 하고 다시 요청을 해야하게 됩니다.

 

  • 카페에서 같은 점원에게 커피를 주문할 경우의 예를 들어 보겠습니다.

이 경우에 점원 A는 고객의 주문 상태에 대해 기억하고 있습니다.

 

  • 하지만 중간에 점원이 바뀔 경우의 예를 들어 보겠습니다.

점원 A에서 점원 B로 바뀌면서 점원 A가 고객의 주문을 B에게 알려주지 않았기 때문에

점원 B는 이전의 고객 주문 정보를 알 수 없어 아래와 같은 상황이 발생합니다.

만약 중간에 다른 점원으로 바뀔 경우에는 고객의 주문 정보를 다른 점원에게 미리 알려줘야합니다.

이러한 상황이 발생할 수 있는 문제가 있기 때문에 Stateful은 확장성에 한계를 갖습니다.

 

Stateful은 보통 상태 유지가 필요한 "로그인 기능"브라우저 쿠키와 서버 세션 등을 사용해 상태를 유지할 수 있도록 설계합니다.

하지만 Stateful확장성에 한계가 있기 때문에 최소한만 사용해야합니다.

 

무상태성(Statless)

말 그대로 상태를 유지하지 않습니다.

상태를 유지 하지 않기 때문에 클라이언트와 연결된 서버가 장애가 발생했더라도

클라이언트가 요청 정보를 기억하기 때문에 다른 서버를 연결하더라도 문제가 없습니다.

이러한 이유로 Statless은 수평확장에 유리합니다.

 

하지만 클라이언트가 Stateful에 비해 요청을 한번에 보내기 때문에 데이터를 너무 많이 보낸다는 단점이 있습니다.

 

  • 위와 똑같은 예시로 카페에서 점원에게 커피를 주문할 경우를 예를 들어 보겠습니다.

Statless고객이 주문 정보를 기억하고 있기 때문에 중간에 다른 점원으로 바뀌어도 주문을 할 수 있습니다.

만약, 고객의 요청이 증가하더라도 여러 점원을 투입할 수 있기 때문에 확장성에 용이 합니다.

 

 

연결성(Connections)과 비연결성(Connetionless)에 대해

연결성(Connections)

TCP/IP의 경우에는 기본적으로 연결을 유지하는 특징을 갖고 있습니다.

연결을 유지하는 경우에는 클라이언트와 서버가 한 번 연결이 됬다면 클라이언트가 요청을 보내지 않더라도 계속 연결을 유지해야합니다.

그렇기 때문에 연결을 유지하는 서버의 자원이 계속 소모되게 됩니다.

 

비연결성(Connectionless)

HTTP는 기본적으로 연결을 유지하지 않는 모델로 일반적으로 일반적으로 초 단위 이하의 빠른 속도로 응답합니다.

동작 방식 클라이언트가 서버에 요청을 보내고 서버가 응답을 줬다면 TCP/IP 연결을 끊어 최소한의 자원을 사용해 서버를 유지할 수 있습니다. (서버 자원을 효율적으로 사용)

 

HTTP 초기에는 각각의 자원들을 다운로드하기 위해 연결과 종료를 반복해야 하는 문제가 있었지만,

"HTTP 지속 연결"로 연결이 이뤄지고 난 뒤 각각의 자원들을 요청하고 모든 자원에 대한 응답을 받은 후에 연결을 종료하여 초기 문제가 해결되었습니다.

HTTP/2와 HTTP/3에는 "HTTP 지속 연결"이 더욱 최적화 되어있습니다.