[Network] HTTP (2) - HTTP 1.0/1.1

먹보·2023년 3월 16일
0

MUK_BO's Network

목록 보기
6/8

이전 게시글에서 HTTP에 대한 전반적인 내용을 살펴보았고 이번 게시글에서는 HTTP를 버전별로 알아보는 시간을 가지려고합니다. 사실 필자도 HTTP 버전을 생각하면서 프로그램을 개발하려고 한 경험이 전무하기 때문에 이번 게시글을 계기로 지금까지 만들었던 프로그램들을 살펴보려고 합니다.

사실 HTTP는 지속적으로 발전하고 있고 대중적으로는 지금 HTTP 1.1과 HTTP 2.0이 많이 쓰이고 있지만 시작은 1996년 HTTP 1.0부터 시작했기에 그 때 그 시절부터 하나 하나씩 짚어나가려고 합니다.

✍ HTTP 1.0

HTTP 1.0 버전은 기본적으로 한 연결당 하나의 요청을 처리하도록 설계되었습니다.

📝 HTTP 1.0의 특징

  1. 간결성 : HTTP 1.0 도입 당시 적용하기 쉬고 직관적인 프로토콜이었다.

  2. Stateless : 기존 게시글에서 언급하였듯이, HTTP의 각 요청들은 독립적으로 간주된다.

  3. 캐싱 : 자주 접근 되는 데이터를 로컬에 저장하는 것으로 웹 페이지에서 데이터가 읽히는 시간을 최소화하는 캐싱의 개념이 등장하였다.

  4. 접근 제어 : 유저의 인증을 기반으로 접근을 제어할 수 있는 기능을 지원하기 시작하였다.

  5. 프록시 : 중간 서버의 역할을 하는 프록시 서버를 지원하기 시작하며 요청과 응답을 제어하기 용이해졌다.

  6. MIME 지원 : HTTP 1.0은 MIME을 지원하기 시작하며서 서버가 전송되는 데이터의 타입을 구분지을 수 있게 해주었다.
    => 여기서 MIME이란 (Multipurpose Internet Mail Extensions)으로 직역하자면 다목적 인터넷 메일 확장자인데 메일에서 단순한 글자로 인식되는 아스키 코드 뿐만 아니라, 이미지, 비디오와 같은 파일들을 지원할 수 있는 기능이다.

📝 HTTP 1.0의 부족한 점

  1. RTT의 증가 : HTTP 1.0는 서버로부터 파일을 가져올 때마다 TCP의 3-웨이 핸드셰이크를 계속 열어야 하기 때문에 RTT가 증가한다는 단점을 가지고 있습니다.
    => RTT란 패킷이 목적지에 도달하고 나서 다시 출발지로 돌아오기까지 걸리는 시간이며 패킷 왕복 시간을 뜻한다.

  2. 요청 파이프라인 기능 부족 : HTTP 1.0의 경우 요청 파이프라인이 없기 때문에 클라이언트에서는 하나의 요청이 끝나기 전까지 기다려야 되는 번거로움이 있었습니다.

  3. 한정된 전달 용량 : 상당한 양의 인코딩 데이터 전송이 어렵기 때문에 큰 파일들을 다루기가 어렵다.

  4. 캐싱 : 캐싱을 지원하기 시작했다고는 하지만 최근 버전에 비해서는 많이 부족하다.

  5. 호스트 헤더 : HTTP 1.0은 요청에 호스트 헤더를 포함하지 않기 때문에 단일 서버에서 여러개의 도메인을 호스트하는게 쉽지 않다.

📝 부족한 점의 극복 방식

위에 1번에서 언급한 RTT 증가 문제를 해결하기 위해서 당시 특정 방식을 착안했었는데 그것은 다음과 같다.

✏️ 이미지 스플리팅

많은 이미지를 다운로드 받게 되면 과부하가 걸리기 때문에 하나의 합쳐져있는 이미지를 다운 받고 이를 기반으로 "background-image"의 "position"을 활용하여 이미지를 표기해주었다.

✏️ 코드 압축

코드를 압축해서 개행 문자, 빈칸을 업애서 코드의 크기를 최소화하는 방법

✏️ 이미지 Base64 인코딩

이미지 파일을 64 진법으로 이루어진 문자열로 인코딩하는 방법

=> 이 방식을 사용하면 서버와의 연결을 열고 이미지에 대해 서버에 HTTP 요청을 할 필요가 없다는 장점이 생기지만 반대로 용량이 37% 더 커진다는 단점이 있다.

✍ HTTP 1.1

2020년 기준 출시되어 있는 버전 중 3분의 1을 차지하고 있는 HTTP 버전이며 1.0 버전이 출시된 후 6년이 지난 시점에 출시되었다. 기존 1.0과는 달리 매번 TCP 연결을 하는 것이 아니라 한 번 TCP를 초기화 한 이후에 keep-alive라는 옵션으로 여러 개의 파일을 송수신할 수 있게 업데이트 되었다.

=> 참고로 "keep-alive" 옵션은 기존 HTTP 1.0 방식에도 존재하였지만 표준화가 되어 있지는 않았다.

📝 HTTP 1.1 업데이트

  1. 지속적인 연결성 : 위 1.1 설명에서도 언급하엿듯이 "keep-alive"가 표준화되면서 single connection 내에서도 한 개 이상의 요청과 응답을 수용할 수 있다.

  2. 인코딩 적용 : 인코딩이 본격적으로 적용되는 시점이며 상당한 양의 데이터를 좀 더 수월하게 관리 할 수 있게 되었다.

  3. 호스트 헤더 필드 : 호스트 헤더가 지원되면서 하나의 웹 서버가 여러개의 웹사이트의 요청을 받을 수 있도록 가능케 하였다.

  4. 캐시 제어 : 캐싱 능력이 HTTP 1.0에 비해 향상 되었다.

그 밖에도 요청 범위, 뚜렷한 에러 핸들링과 같은 여러 요소들이 업데읻트 되었지만 여기에 기술하기엔 너무 많다보니 중요한 4가지만 언급하도록 하겠다.

📝 HTTP 1.1 문제

  1. HOL Blocking : 일명 Head Of Line Blocking으로 네트워크에서 같은 큐에 있는 패킷이 그 첫번째 패킷에 의해 지연될 때 발생하는 성능 저하 현상을 뜻한다. 쉽게 말하자면 하나의 TCP 연결에서 다중 요청을 받았을 경우, 직렬적으로 진행되기 때문에 하나가 막히면 다른 것들도 자연스럽게 막힌다는 것이다.

  2. 제한된 블록 처리 : HTTP 1.1이 기존에 비해 다중 요청을 받을 수 있다지만 클라이언트에서 서버로 보내는 동시 요청 수에는 제한이 있다.

  3. 취약한 보안 : HTTP 1.1은 적절한 보안성을 갖추고 있지 않기 때문에 문제가 발생할 수 있다.

  4. 무거운 헤더 구조 : HTTP 1.1의 헤더에는 쿠키 등 많은 메타 데이터가 들어있고 압축이 되지 않아 무겁다는 단점이 있다.

HTTP 1.1에서 발생한 문제는 HTTP 2.0에서 커버가 가능하고 어느정도의 양이 되기 떄문에 다음 게시글에서 더욱 상세하게 알아보겠다. 다음 게시글에서는 HTTP 2와 HTTP 3 그리고 HTTPS에 대해서 알아보도록 하겠습니다.

profile
🍖먹은 만큼 성장하는 개발자👩‍💻

0개의 댓글