HTTP의 역사: 0.9부터 3.0까지

2023. 9. 14. 02:51·개발이야기

안녕하세요. Mozilla에서 소개된 HTTP의 역사 관련 글을 재구성해 보았습니다.

https://developer.mozilla.org/ko/docs/Web/HTTP/Basics_of_HTTP

 

HTTP 기본 - HTTP | MDN

HTTP는 확장 가능한 프로토콜로 리소스 및 URI(Uniform Resource Identifier), 간단한 메시지 구조, 클라이언트-서버 통신 흐름과 같은 개념에 의존합니다. 이러한 기본 개념을 토대로, 새로운 HTTP 메서드나

developer.mozilla.org

 

 

출처: https://developer.mozilla.org/ko/docs/Web/HTTP/Overview

HTTP란?

OSI 7계층에서 애플리케이션 계층의 프로토콜입니다. 일반적으로는 TCP 및 TLS(HTTPS) 계층 위에서 동작합니다.

UDP 위에서 동작 가능하게 된 것은 아래 기술할 것이나, HTTP/3.0 이후의 변화입니다.

특징

- 간단합니다.

HTTP/2.0 이전까지는 인코딩이 없어 사람이 읽을 수 있습니다. 크롬 개발자 도구에서 header나 payload 등으로 디버깅을 할 수 있는 것이 이 때문입니다. 또한, 2.0까지도 프레임별로 캡슐화되어 있습니다.

- 확장 가능합니다.

HTTP 헤더들 덕에 새로운 인터페이스를 쉽게 추가할 수 있었고, HTTP/0.9에서 1.0으로의 진화는 이 헤더의 공이 아주 컸습니다.

- 상태는 없지만 세션은 있습니다.

모든 요청은 항상 독립적입니다. 심지어, 동일한 연결(TCP 혹은 UDP connection)* 내에서도 그렇습니다. 그러나, 때로는 이것이 단점으로 작용하기도 하는데, 이것을 대체하고자 하는 기술이 쿠키 혹은 세션입니다. 경우에 따라, 필요한 기술을 적용하여 사용할 수 있습니다.

HTTP 요청/응답 이전에는 항상 TCP/UDP connection이 맺어져야 합니다. 이 connection이 열려있어야 요청과 응답이 오갈수 있으며, connection이 열려있는 한, 오갈 수 있는 요청/응답의 제한은 없습니다.

HTTP에 기반한 API

- XHR

XMLHttpRequest의 약칭입니다. XML은 HTML과 같은 데이터 교환을 위해 등장한 마크업 언어입니다. XHR을 본래 XML을 위해 탄생하였으나, XML 외의 데이터들도 다룰 수 있습니다.

- Fetch API

일반적으로 XHR보다 유연한 상위호환이라고 봐도 무방합니다. 두 api의 차이점은 링크를 참고하세요
- SSE(Server-sent events)

클라이언트 쪽에서 연결을 맺고(EventSource), 이벤트 핸들러를 설정해두면, 서버에서 일방적으로 이벤트를 수신받아 처리할 수 있는 방법입니다. 웹소켓과 유사하나 차이점에 대해서는 링크 를 참고하세요.

- Websocket

일반적으로 SSE보다 유연한 형태의 API인 것으로 보입니다. 서버와 클라이언트간 connection이 맺어져 있으면, 서버, 클라이언트 할 것없이 양방향으로 요청이 가능합니다.


HTTP의 진화

HTTP/0.9

극초기의 HTTP의 형태이며, 0.9라는 이름도 1.0 등장 후에 편의상 붙인 버저닝입니다.

- GET 밖에 없음

- 1 TCP connection에 1개의 request만 날릴 수 있음

- 응답은 HTML 파일 자체로만 가능함

- request
GET /mypage.html

- response
<HTML>
A very simple HTML page
</HTML>

HTTP/1.0

- 헤더가 탄생합니다. 이로써 오늘날의 다양한 HTTP의 부가기능들이 추가 가능하게 되었습니다. 특히, Content-type 헤더를 통해 HTML 외의 파일들이 전송 가능해졌습니다.

- HTTP 버전 정보가 요청/응답에 담기게 되었습니다.

