Computer Science

[네트워크] HTTP의 4가지 특징 - 핵심 요약 총정리

쉬지마 이굥진 2024. 12. 26. 16:56

HTTP의 특징이 뭐지? 생각하면 뭉게뭉게 한 것 같은 개념에 이참에 정리하려고 글을 쓴다.

 

HTTP란?

특징이 뭔지에 대해 제대로 보기 전에, 먼저 HTTP의 개념에 대해 알아보고 넘어가려 한다. 

HTTP는 우리 사용자들과 제일 밀접하게 맞닿아 있는 프로토콜이라고 해도 과언이 아니다. (그만큼 우리 일상 생활에서 대중적으로 사용된다는 말)

💡HTTP (HyperText Transfer Protocol)
: 인터넷에서 데이터(HTML과 같은 문서)를 주고 받을 수 있는 프로토콜
→  클라이언트와 서버는 HTTP 프로토콜을 이용해 서로 통신한다.

HTTP의 역사

 

웹 개발에서 HTTP가 중요한 이유

  • 클라이언트, 서버 모두 HTTP를 이용해 통신 하므로 웹 개발자라면 HTTP를 잘 알아야 함
  • 에러를 해결하는데도 HTTP 지식이 중요함 (CORS, CORB 에러 등)

 

HTTP의 네 가지 특성

이 참에 다 외워버리자!

1. 요청-응답 기반 프로토콜이다.

HTTP는 클라이언트-서버 구조 기반의 요청-응답 프로토콜이다.

 

요청 메세지가 따로 있고, 그에 대한 응답 메세지가 있는 구조로서 동작한다. 즉, HTTP 요청 메세지와 HTTP 응답 메세지는 메세지 형태(구조)가 다르다.

이렇게 개발자도구의 Network 탭에 가면 http 요청 메세지 헤더와 응답 메세지 헤더를 확인할 수 있다.


2. 미디어 독립적 프로토콜이다.

HTTP는 미디어 독립적인 프로토콜의 일종이다.

미디어 독립적이란게 몽말임 ? ;; 할 수도 있는데, 여기서 미디어 독립적이란 말이 무슨 말인지 HTTP를 정의한 공식 문서인 RFC 9110 문서에서 확인해보자.

“HTTP가 요청하는 대상은 ‘자원’이다. (=리소스, 즉 자원이라고 부른다)
HTTP는 자원의 특성을 제한하지 않으며, 자원과 상호작용하는 데 사용할 수 있는 인터페이스를 정의할 뿐이다. (= 그냥 통로를 만들어 줄 뿐이다)
대부분의 자원은 URI로 식별된다.”


BY. RFC 9110

 

다시 말해서!

HTTP는 HTTP로 주고 받을 자원의 종류는 딱히 신경 쓰지 않고, 그 자원을 주고받을 수 있는 통로, 즉 인터페이스만 정의해 주는 역할을 한다. 요 의미이다.

 

마지막 정리를 해보자면,

  • 미디어 독립적 프로토콜?
    • HTTP는 주고받을 자원의 특성과 무관하게 그저 자원을 주고받을 수단(인터페이스) 역할만 함
    • HTTP를 통해 HTML, JPEG, PNG, JSON, XML, PDF 등 다양한 종류의 자원 송수신 가능

3. Stateless 프로토콜이다.

HTTP는 상태를 유지하지 않는 무상태성 프로토콜이다.

‘상태를 유지하지 않는다’는 말은, 서버가 HTTP 요청을 보낸 클라이언트와 관련된 상태를 기억하지 않는다는 의미이다.

나.. ㄱ 하니?

다시 풀어서 설명하면

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

따라서 클라이언트의 모든 HTTP 요청은 기본적으로 독립적인 요청으로 간주된다.

 

이런 상황을 대화로 예시를 들면 이렇게 될 것이다 😎

지민 : 민정아 저녁에 치킨먹자
민정 : 그래 !!
—저녁—
지민 : 이제 머그러 가자 !!
민정 : 멀?

 

여기서 궁금한 점이 생겼다.

HTTP는 왜 ? Stateless하게 만들었을까? 왜 상태를 유지하지 않을까?

 

왜 이렇게 만들었을까?

이유는 HTTP의 ‘확장성견고성을 위해서’라고 할 수 있다.

 

오늘날 많은 HTTP 서버들은 높은 가용성을 위해서 (= 장애가 생겨도 문제없이 동작하게끔 만들기 위해서) 여러 대로 다중화되어 구성 돼 있는 경우가 많다.

각기 동시다발적으로 상호작용하고 있는 모든 클라이언트의 상태 정보를 전부 다 유지하고, 그것들을 동기화하는 데에는 큰 부담이 따를 수 있다.

 

만약 무상태성 특징을 갖고있지 않다면, 다중화된 서버 A, B, C, D가 있다고 했을 때 이 4개 서버가 그 많은 클라이언트들의 정보를 다 기억해놓고 있어야 된다.

수많은 요청에 응답을 빨리빨리 보내주는 것만으로도 바쁜데 이 클라이언트들의 상태 정보까지 공유하기엔 좀 어려울 것 ..ㅋㅋ 무엇보다 속도가 엄청 느려질 거다.

 

