Skip to content
HTTP 기초제 4장

HTTP 메시지는 어떤 구조로 요청과 응답을 표현할까?

04. HTTP 메시지 구조


학습 목표

  1. HTTP 요청과 응답이 모두 메시지 형태로 오간다는 점을 이해할 수 있다.
  2. HTTP 메시지의 공통 구조인 시작 라인 → 헤더 → 공백 라인 → 바디를 설명할 수 있다.
  3. 요청 메시지의 request line과 응답 메시지의 status line 차이를 구분할 수 있다.
  4. 헤더가 바디를 제외한 메타데이터를 담는다는 점을 이해할 수 있다.
  5. 바디에 들어가는 것은 리소스의 실제 저장 형태가 아니라, 클라이언트와 서버가 주고받는 표현(representation) 이라는 점을 설명할 수 있다.

전체 구조


1. HTTP는 왜 메시지 구조를 알아야 할까?

지금까지는 브라우저가 URL을 해석하고 서버와 연결한 뒤 요청과 응답을 주고받는 큰 흐름을 봤다.
그런데 실제로 클라이언트와 서버가 서로 이해하는 단위는 결국 HTTP 메시지다.

브라우저가 보내는 것도 메시지다.

  • 어떤 메서드로 요청하는지
  • 어떤 대상을 요청하는지
  • 어떤 형식의 데이터를 보내는지

서버가 돌려주는 것도 메시지다.

  • 성공인지 실패인지
  • 어떤 형식의 데이터인지
  • 실제 본문 데이터가 무엇인지

즉, HTTP를 제대로 이해한다는 것은 결국 HTTP 메시지를 읽을 수 있게 되는 것과 거의 같다.

핵심 직관: HTTP는 “메시지를 주고받는 규칙”이다. 요청도 메시지이고, 응답도 메시지다.


2. HTTP 메시지의 공통 골격

HTTP 메시지는 요청과 응답 모두 기본적으로 같은 뼈대를 가진다.

  1. 시작 라인(Start Line)
  2. 헤더(Header)
  3. 공백 라인
  4. 메시지 바디(Message Body)

가장 단순한 형태로 보면

text
<start-line>
<header-field>: <value>
<header-field>: <value>

<message-body>

여기서 중요한 점은 두 가지다.

  • 공백 라인은 헤더와 바디를 구분하는 경계다
  • 바디는 있을 수도 있고 없을 수도 있다

예를 들어 단순한 GET 요청은 바디가 없는 경우가 많다.
반면 POST 요청이나 JSON 응답은 바디가 있는 경우가 흔하다.


3. 시작 라인: 요청과 응답의 첫 문장

시작 라인은 메시지의 첫 줄이다.
그리고 이 첫 줄이 요청인지 응답인지에 따라 의미가 달라진다.

요청 메시지의 시작 라인: request line

요청 메시지의 시작 라인은 보통 다음 세 요소로 구성된다.

  1. HTTP 메서드
  2. request-target
  3. HTTP 버전
text
GET /search?q=http HTTP/1.1

각 요소의 의미

요소예시의미
메서드GET무엇을 기대하는 요청인지
request-target/search?q=http어떤 대상을 요청하는지
버전HTTP/1.1어떤 HTTP 규칙 버전으로 통신하는지

여기서 request-target은 실무에서 보통 path + query 조합이라고 이해하면 된다.

응답 메시지의 시작 라인: status line

응답 메시지의 시작 라인은 보통 다음 세 요소로 구성된다.

  1. HTTP 버전
  2. 상태 코드
  3. 이유 문구(reason phrase)
text
HTTP/1.1 200 OK

각 요소의 의미

요소예시의미
버전HTTP/1.1응답이 따르는 HTTP 규칙
상태 코드200요청 처리 결과
이유 문구OK사람이 보기 쉽게 붙인 짧은 설명

여기서는 상태 코드의 종류를 깊게 다루지 않는다.
지금 단계에서는 “응답 시작 라인에는 결과 요약이 들어간다” 정도로 잡으면 충분하다.


4. 헤더: 바디를 제외한 중요한 부가 정보

헤더는 메시지 바디 자체를 제외한, 전송에 필요한 부가 정보를 담는 영역이다.

예를 들어 이런 정보들이 들어갈 수 있다.

  • 어느 호스트로 요청하는지
  • 바디 데이터 형식이 무엇인지
  • 바디 길이가 얼마인지
  • 압축되었는지
  • 인증과 관련된 정보
  • 캐시와 관련된 정보

헤더 한 줄의 기본 형태

text
field-name: value

예:

http
Host: www.example.com
Content-Type: application/json
Content-Length: 34

