이전 게시글에서 HTTP에 대한 전반적인 내용을 살펴보았고 이번 게시글에서는 HTTP를 버전별로 알아보는 시간을 가지려고합니다. 사실 필자도 HTTP 버전을 생각하면서 프로그램을 개발하려고 한 경험이 전무하기 때문에 이번 게시글을 계기로 지금까지 만들었던 프로그램들을 살펴보려고 합니다.
사실 HTTP는 지속적으로 발전하고 있고 대중적으로는 지금 HTTP 1.1과 HTTP 2.0이 많이 쓰이고 있지만 시작은 1996년 HTTP 1.0부터 시작했기에 그 때 그 시절부터 하나 하나씩 짚어나가려고 합니다.
HTTP 1.0 버전은 기본적으로 한 연결당 하나의 요청을 처리하도록 설계되었습니다.
간결성 : HTTP 1.0 도입 당시 적용하기 쉬고 직관적인 프로토콜이었다.
Stateless : 기존 게시글에서 언급하였듯이, HTTP의 각 요청들은 독립적으로 간주된다.
캐싱 : 자주 접근 되는 데이터를 로컬에 저장하는 것으로 웹 페이지에서 데이터가 읽히는 시간을 최소화하는 캐싱의 개념이 등장하였다.
접근 제어 : 유저의 인증을 기반으로 접근을 제어할 수 있는 기능을 지원하기 시작하였다.
프록시 : 중간 서버의 역할을 하는 프록시 서버를 지원하기 시작하며 요청과 응답을 제어하기 용이해졌다.
MIME 지원 : HTTP 1.0은 MIME을 지원하기 시작하며서 서버가 전송되는 데이터의 타입을 구분지을 수 있게 해주었다.
=> 여기서 MIME이란 (Multipurpose Internet Mail Extensions)으로 직역하자면 다목적 인터넷 메일 확장자인데 메일에서 단순한 글자로 인식되는 아스키 코드 뿐만 아니라, 이미지, 비디오와 같은 파일들을 지원할 수 있는 기능이다.
RTT의 증가 : HTTP 1.0는 서버로부터 파일을 가져올 때마다 TCP의 3-웨이 핸드셰이크를 계속 열어야 하기 때문에 RTT가 증가한다는 단점을 가지고 있습니다.
=> RTT란 패킷이 목적지에 도달하고 나서 다시 출발지로 돌아오기까지 걸리는 시간이며 패킷 왕복 시간을 뜻한다.
요청 파이프라인 기능 부족 : HTTP 1.0의 경우 요청 파이프라인이 없기 때문에 클라이언트에서는 하나의 요청이 끝나기 전까지 기다려야 되는 번거로움이 있었습니다.
한정된 전달 용량 : 상당한 양의 인코딩 데이터 전송이 어렵기 때문에 큰 파일들을 다루기가 어렵다.
캐싱 : 캐싱을 지원하기 시작했다고는 하지만 최근 버전에 비해서는 많이 부족하다.
호스트 헤더 : HTTP 1.0은 요청에 호스트 헤더를 포함하지 않기 때문에 단일 서버에서 여러개의 도메인을 호스트하는게 쉽지 않다.
위에 1번에서 언급한 RTT 증가 문제를 해결하기 위해서 당시 특정 방식을 착안했었는데 그것은 다음과 같다.
많은 이미지를 다운로드 받게 되면 과부하가 걸리기 때문에 하나의 합쳐져있는 이미지를 다운 받고 이를 기반으로 "background-image"의 "position"을 활용하여 이미지를 표기해주었다.
코드를 압축해서 개행 문자, 빈칸을 업애서 코드의 크기를 최소화하는 방법
이미지 파일을 64 진법으로 이루어진 문자열로 인코딩하는 방법
=> 이 방식을 사용하면 서버와의 연결을 열고 이미지에 대해 서버에 HTTP 요청을 할 필요가 없다는 장점이 생기지만 반대로 용량이 37% 더 커진다는 단점이 있다.
2020년 기준 출시되어 있는 버전 중 3분의 1을 차지하고 있는 HTTP 버전이며 1.0 버전이 출시된 후 6년이 지난 시점에 출시되었다. 기존 1.0과는 달리 매번 TCP 연결을 하는 것이 아니라 한 번 TCP를 초기화 한 이후에 keep-alive라는 옵션으로 여러 개의 파일을 송수신할 수 있게 업데이트 되었다.
=> 참고로 "keep-alive" 옵션은 기존 HTTP 1.0 방식에도 존재하였지만 표준화가 되어 있지는 않았다.
지속적인 연결성 : 위 1.1 설명에서도 언급하엿듯이 "keep-alive"가 표준화되면서 single connection 내에서도 한 개 이상의 요청과 응답을 수용할 수 있다.
인코딩 적용 : 인코딩이 본격적으로 적용되는 시점이며 상당한 양의 데이터를 좀 더 수월하게 관리 할 수 있게 되었다.
호스트 헤더 필드 : 호스트 헤더가 지원되면서 하나의 웹 서버가 여러개의 웹사이트의 요청을 받을 수 있도록 가능케 하였다.
캐시 제어 : 캐싱 능력이 HTTP 1.0에 비해 향상 되었다.
그 밖에도 요청 범위, 뚜렷한 에러 핸들링과 같은 여러 요소들이 업데읻트 되었지만 여기에 기술하기엔 너무 많다보니 중요한 4가지만 언급하도록 하겠다.
HOL Blocking : 일명 Head Of Line Blocking으로 네트워크에서 같은 큐에 있는 패킷이 그 첫번째 패킷에 의해 지연될 때 발생하는 성능 저하 현상을 뜻한다. 쉽게 말하자면 하나의 TCP 연결에서 다중 요청을 받았을 경우, 직렬적으로 진행되기 때문에 하나가 막히면 다른 것들도 자연스럽게 막힌다는 것이다.
제한된 블록 처리 : HTTP 1.1이 기존에 비해 다중 요청을 받을 수 있다지만 클라이언트에서 서버로 보내는 동시 요청 수에는 제한이 있다.
취약한 보안 : HTTP 1.1은 적절한 보안성을 갖추고 있지 않기 때문에 문제가 발생할 수 있다.
무거운 헤더 구조 : HTTP 1.1의 헤더에는 쿠키 등 많은 메타 데이터가 들어있고 압축이 되지 않아 무겁다는 단점이 있다.
HTTP 1.1에서 발생한 문제는 HTTP 2.0에서 커버가 가능하고 어느정도의 양이 되기 떄문에 다음 게시글에서 더욱 상세하게 알아보겠다. 다음 게시글에서는 HTTP 2와 HTTP 3 그리고 HTTPS에 대해서 알아보도록 하겠습니다.