정리

왜 이러케 만듦?

  • HTTP 서버는 일반적으로 많은 클라이언트와 동시에 상호작용함.
    • 모든 클라이언트의 상태 정보를 유지하는 건 서버에 큰 부담임
  • 특정 클라이언트가 특정 서버에 종속되는 상황을 방지함
    • HTTP가 상태를 유지하는 프로토콜이라면, 클라이언트는 자신의 상태를 기억하는 특정 서버하고만 통신하려는 우려가 생길 수도 있음

👉 무상태성의 장단점

  • 장점 :
    • 서버 확장성이 높다. 무상태는 응답 서버를 쉽게 바꿀 수 있기 때문에 무한한 서버 증설이 가능하다. (스케일 아웃)
    • 견고성이 높다. 동작 과정에서 몇 대의 서버가 다운되어도, 다른 서버로 대체가 용이하기 때문에 문제없이 동작할 수 있다.
  • 단점 : 클라이언트가 추가 데이터를 전송해야 한다.
🚨 무상태(Stateless)의 한계
로그인과 같이 유저의 상태를 유지해야하는 서비스라면, 브라우저 쿠키, 서버 세션, 토큰, 웹 스토리지 등을 이용해 상태를 유지해야 한다.

4. 지속 연결을 지원하는 프로토콜이다. (Persistent Connections)

이제 마지막 특성이다!

비연결성(Connectionless)이라는 말을 많이 들어봤을 텐데, HTTP의 특성 중 하나가 ‘비연결성’이라는 말이 맞긴 하지만 보충 설명이 필요하다.

원래는 비연결성 특성이 있었는데, 한계가 있어서 지금은 극복한 상태이기 때문이다. (비연결성은 초기의 HTTP 1.0 이하의 버전에서 선택해 사용했다)

 

HTTP는 지속 연결되는 프로토콜임. (persistent connection 또는 keep-alive라고 부른다)

공식적인 버전으로는 HTTP 1.1 이상의 버전에서 쓰고 있다. (오늘날 대중적으로 사용되는 HTTP 버전은 1.1, 2.0, 3.0이라, 사실상 지속 연결이 기본적으로 사용된다 라고 보면 된다)

 

지속 연결이랑 비연결성은 서로 대치되는 개념인데, 초기에 왜 비지속 연결(=비연결성)을 채택해서 사용하게 됐고, 어쩌다 대안으로 persistent connection이 나오게 됐는지 차근차근 알아보자.

 

4-1. 연결성 (Connection Oriented) vs 비연결성 (Connectionless)

왜 초창기에 비연결성을 채택하게 됐을까? 

 

👉 연결 지향 – 연결을 유지하는 모델

  • TCP/IP의 경우 기본적으로 연결을 유지함
  • 연결을 유지하는 모델에서는 클라이언트가 요청을 보내지 않더라도 계속 연결을 유지해야 됨
  • 이러한 경우 연결을 유지하는 서버의 자원이 계속 소모됨 !!

👉 비연결성 – 연결을 유지하지 않는 모델

  • 비 연결성을 가지는 HTTP에서는 실제로 요청을 주고 받을 때만 연결을 유지하고 응답을 주고나면 TCP/IP 연결을 끊음
  • 이를 통해 최소한의 자원으로 서버 유지를 가능하게 함

이러한 이유로 비연결성을 채택했으나, 비연결성 또한 단점이 있었다.

 

4-2. 비연결성 vs 지속 연결

👉 비연결성(Connectionless) (= 비지속 연결)

  • 위에서 설명한 것 처럼, TCP 연결 수립한 후 요청에 대한 응답을 받으면 연결을 종료시킴
  • 추가적인 요청-응답을 하기 위해서는 다시 TCP 연결 수립부터 반복해야 함
    • 이럴때마다 3-way handshake 시간이 추가됨

자원들을 각각 보낼때마다 연결을 끊고 다시 재연결하고를 반복하는 것은 매우 비효율적일 것이다. 🚨

이런 비연결성의 단점을 극복하기 위해서 HTTP 지속 연결이 나왔다.

 

비지속 연결(비연결성)과 지속 연결의 비교

 

👉 지속 연결 (persistent connection 혹은 keep-alive)

  • 하나의 TCP 연결상에서 여러 개의 요청-응답을 주고받을 수 있게 하는 기술
  • 불필요한 연결 수립과 종료에 드는 시간을 상당부분 절약할 수 있게 되었음!
  • HTTP/2, HTTP/3에서 더 많은 최적화가 되었다고 함

 

정리

 

이번 기회로 HTTP 특징들에 대해서 제대로 정리하면서 완벽히 숙지하게 되었다. 이 포스팅을 보시는 분들에게도 도움이 됐으면!

  1. http는 요청-응답 기반의 클라이언트-서버 프로토콜이다.
  2. 자원의 종류에 특별히 제한을 두지 않는 미디어 독립적 프로토콜이다.
  3. 상태를 유지하지 않는 Stateless한 프로토콜이다.
  4. 지속 연결을 지원하는 프로토콜이다.