본문 바로가기

[HTTP] HTTP란?

by mugglim 2022. 7. 11.

(+07/26 내용 일부 수정)

HTTP(HyperText Transfer Protocol)

HTTP는 애플리케이션 레이어(L7)에서 데이터를 주고받기 위한 프로토콜이며, TCP 기반에서 동작한다.
(RFC 2616을 참고)

HTTP는 프로세스 간 통신(IPC)이라고도 말할 수 있다.

우리가 사용하고 있는 브라우저는 하나의 프로세스이다. 그래서 브라우저가 서버로 정적 파일(html, css, 이미지 등)을 받아 오는 과정은 프로세스 간 통신이라고 말할 수 있다. (IPC, Inter Process Communication)

브라우저가 서버로 부터 이미지를 받아오는 상황을 가정해보자. 서버는 TCP 소켓을 80번 포트(TCP 포트)에 바인딩되고 있을 것이다. 이후 브라우저의 클라이언트 TCP 소켓이 서버에게 HTTP GET 요청을 보낸다. 서버는 이미지 경로를 찾아데이터를 응답하게 된다.

HTTP의 특징

HTTP는 연결 과정에서 2가지의 특징을 가진다.

1. Stateless

HTTP는 상태를 저장하지 않는다.

예를 들어, 유저가 로그인을 한 이후 새로고침 하면 로그아웃이 된다. 하지만 새로고침 할 때 마다, 로그아웃이 되면 매우 불편할 것이다. 그래서 이를 방지하기 위해 쿠키 혹은 토큰 기반으로 상태를 유지할 수 있다.

2. Non persistent

HTTP는 TCP 연결을 유지하지 않는다.

TCP는 연결을 맺는 과정(3-way-handshake)과 유지하는 과정 모두 오버헤드이다. 초기의 HTTP는 연결을 유지하지 않았다. 한 연결에 하나의 데이터만 전송해도 충분했기 때문이다.

하지만 오늘날의 웹은 많은 많은 데이터를 주고 받는다. 만약, 연결을 유지하지 않으면 데이터를 통신할 때마다 TCP 연결을 맺어야 한다.

해결을 위해 HTTP/1 부터는 연결을 유지 할 방법을 제시하였다. 요청 헤더에 Conection: Keep-alive을 작성하면 연결을 유지하게 된다. HTTP/1.1부터는 연결 유지를 위해 별도로 헤더를 작성하지 않아도 된다. 연결을 끊고 싶다면 응답 헤더에 Connection : close를 추가해주면 된다.

HTTP의 발전 과정

HTTP의 목적은 단순함과 확장성이다. 하지만 정적 자원을 주고받았던 과거와 달리, 웹의 복잡성이 증가하여 HTTP의 버전도 발전되어 왔다. 최근에는 HTTP/3가 개발되어 UDP를 지원한다.

HTTP/1 → HTTP/1.1

  • 기본적으로 연결을 유지한다. (Conection: Keep-alive을 헤더에 작성하지 않아도 된다.)
  • 파이프 라이닝을 적용하여 이전 요청의 피드백을 기다리지 않고 데이터를 요청 할 수 있다.

HTTP/1.1 → HTTP/2

HTTP/1.1의 큰 문제점은 요청의 피드백을 기다리지 않고 여러 요청을 한 번에 보낼수는 있지만, 앞선 요청에서 지연이 발생하면 blocking 상태가 되는 것이다. HTTP/2는 데이터를 바이너리 기반인 프레임으로 나눈 후, 스트림 기반으로 병렬적으로 메시지를 주고 받아 이를 해결한다. 프레임은 응답받은 환경에서 다시 조립된다. (프레임 < 메시지 < 스트림)

특징을 정리해보자.

  • 여러 스트림을 통해 여러 메시지를 병렬적으로 통신한다.
    • 하나의 메시지는 하나 이상의 프레임으로 구성되어 있다.
    • 하나의 스트림은 하나 이상의 메시지로 구성되어 있다.
  • 서버 푸쉬 기능을 통해 클라이언트의 요청이 없더라도 자원을 응답할 수 있다.
    • 예로, HTML에서 <link rel="preload" href="style.css" as="style">을 통해 서버 푸쉬를 사용할 수 있다.
  • 서로 헤더 테이블을 가지고 있어, 헤더를 중복적으로 송신하지 않아 네트워크 비용을 줄일 수 있다.

간단히 HTTP를 정리했습니다. HTTP/3은 추가적으로 학습 후 다른 글에서 정리하겠습니다!

Ref.

댓글