[네트워크] HTTP 메시지 포맷

2025. 9. 2. 00:00·CS/네트워크

오늘은 HTTP 명세서[RFC 1945, RFC 7230, RFC 7540]에 정의된 HTTP 메시지 포맷을 알아보겠습니다.

1. HTTP 요청 메시지

요청 메시지 예시를 보겠습니다.

GET /somedir/page.html HTTP/1.1\r\n
Host: www.someschool.edu\r\n
Connection: close\r\n
User-Agent: Mozilla/5.0\r\n
Accept-Language: ko-KR\r\n
\r\n

 

이 요청메시지에서 알 수 있는점은 다음과 같습니다.

  1. 메시지가 일반 아스키 코드(ASCII)로 되어있어서 사람들이 읽을 수 있다.
  2. 각 줄은 CR, LF로 구별된다
  3. 마지막줄에 CR과 LF로만 이루어져 있다.

CR(Carriage return, \r): 타자기에서 커서를 맨 앞으로 옮기는 동작

LF(Line Feed, \n): 커서를 다음줄로 내리는 동작


HTTP 요청 메시지의 첫 줄은 요청 라인(request line)이라고 합니다.

요청 라인은 방식(method) 필드, URL 필드, HTTP 버전 필드를 가집니다.

방식은 GET, POST, HEAD, PUT, DELETE를 포함하는 여러 값을 가질 수 있습니다. HTTP 메시지의 대부분은 GET 방식을 사용하며 이는 브라우저가 URL필드로 식별되는 객체를 요청할때 사용합니다. 이 예에서는 /somedir/page.html 객체를 요청하고 있습니다.


이후의 줄들은 헤더 라인(header line)이라고 부릅니다.

  • Host: www.someschool.edu
    -> 객체가 존재하는 호스트를 명시. 웹 프록시 캐시에서 필요.
  • Connection: close
    -> 서버에게 지속 연결을 사용하지 않을 것이라고 전달
  • User-Agent: Mozilla/5.0
    -> 서버에게 요청을 보내는 브라우저 타입을 명시
  • Accept-Language: ko-KR
    -> 객체의 한국어 버전을 원하고 있음을 나타냄 

 

HTTP 요청 메시지의 일반 포맷

 

위는 일반적인 포맷을 보여줍니다. sp는 space입니다.


예시와 거의 동일하지만 '개체 몸체(entity body)' 부분을 확인할 수 있습니다. 개체 몸체 부분은 GET 방식에서는 비어있고 POST 방식에서 사용됩니다. HTTP 클라이언트는 사용자가 폼을 채워 넣을 때 POST 방식을 사용합니다.


폼으로 생성한 요구가 반드시 POST 방식을 사용할 필요는 없습니다. GET 방식을 사용하는 HTML 폼은 요청된 URL의 입력데이터를 전송합니다. 만약 GET 방식을 사용하고 두 필드를 가지며 입력값이 monkeys, bananas 라면 URL은 다음과 같습니다.

$$www.somesite.com/animalsearch?monkeys&bananas$$


HEAD 방식은 GET 방식과 유사합니다. 서버가 HEAD 방식을 가진 요청을 받으면 요청 객체는 보내지 않습니다. 개발자가 디버깅을 위해 HEAD를 많이 사용합니다.


PUT 방식은 웹서버에 업로드할 객체를 필요로 하는 애플리케이션에서 많이 사용합니다.

DELETE는 웹서버에 있는 객체를 지울때 사용합니다.

 

2. HTTP 응답 메시지

응답 메시지 예시를 보갰습니다.

HTTP/1.1 200 OK\r\n
Connection: close\r\n
Date: Mon, 18 Aug 2025 06:44:04 GMT\r\n
Server: Apache/2.2.3 (CentOS)\r\n
Last-Modified: Mon, 18 Aug 2025 01:23:45 GMT\r\n
Content-Length: 6821\r\n
Content-Type: text/html\r\n
\r\n

 