- 200 과 같은 상태 코드가 추가되었습니다.

GET /myimage.gif HTTP/1.0
User-Agent: NCSA_Mosaic/2.0 (Windows 3.1)

200 OK
Date: Tue, 15 Nov 1994 08:12:32 GMT
Server: CERN/3.0 libwww/2.17
Content-Type: text/gif
(image content)

오늘날 우리가 알고 있던 HTTP와 거의 흡사해졌습니다.

HTTP/1.1

1.0과의 가장 두드러지는 차이는, 하나의 TCP connection안에서 수차례의 요청/응답이 오갈 수 있게 되었다는 것입니다. 이와 관련한 두가지 모델이 있습니다. Persistent Connection 모델과 HTTP pipelining입니다.

Persistent Connection

단일 TCP connection 내에서, 수차례의 요청/응답을 처리하는 가장 기본적인 모델입니다.

Persistent Connection의 등장,&nbsp;https://en.wikipedia.org/wiki/HTTP_persistent_connection

 위 그림에서 open과 close는 각각 TCP connection의 열림과 닫힘을 의미합니다. Persistent Connection 모델에서는 한 번 open한 connection 위에서 여러번의 client-server간 통신이 일어납니다.

 사실 이 모델은 HTTP/1.0부터 헤더를 통해서 슬슬 쓰이기 시작하던 모델입니다. Client와 server가 Connection: keep-alive 헤더를 주고 받음으로써 TCP connection의 close는 일어나지 않고 connection이 유지됩니다. 그러다, client와 server 중 하나가 Connection: close 헤더를 담아 보내면 connection은 close 됩니다.

 HTTP/1.1에서는 헤더를 통해 connection을 조절하지 않아도, 기본적으로 client, server 모두에서 Persistent Connection을 지원하는 것으로 변경되었습니다. Connection은 브라우저에 따라 5~15초 간 유지됩니다. 불필요한 서버의 리소스를 낭비할 필요는 없기에 이 시간이 지나면 close를 하긴 해야합니다. client의 요청이 날아가는 새에 server와의 connection이 끊겼을 때는 408 상태 코드를 받아 볼 수 있습니다.
 이로써, Persistent Connection 모델은 기본적인 HTTP 통신 규약이 되어, 후에, HTTP/2.0에서는 Connection 헤더 자체를 금지하게 됩니다. 링크

 

HTTP pipelining

HTTP pipelining,&nbsp;https://en.wikipedia.org/wiki/HTTP_pipelining

 HTTP pipelining에서는 Persistent Connection 모델에서 한단계 더 나아가, client가 server의 응답을 기다리지 않고 다음 요청을 날릴 수 있습니다. 이 모델은 HTTP/1.1에서 처음 제시되었습니다. 응답을 기다릴 필요가 없으니, client은 더 많은 요청을 더 빠른 시간내에 응답받을 수 있습니다. HTTP/1.1은 지금까지도 가장 일반적으로 통용되는 HTTP 버전입니다.

 

 그러나 충분히 강력해보이는 HTTP pipelining에도 결점이 있었습니다. 서버의 응답이 FIFO(first-in-first-out, 선입선출) 방식으로 동작한다는 것이였습니다. 모든 응답은 서버에 들어온 요청 순서대로, 먼저 들어온 요청이 먼저 응답되는 것입니다. 그렇기에 먼저 들어온 요청 중 아주 처리가 오래 걸리는 요청이 있으면, 그 다음 요청들은 무한정 기다려야하는 문제가 있었습니다. 이 문제를 HOL blocking(Head Of Line blocking) 문제라 부릅니다. 이 문제를 해결하고자 HTTP/2.0이 등장합니다.


HTTP/2.0

 앞서 얘기한 HOL blocking 문제를 해결하며, 더 빠르면서도, 보안까지 챙긴 HTTP/2.0이 등장합니다. google에서 만들어진 SPDY(스피디 라고 읽습니다!) 프로토콜을 기반으로, 프레임들을 각각 바이너리화해서 더 빠르고 가벼운 형태의 프로토콜입니다. 아래의 특징들이 있으며 링크의 내용과 이미지를 재구성했습니다.

 

 1. Binary Framing

