HTTP 메시지 구조
HTTP(‘Hypertext Transfer Protocol’) 메시지는 서버와 클라이언트가 웹 상에서 데이터를 주고받을 때 사용되는 표준 형식입니다. 크게 시작 라인, 필드 라인, 메시지 본문으로 구성됩니다.
- 필드 라인(Header Line): 0개 이상의 HTTP 헤더가 포함될 수 있음
- 메시지 본문(Message Body): 생략될 수도 있고, 다양한 콘텐츠 타입을 담을 수 있음
- 필드 라인과 메시지 본문 사이에는 반드시 빈 줄(공백 줄) 하나가 들어갑니다.
아래 그림은 HTTP 메시지의 전반적인 구조를 보여줍니다.
(이미지 출처: 혼자 공부하는 네트워크)
1. 시작 라인 (Start Line)
시작 라인은 HTTP 요청 메시지인지 HTTP 응답 메시지인지에 따라 달라집니다.
- 요청 메시지(Request Message) → 요청 라인(Request Line)
- 응답 메시지(Response Message) → 상태 라인(Status Line)
(이미지 출처: 혼자 공부하는 네트워크)
1.1 요청 라인 (Request Line)
HTTP 요청 메시지의 시작 라인은 요청 라인(Request Line)이라고 하며, 다음과 같은 형식을 가집니다. 각 요소는 공백으로 구분됩니다.
요청 라인 = 메서드 <공백> 요청 대상 <공백> HTTP 버전 <줄바꿈>
(1) 메서드(Method)
- 클라이언트가 서버의 자원(요청 대상)에 대해 수행할 작업을 명시합니다.
- 대표적인 메서드:
GET
: 리소스 요청 (서버에서 데이터를 조회)POST
: 리소스 생성 또는 서버에 데이터를 전송PUT
: 리소스 전체 교체DELETE
: 리소스 삭제- 그 외
HEAD
,PATCH
,OPTIONS
등이 존재
(2) 요청 대상(Request Target)
- 클라이언트가 접근하고자 하는 서버 자원을 나타냅니다.
- 일반적으로 경로(path) + 쿼리 파라미터(query string) 형태를 가집니다.
- 예:
http://www.example.com/hello?q=world
→ 요청 대상은/hello?q=world
- 예:
- 최소한의 표기인
/
을 포함해야 합니다.- 예:
http://example.com
→ 요청 대상은/
- 예:
(3) HTTP 버전(HTTP-Version)
- 사용 중인 HTTP 프로토콜의 버전을 명시합니다.
- 예:
HTTP/1.1
,HTTP/2
,HTTP/3
등 (RFC 문서를 통해서도 확인 가능)
1.2 상태 라인 (Status Line)
HTTP 응답 메시지의 시작 라인은 상태 라인(Status Line)이며, 다음과 같은 형식을 가집니다. 각 요소는 공백으로 구분됩니다.
상태 라인 = HTTP 버전 <공백> 상태 코드 <공백> 이유 구문(선택적) <줄바꿈>
- HTTP 버전(HTTP-Version)
- 사용된 HTTP 프로토콜의 버전을 표기합니다.
- 상태 코드(Status Code)
- 요청이 어떻게 처리되었는지를 알려주는 세 자리 정수입니다.
- 범위에 따라 일반적인 의미가 구분됩니다.
1xx
: 정보 안내(Informational)2xx
: 성공(Success)3xx
: 리다이렉션(Redirection)4xx
: 클라이언트 측 오류(Client Error)5xx
: 서버 측 오류(Server Error)
- 이유 구문(Reason Phrase) (선택 항목)
- 상태 코드에 대한 간단한 텍스트 설명입니다.
- 예:
HTTP/1.1 200 OK
- 200은 요청이 정상 처리됨을 의미
- OK는 상태 코드에 대한 설명(Reason Phrase)
상태 라인 예시
HTTP/1.1 200 OK
- 200 코드는 요청이 성공적으로 처리되었음을 의미
HTTP/1.1 404 Not Found
- 404 코드는 요청한 자원이 존재하지 않음을 의미
2. 필드 라인 (Field Line)
필드 라인에는 0개 이상의 HTTP 헤더(HTTP Header)가 명시됩니다. 이를 헤더 라인(Header Line)이라고 부르기도 합니다.
(이미지 출처: 혼자 공부하는 네트워크)
2.1 HTTP 헤더 (HTTP Header)
- 헤더는 콜론(:)을 기준으로 헤더 이름(Header Name)과 헤더 값(Header Value) 형태로 구성됩니다.
- 헤더는 추가적인 정보(metadata)를 전달하는 중요한 역할을 합니다.
- 예: 메시지 인코딩, 캐싱 방법, 인증 정보, 콘텐츠 형식 등
(이미지 출처: 혼자 공부하는 네트워크)
(1) 예시 헤더
- Host: 서버의 호스트 이름과 포트를 나타냄 (HTTP/1.1부터 필수)
- Content-Type: 메시지 본문의 데이터 타입을 지정 (예:
text/html; charset=UTF-8
) - Content-Length: 메시지 본문의 길이를 바이트 단위로 표기
- Connection: 연결 유지 여부, 예:
keep-alive
,close
- Accept: 클라이언트가 처리할 수 있는 콘텐츠 타입 목록 (예:
text/html
,application/json
) - User-Agent: 클라이언트(브라우저, 앱 등)의 정보
- Accept-Language, Accept-Encoding, Cookie, Authorization 등 다양한 헤더가 존재
3. 메시지 본문 (Message Body)
메시지 본문은 요청 또는 응답에 담아야 할 추가 데이터가 있는 경우에 사용됩니다.
- 본문이 반드시 필요한 메서드도 있지만(
POST
,PUT
등), 일반적으로 요청 라인과 헤더만으로 처리 가능한 메서드(GET
,HEAD
)도 있습니다. - 다양하고 복합적인 콘텐츠 타입(Content-Type)을 담을 수 있습니다. 예:
application/json
,text/html
,multipart/form-data
등
아래 그림은 HTTP 메시지에서 본문이 어떻게 포함될 수 있는지를 보여줍니다.
(이미지 출처: 혼자 공부하는 네트워크)
(이미지 출처: 혼자 공부하는 네트워크)
3.1 본문 관련 추가 사항
- 전송 코딩(Transfer-Encoding): 예를 들어,
chunked
전송 방식을 사용할 경우Content-Length
없이 여러 청크(Chunk)로 나누어 전송할 수 있음. - 요청 본문 vs. 응답 본문: 요청에서는 데이터를 서버로 전송하기 위해, 응답에서는 클라이언트로 데이터를 전송하기 위해 사용됨.
4. 공백 줄(빈 줄, CRLF)
시작 라인과 필드 라인들(헤더)의 구성이 끝난 뒤에는 빈 줄 하나(CR+LF, \r\n)가 들어갑니다. 그 후에 메시지 본문이 이어집니다.
- 요청 또는 응답 메시지를 분석할 때, 이 빈 줄을 기준으로 헤더 부와 본문(body) 부를 구분할 수 있습니다.
5. 참고 문서
- 혼자 공부하는 네트워크
- RFC 7230, Section 3: Message Format
- RFC 7231, Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content
- [MDN Web Docs - HTTP Messages](
'컴퓨터 네트워크 > 응용계층' 카테고리의 다른 글
HTTP 상태 코드 (0) | 2025.01.07 |
---|---|
HTTP 메서드 (0) | 2025.01.04 |
HTTP의 특성 (1) | 2025.01.04 |
자원을 식별하는 URI (0) | 2025.01.04 |
계층적 네임 서버 (0) | 2025.01.04 |