기억할 점

  • 헤더 이름과 :은 붙어 있어야 한다
  • 헤더 이름은 대소문자를 구분하지 않는다
  • 값은 헤더 종류에 따라 의미가 달라진다

헤더는 종류가 매우 많다.
그래서 이번 장에서는 “헤더는 메타데이터 영역이다”까지만 잡고, 구체적인 헤더 묶음은 다음 장에서 따로 정리한다.


5. 공백 라인: 사소해 보여도 필수인 경계선

헤더 다음에는 공백 라인이 하나 들어간다.
이 줄이 바로 “헤더는 여기까지고, 그다음부터 바디다”라는 경계 역할을 한다.

겉보기에는 단순하지만, 이 구분이 없으면 수신 측은 어디까지가 헤더이고 어디부터가 실제 데이터인지 해석하기 어렵다.

한 줄 정리: 공백 라인은 “헤더 종료”를 알리는 구분선이다.


6. 메시지 바디: 실제 전송 데이터

메시지 바디에는 실제로 주고받을 데이터가 들어간다.

  • HTML 문서
  • JSON
  • 이미지 바이트
  • 파일
  • 동영상 데이터

즉, 바이트로 표현할 수 있는 모든 데이터가 바디에 들어갈 수 있다.

바디가 없는 경우

예를 들어 단순 GET 요청은 바디 없이 이런 형태일 수 있다.

http
GET /members/100 HTTP/1.1
Host: api.example.com

헤더 뒤에 공백 라인만 있고 끝난다.

바디가 있는 경우

예를 들어 JSON을 전송하는 요청은 이렇게 될 수 있다.

http
POST /members HTTP/1.1
Host: api.example.com
Content-Type: application/json
Content-Length: 27

{"name":"lee","age":20}

응답도 마찬가지다.

http
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 34

{"id":100,"name":"lee","age":20}

7. 바디에 담기는 것은 리소스의 표현이다

여기서 중요한 개념이 하나 더 있다.
HTTP 바디에 담기는 것은 흔히 “리소스 그 자체”라고 생각하기 쉽지만, 더 정확히는 리소스의 표현(representation) 이다.

예를 들어 “회원 100번”이라는 리소스가 있다고 해 보자.
이 리소스는 같은 대상이지만, 전달 방식은 여러 가지가 될 수 있다.

즉, 같은 리소스라도 상황에 따라 이렇게 달라질 수 있다.

  • 브라우저에게는 HTML로 보여줄 수 있다
  • 앱이나 프론트엔드 코드에는 JSON으로 줄 수 있다
  • 다른 시스템에는 XML로 줄 수도 있다

표현을 설명해 주는 헤더

이 표현이 무엇인지 알려주기 위해 헤더가 함께 붙는다.

헤더의미
Content-Type바디 데이터 형식이 무엇인지
Content-Encoding압축되었는지
Content-Language자연 언어가 무엇인지
Content-Length바디 길이가 얼마인지

예:

http
Content-Type: text/html; charset=UTF-8
Content-Type: application/json
Content-Type: image/png

핵심 직관: 서버는 리소스를 직접 꺼내 보내는 것이 아니라, 클라이언트가 이해할 수 있는 형태로 표현해서 보낸다.


8. 요청과 응답을 한 번에 보면

브라우저와 서버가 메시지를 주고받는 흐름을 메시지 관점에서 다시 보면 이렇다.

이때 브라우저나 서버가 실제로 하는 일은 결국 같다.

  • 시작 라인 해석
  • 헤더 읽기
  • 바디 읽기
  • 바디 형식을 헤더로 확인하기

그래서 HTTP 메시지 구조를 이해하면, 이후에 배울 메서드, 상태 코드, 헤더도 훨씬 쉽게 연결된다.


핵심 암기 포인트

HTTP 메시지 공통 구조: 시작 라인 → 헤더 → 공백 라인 → 바디.

request line: 메서드 + 요청 대상 + HTTP 버전.

status line: HTTP 버전 + 상태 코드 + 이유 문구.

헤더: 바디를 제외한 부가 정보와 메타데이터를 담는다.

공백 라인: 헤더와 바디를 나누는 경계다.

바디: 실제 전송 데이터가 들어간다.

표현(representation): 바디에는 리소스의 전달 가능한 형태(HTML, JSON, 이미지 등)가 담긴다.

확인 질문

  1. HTTP 요청 메시지와 응답 메시지가 공유하는 공통 구조는 무엇인가?
  2. request linestatus line은 각각 어떤 정보를 담는가?
  3. 헤더와 바디의 역할 차이를 한 문장으로 설명하면 어떻게 표현할 수 있을까?
  4. 공백 라인이 왜 꼭 필요할까?
  5. “회원 100번 리소스가 JSON으로 표현된다”는 말은 무엇을 뜻할까?