HTTP/2.0 통신의 특징

Header 파트와 Data 파트를 각각 바이너리화 합니다. 이로써 더 가볍고 빠르게, 통신이 가능합니다. 심지어 이 두 파트를 따로따로 server에 송신하더라도 서버에서 이 두 파트를 알아서 조립하여 응답합니다.

 

2. Multiplex Streaming

 하나의 TCP connection 내에서, 여러개의 stream이 생겨, 병렬적인 요청/응답이 가능합니다. 위 그림에서 client는 stream1과 3을 통해 요청을 하고, stream 5를 통해 응답받았습니다.

 

3. 요청들의 우선순위 설정 가능

HOL blocking을 해결합니다.

 

4. 헤더 압축

 여러 요청들 간에 헤더들은 중복되기 마련인데, 이 중복된 헤더들을 압축해서 재사용합니다.

 

5. server push

 본래, 완성된 페이지를 받아오기 위해 client가 server에 HTML, CSS, Javascript 파일들을 각각 요청했다면, HTTP/2.0에서는 client가 HTML을 요청한 시점에 눈치껏 CSS와 Javascript 파일도 묶어서 함께 응답합니다.

 

(6). TLS

 HTTP/2.0의 공식적인 규약은 아니나, 대부분의 메이져한 브라우저들은 HTTP/2.0은 TLS(HTTPS)위에서만 동작하도록 강제합니다. 이 또한 보안의 이점이 있습니다.

 

 HTTP/2.0을 통해 더 원활한 서버-클라이언트 통신이 가능해졌으나, 여전히 단일 스트림 내에서는 HOL blocking 문제가 동일하게 발생할 수 있습니다. 이것 조차 해결하고자 QUIC가 등장합니다.


HTTP/3.0과 QUIC

 QUIC(Quick UDP Internet Connection)는 UDP 위에서 동작하는 프로토콜로, 이 프로토콜을 통해 동작하는 HTTP를 HTTP/3.0이라 부릅니다. TCP에 비해 UDP의 장점인, 빠른 핸드쉐이크(Connection 맺음)가 장점이며, HTTP/2.0의 multiplex streaming 기능 또한 개선하여, HOL blocking 문제로부터 좀 더 쾌적합니다.

'개발이야기' 카테고리의 다른 글

Node.js에서 csv 파일 다루기 및 ios-윈도우 간 한글 깨짐 문제 해결  (1) 2024.01.06
타입스크립트: ts2322 error 해결을 위한 서브타입 관련 개념 총정리  (1) 2023.11.26
한글의 유니코드 인코딩과, javascript에서 한글 문자열을 다루는 방식  (1) 2023.10.19
데코레이터(Decorator)  (1) 2023.09.05
Artillery와 함께, 웹 부하테스트 빠르게 익히기  (0) 2023.08.12
'개발이야기' 카테고리의 다른 글
  • 타입스크립트: ts2322 error 해결을 위한 서브타입 관련 개념 총정리
  • 한글의 유니코드 인코딩과, javascript에서 한글 문자열을 다루는 방식
  • 데코레이터(Decorator)
  • Artillery와 함께, 웹 부하테스트 빠르게 익히기
준별
준별
  • 준별
    준별개발
    준별
  • 전체
    오늘
    어제
    • 분류 전체보기 (58)
      • 개발이야기 (25)
        • 토막글 (11)
      • 일상이야기 (6)
      • 개인 공부 (23)
      • 생각과 기록 (2)
  • 블로그 메뉴

    • 홈
    • 방명록
    • Github
    • Linkedin
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    zsh세팅
    http pipelining
    맥북초기세팅
    이산구조
    http2.0
    k9s
    데스크셋업
    데이터베이스
    http3.0
    정보보호개론
    맥북세팅
    nodejs
    필수툴
    Zsh
    persistent connection
    클램쉘
    http1.0
    맥북터미널세팅
    터미널세팅
    artillery
    조합형
    http1.1
    바이브코딩
    nestjs
    powerlevel10k
    맥북
    실전압축
    전산기조직
    터미널꾸미기
    zsh-autosuggestion
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
준별
HTTP의 역사: 0.9부터 3.0까지
상단으로

티스토리툴바