Dev/etc.

HTTP란?

takeU 2022. 11. 28. 13:46
반응형

HTTP란?

  • HyperText Transfer Protocol
  • 하이퍼미디어 문서를 전송하기 위한 애플리케이션 레이어 프로토콜
  • 이론 상 신뢰 가능한 전송 프로토콜이면 무엇이든 사용 가능하나 TCP 혹은 TLS (암호화된 TCP), UDP(HTTP/3)를 통해 전송
  • request - response 의 구조
  • 클라이언트-서버 모델을 따름
  • 무상태(Stateless) 프로토콜
    • 서버가 클라이언트의 동작이나 상태를 저장하지 않는 형태
    • 즉, 서버와 클라이언트가 독립
    • 쿠키를 통해 세션을 만들어 헤더에 심는 확장이 가능함

HTTP 기반 시스템의 구성 요소

  1. 클라이언트
  • 요청을 보내는 개체
  • 요청 - 응답 - 리소스 혼합 - 페이지 갱신
  1. 서버
  • 요청에 대한 문서를 제공하는 개체
  • 논리적으로 단일 머신이지만, 여러 개의 서버를 동일한 머신에 호스팅 해 사용할 수 있으며, Host 헤더를 통해 동일한 IP 주소를 공유할 수 있음
  1. 프록시
  • 여러 계층의 웹 스택 구조에서 애플리케이션 계층에서 동작하는 것
  • 캐싱, 필터링, 로드 밸런싱, 인증, 로깅 등의 기능을 수행

HTTP의 흐름

  1. TCP 연결
  2. HTTP 메시지 전송
  3. 서버에 의해 응답 읽음
  4. TCP 연결을 끊거나 재사용

HTTP 메시지

요청 (request)

  1. HTTP 메소드 - GET, POST 같은 동사나 OPTIONS나 HEAD와 같은 명사
  2. 리소스의 경로 - 프로토콜(http), 도메인(url), 포트(80, 443,..)
  3. HTTP 프로토콜 버전
  4. 선택적 헤더
  5. body

응답 (response)

  1. HTTP 프로토콜 버전
  2. HTTP 상태 코드 + 메시지
  3. 헤더
  4. 선택적 본문

버전

HTTP/0.9

  • HTTP 초기 버전
  • HTTP/0.9는 이후에 차후 버전과 구별하기 위해 0.9로 불리게 됨
  • 요청은 단일 라인으로 구성
  • 메소드 - GET
<!--req-->
GET /mypage.html

<!--res-->
<HTML>
    A very simple HTML page
</HTML>

HTTP/1.0

  • 매 요청이 끝나면 TCP 연결을 끊기 때문에 새로운 요청이 생길 때 마다 TCP 3-way Handshake 발생
  • 버전 정보가 요청 사이에 전송
  • 요청에 대한 성공 여부를 알 수 있게되어, 결과에 대한 처리가 가능 (로컬 캐시 갱신, 사용 등)
    <!--req-->
    GET /mypage.html HTTP/1.0
    User-Agent: NCSA_Mosaic/2.0 (Windows 3.1)
    <!--res-->
    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.0에서 모호함을 명확하게 하고 개선 사항을 도입

  • TCP 커넥션의 재사용
  • 파이프라이닝 추가 - 요청의 응답이 오기 전에 다음 요청을 전송할 수 있게 해, 커뮤니케이션 레이턴시를 낮춤
  • 청크된 응답 지원 - 분할을 통한 효율 증가
  • 캐시 제어 메커니즘 추가
  • 언어, 인코딩, 타입을 포함한 컨텐츠 협상이 도입도어, 클라이언트 서버 간 적합한 컨텐츠에 대한 동의가 가능
  • 서버 코로케이션 - Host 헤더로 동일 IP에 다른 도메인을 호스트하는 기능 추가
  • 확장성 덕분에 1997년부터 지금까지 추가 버전이 공개되었음에도, 안정적으로 사용되고 있음
<!--req-->
GET /en-US/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/en-US/docs/Glossary/Simple_header
<!--res-->
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

HTTP/2

  • 더 많은 데이터들이 더 많은 요청에 의해 사용되는 시대가 되면서, 기존의 HTTP/1.1 버전으로는 한계가 생김
  • 멀티플렉싱 - 병렬 요청이 동일한 커넥션에서 이루어지는 다중화 프로토콜 / 순서를 제거
  • 중복된 데이터로 인한 오버헤드를 제거하면서 헤더를 압축
  • 서버 푸쉬를 통해 클라이언트 캐시로 데이터를 채워 넣음(JS, CSS, font 등)
  • 주요 웹 사이트는 대부분 적용되어 있음
  • TLS 없이는 HTTP/2를 지원하지 않음

HTTP/3

  • 구글이 개발한 UDP 기반 프로토콜인 QUIC 사용
  • 기존의 TCP 핸드쉐이크를 최적화해 빠르게 전송

출처: MDN