테마
04. HTTP 메시지 구조
학습 목표
- HTTP 요청과 응답이 모두 메시지 형태로 오간다는 점을 이해할 수 있다.
- HTTP 메시지의 공통 구조인
시작 라인 → 헤더 → 공백 라인 → 바디를 설명할 수 있다. - 요청 메시지의
request line과 응답 메시지의status line차이를 구분할 수 있다. - 헤더가 바디를 제외한 메타데이터를 담는다는 점을 이해할 수 있다.
- 바디에 들어가는 것은 리소스의 실제 저장 형태가 아니라, 클라이언트와 서버가 주고받는 표현(representation) 이라는 점을 설명할 수 있다.
전체 구조
1. HTTP는 왜 메시지 구조를 알아야 할까?
지금까지는 브라우저가 URL을 해석하고 서버와 연결한 뒤 요청과 응답을 주고받는 큰 흐름을 봤다.
그런데 실제로 클라이언트와 서버가 서로 이해하는 단위는 결국 HTTP 메시지다.
브라우저가 보내는 것도 메시지다.
- 어떤 메서드로 요청하는지
- 어떤 대상을 요청하는지
- 어떤 형식의 데이터를 보내는지
서버가 돌려주는 것도 메시지다.
- 성공인지 실패인지
- 어떤 형식의 데이터인지
- 실제 본문 데이터가 무엇인지
즉, HTTP를 제대로 이해한다는 것은 결국 HTTP 메시지를 읽을 수 있게 되는 것과 거의 같다.
핵심 직관: HTTP는 “메시지를 주고받는 규칙”이다. 요청도 메시지이고, 응답도 메시지다.
2. HTTP 메시지의 공통 골격
HTTP 메시지는 요청과 응답 모두 기본적으로 같은 뼈대를 가진다.
- 시작 라인(Start Line)
- 헤더(Header)
- 공백 라인
- 메시지 바디(Message Body)
가장 단순한 형태로 보면
text
<start-line>
<header-field>: <value>
<header-field>: <value>
<message-body>여기서 중요한 점은 두 가지다.
- 공백 라인은 헤더와 바디를 구분하는 경계다
- 바디는 있을 수도 있고 없을 수도 있다
예를 들어 단순한 GET 요청은 바디가 없는 경우가 많다.
반면 POST 요청이나 JSON 응답은 바디가 있는 경우가 흔하다.
3. 시작 라인: 요청과 응답의 첫 문장
시작 라인은 메시지의 첫 줄이다.
그리고 이 첫 줄이 요청인지 응답인지에 따라 의미가 달라진다.
요청 메시지의 시작 라인: request line
요청 메시지의 시작 라인은 보통 다음 세 요소로 구성된다.
- HTTP 메서드
- request-target
- 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
응답 메시지의 시작 라인은 보통 다음 세 요소로 구성된다.
- HTTP 버전
- 상태 코드
- 이유 문구(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, 이미지 등)가 담긴다.
확인 질문
- HTTP 요청 메시지와 응답 메시지가 공유하는 공통 구조는 무엇인가?
request line과status line은 각각 어떤 정보를 담는가?- 헤더와 바디의 역할 차이를 한 문장으로 설명하면 어떻게 표현할 수 있을까?
- 공백 라인이 왜 꼭 필요할까?
- “회원 100번 리소스가 JSON으로 표현된다”는 말은 무엇을 뜻할까?