HTTP

개요

HyperText Transfer Protocol, 줄여서 HTTP.
현재 웹 생태계에서 돌아가는 모든 응용 어플리케이션의 기본 통신 프로토콜이다.
웹의 탄생 배경에 이 프로토콜이 위치한다고 봐도 좋을 정도이다.

기본적으로는 대학 간 연구 문서를 빠르게 공유하기 위해 탄생했고, 그래서 이름이 텍스트 전송 프로토콜이다.
그 당시 HTML 파일을 네트워크를 통해 전달하기 위한 방법들이 개발되기 시작했는데, 이때 웹 브라우저로 html 파일을 전송할 수 있도록 개발된 것이 http이다.
처음에는 매우 단순한 파일만 주고받는데 그쳤는데, 점차 발전하면서 복잡한 기능을 담을 수 있게 됐다.

특징

대표적인 특징들을 정리한다.

기본적인 특징은 이렇고, HTTP는 잘 알려진 프로토콜 중 하나로서 보통 80번 포트를 이용한다.

구조

HTTP에서는 요청(Request)과 응답(Response), 두 가지 종류의 메시지가 존재한다.
말 그대로 요청은 어떤 데이터를 요구하는 트래픽이고 이에 대해서 반환하는 것이 응답 트래픽이다.

두 메시지 모두 기본 구조 자체는 이런 식으로 생겼다.
먼저 시작점(start line, 응답의 경우 status line 이라고 부른다.)에서 어떤 식으로 보내는 요청인지를 명시한다.
위의 요청은 /test.html 경로로 GET 메서드 요청을 날린다는 것을 의미한다.
이후 헤더에는 이 요청의 추가 정보들이 담겨져있다.
이후 빈칸을 한 번 둔 뒤에 요청의 핵심이 될 만한 어떤 내용을 바디로 담아서 보낸다.
응답 메시지 역시 구조는 똑같다.

재밌는 점 중 하나는 각 구분이 개행문자로 이뤄진다는 것이다.
즉 HTTP의 메시지는 전부 text 형식으로 전송된다.

요청 주소 구조

http://www.naver.com:80/posts?name=dd&content=ff

http 요청을 보낼 때 사용하는 주소는 대충 이런 식으로 생겼다.
이것은 URL이라 부르는데 자세한 건 해당 문서 참고.

메서드(method)

http에서는 이 요청이 무엇을 하려는 동작인지를 프로토콜 단에서 명시적으로 지정하는 것이 가능한데, 이것을 메서드라고 부른다.
같은 경로로 보내는 요청이라도 메서드에 따라서 서버는 다른 요청으로 인식하고 수행할 수 있다는 것이 장점이다.
가령 /test.html이란 경로에 GET으로 요청하면 html 파일을 달라는 요청이지만, POST로 요청을 날린다면 html 파일을 만들어달라는 요청으로 활용하는 것이 가능하다는 말이다.

주요 메서드 쪽은 용도가 이렇게 지정돼있지만, 실제로 구현하는 것은 서버를 만드는 사람 마음이다.
게시판 서버를 만들었다고 쳤을 때, 누군가는 get 요청에 대해 게시판 글 생성 로직을 구현할 수도 있는 것이다..
여기에 자잘한 메서드 별 특징이 있기는 하다.
가령 GET, DELETE는 기본 규약 상에서는 바디를 가지지 못한다.

응답 코드

응답이 돌아갈 때 status line에는 요청이 어떻게 수행됐는지에 대한 응답 코드가 담긴다.
100번부터 500번까지 있는데, 첫번째 자리수에 따라 가지는 의미가 조금씩 다르다.

이것들도 역시 구현하는 개발자가 입맛대로 지정할 수 있다.
근데 웬만해서 다양한 웹 프레임워크나 브라우저들은 이 의미를 명확하게 지키며 동작하는 경우가 많기 때문에, 가급적 이것들을 지켜주는 것이 좋다.
특히 100번, 300번 코드는 명확하게 지정된 대로만 사용하는 게 좋다.

HTTPS