이 응답 메시지는 상태 라인과 헤더 라인으로 이루어졌습니다.


상태 라인은 버전, 상태 코드, 상태 메시지를 가집니다.

예시에서는 HTTP/1.1을 사용하고 있고 응답을 제대로 반환한다고 표시합니다.


헤더 라인들을 살펴보겠습니다.

  • Connection: close
    -> 클라이언트에게 메시지를 보낸 후 TCP 연결을 닫는데 사용
  • Date: Mon, 18 Aug 2025 06:44:04 GMT 
    -> HTTP 응답이 서버에 의해 생성되고 보낸 날짜와 시간을 나타냄.
    서버가 파일 시스템으로부터 객체를 추출하고 응답 메시지에 그 객체를 삽입하여 보낸 시간
  • Server: Apache/2.2.3 (CentOS)
    -> 메시지가 아파치 웹 서버에 의해 만들어졌음을 나타냄.
    -> 요청의 User-agent와 비슷
  • Last-Modified: Mon, 18 Aug 2025 01:23:45 GMT
    -> 객체가 생성되거나 마지막으로 수정된 시간과 날짜
    -> 로컬 클라이언트와 네트워크 캐시 서버 캐싱에 중요
  • Content-Length: 6821
    -> 송신되는 객체의 바이트 수
  • Content-Type: text/html
    -> 개체 몸체 내부가 HTML 텍스트임을 나타냄

 

여기서 Date, Last-Modified 같은 날짜 포맷은 RFC 7231에서 정의한 GMT(=UTC)를 따라야 합니다.

즉, KST 같은 로컬 타임존 표기는 하면 안됩니다.


일반 포맷을 보겠습니다.

 

요청 메시지와 많이 유사합니다. 여기서 개체 몸체는 요청 객체를 포함합니다.


HTTP 명세서는 브라우저, 웹 서버, 네트워크 캐시 서버에 의해 삽입될 수 있는 많은 헤더 라인을 정의하고 있습니다.

오늘 알아본 것은 그 일부분입니다.

'CS > 네트워크' 카테고리의 다른 글

[네트워크] 웹캐시, 프록시 서버  (0) 2025.09.30
[네트워크] 사용자와 서버 간의 상호작용 쿠키  (2) 2025.09.18
[네트워크] HTTP 개요, 비지속 연결과 지속 연결  (2) 2025.08.28
[네트워크] 네트워크 애플리케이션의 원리  (6) 2025.08.13
[네트워크] TCP/IP 5계층과 캡슐화  (4) 2025.08.05
'CS/네트워크' 카테고리의 다른 글
  • [네트워크] 웹캐시, 프록시 서버
  • [네트워크] 사용자와 서버 간의 상호작용 쿠키
  • [네트워크] HTTP 개요, 비지속 연결과 지속 연결
  • [네트워크] 네트워크 애플리케이션의 원리
단군왕건영
단군왕건영
널리 세상을 이롭게 하고 싶은 개발자
  • 단군왕건영
    홍익인간 개발자
    단군왕건영
  • 전체
    오늘
    어제
    • 분류 전체보기 (81) N
      • TroubleShooting (14)
      • Backend (11) N
        • Java (2)
        • Spring (7) N
        • JPA (2)
      • DB (1)
      • Algorithm (7)
        • 백준 (4)
      • Frontend (0)
        • React (0)
      • Infra (3)
      • CS (37)
        • 컴퓨터구조 (25)
        • 네트워크 (12)
      • Git (3)
      • Mac (2)
      • 회고 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • GitHub
  • 공지사항

  • 인기 글

  • 태그

    spring
    MariaDB
    컴퓨터 구조
    백준
    docker
    네트워크
    java
    Jenkins
    컴퓨터구조
    springboot
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
단군왕건영
[네트워크] HTTP 메시지 포맷
상단으로

티스토리툴바