HTTP(HyperText Transfer Protocol) Version

Casper·2023년 8월 14일
0
post-thumbnail

HTTP?

월드 와이드 웹(WWW)에서 정보를 주고받기 위해 사용되는 프로토콜 중 하나로,
클라이언트와 서버 간의 데이터 통신을 위한 규칙과 프로토콜을 정의합니다.
HTTP는 본래의 단순함의 대부분을 지키면서 확장성 위에서 많은 수정을 거쳐왔으며
이러한 변화 과정을 알아보고자 합니다.

HTTP/0.9 (원-라인 프로토콜)

HTTP 초기 버전으로서, 초기에는 버전 번호가 없었지만 이후에 다른 버전과 구별하기 위해 0.9로 불리게 됐습니다.
구조는 극히 단순합니다.
단일 라인으로 구성되며 프로토콜, 서버, 포트는 서버가 연결되고 나면 불필요하기에 리소스에 대한 경로 및 가능한 메서드는 'GET'이 유일했습니다.

GET /mypage.html

응답 또한 파일 내용 자체만으로 구성되어 극도로 단순합니다.

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

해당 버전은 HTML 파일만 전송될 수 있었기에 헤더가 존재하지 않았으며
문제가 발생한 경우, 사람이 직접 처리할 수 있도록 해당 파일 내부에 문제에 대한 설명과 함께 리턴이 되었기에
상태 혹은 오류 코드도 존재하지 않았습니다.

HTTP/1.0 (확장성 고려)

  • HTTP 버전 정보가 전송되기 시작했습니다. (HTTP/1.0)
  • 상태 코드가 응답의 시작 부분에 붙어 전송되어, 브라우저가 요청에 대해 성공 또는 실패를 알게되었고,
    해당 결과에 대한 동작을 설정할 수 있게 되었습니다.
  • HTTP 헤더의 도입으로 요청/응답에 대한 메타데이터 설정이 가능해지고 HTTP 프로토콜을 유연하고 확장 가능한 프로토콜로 만들어 주었습니다.
    또한 헤더의 도움으로 HTML문서 외의 다른 유형의 데이터를 전송할 수 있게 되었습니다.

    GET /mypage.html HTTP/1.0
    User-Agent: NCSA_Mosaic/2.0 (Windows 3.1)

    200 OK
    Date: Tue, 15 Nov 1994 08:12:31 GMT
    Server: CERN/3.0 libwww/2.17
    Content-Type: text/html
    <HTML>
    A page with an image
    <IMG SRC="/myimage.gif">
    </HTML>

HTTP/1.1 (표준 프로토콜)

HTTP의 첫 번째 표준 버전인 1.1버전은 1.0이 나온 지 몇 달 되지 않은 1997년 1월에 처음 공개되었습니다. (RFC 2068)
이전 버전에 비해 모호함을 명확하게 하고 많은 개선 사항들을 도입했습니다.

  • 커넥션을 재사용할 수 있게 함으로써 문서 내의 리소스들을 다시 접근하기 위해 사용된 커넥션을 다시 열어 시간이 절약되었습니다.
  • 파이프라이닝을 추가하여, 첫번째 요청에 대한 응답이 완전히 전송되기 이전에 두번째 요청 전송을 가능케 하여, 커뮤니케이션 레이턴시를 낮췄습니다.
  • 청크된 응답 지원.
  • 추가적인 캐시 제어 메커니즘이 도입.
  • 언어, 인코딩 혹은 타입을 포함한 컨텐츠 협상이 도입되어, 클라이언트와 서버로 하여금 교환하려는 가장 적합한 컨텐츠에 대한 동의를 가능케 했습니다.
  • Host 헤더 덕분에, 동일 IP 주소에 다른 도메인을 호스트하는 기능이 서버 코로케이션을 가능케 합니다.

    GET /ko/docs/Glossary/Simple_header HTTP/1.1
    Host: developer.mozilla.org
    User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language: en-US,en;q=0.5
    Accept-Encoding: gzip, deflate, br
    Referer: https://developer.mozilla.org/ko/docs/Glossary/Simple_header

    200 OK
    Connection: Keep-Alive
    Content-Encoding: gzip
    Content-Type: text/html; charset=utf-8
    Date: Wed, 20 Jul 2016 10:55:30 GMT
    Etag: "547fa7e369ef56031dd3bff2ace9fc0832eb251a"
    Keep-Alive: timeout=5, max=1000
    Last-Modified: Tue, 19 Jul 2016 00:59:33 GMT
    Server: Apache
    Transfer-Encoding: chunked
    Vary: Cookie, Accept-Encoding

    (content)

HTTP/2.0 (더 나은 성능을 위한 프로토콜)

몇 년에 걸쳐, 웹 페이지는 매우 복잡해지면서, 하나의 요청에 대한 스크립트의 양과 크기는 점점 더 많이 증가하고 있습니다.
HTTP/1.1 커넥션은 순차적으로 전송되는 요청을 필요로 합니다.
몇몇 병렬 커넥션이 이론적으로 사용 가능한 경우에도 여전히 많은 양의 오버헤드와 복잡도가 남아 있습니다.
이러한 상황에서 HTTP/2 프로토콜은 HTTP/1.1 버전과 다른 몇가지 근본적인 차이점은 아래와 같습니다.

  • 텍스트 프로토콜 -> 이진 프로토콜.
    이진 프로토콜이기에 더 이상 읽을 수도 없고 수작업을 만들어낼 수 없지만,
    이런 결점에 대한 보상으로, 새로운 최적화 기술이 구현될 수 있습니다.
  • 병렬 요청이 동일한 커넥션 상에서 다루어질 수 있는 다중화 프로토콜로,
    순서를 제거해주고 HTTP/1.x 프로토콜의 제약사항을 막아줍니다.
  • 전송된 데이터의 분명한 중복과 그런 데이터로부터 유발된 불필요한 오버헤드를 제거하면서,
    연속된 요청 사이의 매우 유사한 내용으로 존재하는 헤더들을 압축시킵니다.
  • 서버로 하여금 사전에 클라이언트 캐시를 서버 푸쉬라고 불리는 메커니즘에 의해 필요하게 될 데이터로 채워넣도록 허용합니다.

2015년 5월에 공식적으로 표준화된 HTTP/2는 정보 전송 시 오버헤드 감소로 많은 웹사이트들은 해당 프로토콜을 급속도로 받아들이기 시작했습니다.
이러한 변화는 어느 정도의 제한된 액터 세트만이 필요했고 이외에는 최신의 브라우저, 서버만 있으면 전환이 손쉬웠기에 가능했습니다.

HTTP/3 (HTTP over QUIC)

HTTP의 다음 메이저 버전인 HTTP/3에서는 전송 계층 부분에
'TCP/TLS' 대신 'QUIC(Quick UDP Internet Connection)'가 사용됩니다.
Firefox에서의 구현 상태는 Firefox bug 1158011을 참조해주세요.

profile
Emotional Developer

1개의 댓글

comment-user-thumbnail
2023년 8월 14일

유익한 자료 감사합니다.

답글 달기