기본 HTTP는 데이터를 평문으로 전달하기 때문에 중간자가 패킷을 탈취해서 내용을 들여다보기 쉽다.
이를 막기 위해 데이터를 암호화해서 통신하는 방식이 바로 HTTPS로, S는 그냥 Secure을 의미한다.
HTTPS 프로토콜은 암호화를 위해 TLS 프로토콜을 활용한다.
HTTPS의 과정은 TLS#Handshaking Protocol 참고.

HTTP/2

HTTP/2는 기존 HTTP의 한계를 벗어나 조금 더 성능을 향상시키기 위해 등장한 2버전이다.[1]
원래는 구글에서 SPDY라는 프로토콜을 만든 게 원조였다고 하는데, 이후에 아예 이 기술이 조금 더 표준화돼 HTTP2로 자리매김됐다.
HTTP/1를 업그레이드한 버전이, 최대한 변경점을 위주로 정리한다.[2]

전송 데이터

기존 HTTP는 데이터를 text로 전송하며, 각 구분점이 개행 문자로 이뤄진다고 했다.
하지만 바이너리로 모든 데이터를 해석하는 컴퓨터 세계에서 사실 text는 그다지 효율적인 방식이 아니다.
그래서 HTTP/2는 데이터를 바이너리 프레임으로 인코딩하여 전송한다.

멀티플렉싱(multiplexing)

여러 스트림을 뚫고 이를 통해 여러 데이터를 병렬적으로, 응답에 상관없이 주고받는 방식을 멀티플렉싱이라고 한다.
기존 HTTP는 하나의 요청을 보내고 응답이 오기전까지 다음 요청을 보낼 수 없었다.
HTTP/2에서는 하나의 TCP 커넥션에서 여러 요청을 병렬적으로 보내고 서버 역시 처리한 순서대로 응답하는 것이 가능하다.
이게 가능한 이유는 HTTP2가 전송에 필요한 개념을 더욱 세분화하여 관리하기 때문이다.

하나의 TCP 커넥션 아래에는 여러 개의 스트림이 형성될 수 있다. 이 스트림은 전부 HTTP 요청이 오고갈 수 있는 창구가 통로가 되어 개별 요청들이 병렬적으로 전달될 수 있다. 한 스트림 안에서 전달되는 라인(초록색)이 기존 HTTP와 동일한 메시지가 되는 것인데, 이 메시지는 위에서 말했듯 여러 바이너리 프레임으로 쪼개져서 보내질 수 있다. ## 헤더 압축 - 코덱 이밖에도 HTTP2는 헤더를 보낼 때 압축하여 크기를 줄인다. 기존에는 헤더에 중복값이 여러 개 있어도 이것들이 전부 전송되어버렸으나, 2버전에서는 허프만 인코딩(줄여서 HPACK) 방식[^2]을 이용한다. 원리는 문제를 이진화하는데 자주 쓰이는 기준으로 작은 이진수를 부여받을 수 있게 하는 방식이다. 이런 인코디코딩을 수행하는 과정을 코덱이라 부르는데, HTTP2의 경우 HPACK 코덱이라 할 수 있겠다.

엔보이를 보면 코덱이란 표현이 나오길래 뭔가해서 정리해봤다.

HTTP/3

관련 문서

이름 noteType created
CRUD knowledge 2024-11-26
Ingress knowledge 2025-01-06
HTTP knowledge 2025-04-16
TLS knowledge 2025-04-16
앰비언트 모드 knowledge 2025-06-02
9W - 앰비언트 모드 구조, 원리 published 2025-06-07
9W - 앰비언트 헬름 설치, 각종 리소스 실습 published 2025-06-07
E-앰비언트 모드 헬름 세팅 topic/explain 2025-06-03
E-앰비언트 ztunnel 트래픽 경로 분석 topic/explain 2025-06-07
I-다른 네임스페이스 같은 포트 리스닝 서버 구현 topic/idea 2025-06-07

참고


  1. https://inpa.tistory.com/entry/WEB-🌐-HTTP-20-통신-기술-이제는-확실히-이해하자 ↩︎

  2. https://en.wikipedia.org/wiki/HTTP/2 ↩︎