HTTP(Hypertext Transfer Protocol) 알아보기 (2)

2026. 5. 21. 21:41네트워크/응용계층

HTTP 메시지 구조

 

(HTTP/1.1 기준) HTTP의 메시지 구성은 다음과 같다.

 

HTTP 메시지는 시작 라인, 필드 라인, 메시지 본문으로 이루어져 있다. 필드 라인은 없거나 여러 개 있을 수 있고, 메시지 본문은 없을 수 있다. 또한 필드 라인과 메시지 본문 사이에는 빈 줄바꿈이 있다. 

 

시작 라인

 

시작 라인(start-line) 부터 살펴보자. HTTP 메시지는 요청 메시지와 응답 메시지가 있다. 이때 요청 메시지일 경우 시작 라인은 '요청 라인'이 되고, 응답 메시지일 경우 시작 라인은 '상태 라인'이 된다.

 

요청 메시지의 시작 라인인 요청 라인(request-line)의 형식은 다음과 같다. 메서드, 요청 대상, HTTP 버전은 모두 공백으로 구분된다. 

요청 라인 = 메서드(공백)요청 대상(공백)HTTP 버전(줄바꿈)

 

메서드(method)란 클라이언트가 서버의 자원(요청 대상)에 대해 수행할 작업의 종류를 나타낸다. 대표적으로 GET, POST, PUT, DELETE 등이 있다. 요청 대상이 같아도 메서드가 다르면 각기 다른 요청으로 처리된다. 

 

요청 대상(request-target)은 HTTP 요청을 보낼 서버의 자원을 의미한다. 보통 이곳에는 (쿼리가 포함된) URL 경로(path)가 명시된다. 예를 들어 클라이언트가 "http://www.example.com/hello?q=world"로 요청을 보낼 경우, 요청 대상은 "/hello?q=world"가 된다. 만약 하위 경로가 없더라도 요청 대상은 슬래시(/)로 표기해야 한다. 예를 들어 클라이언트가 "http://www.example.com"으로 요청할 경우 요청 대상은 "/"가 된다.

 

HTTP 버전(HTTP-version)은 이름 그대로 사용된 HTTP 버전을 의미한다. 'HTTP/<버전>'의 표기 방식을 따른다. 

 

HTTP 메시지가 응답 메시지일 경우 시작 라인은 다음과 같은 상태 라인(status-line)이 된다. 형식은 다음과 같으며 각 항목은 공백으로 구분된다. 

상태 라인 = HTTP 버전(공백)상태 코드(공백)이유 구문(줄바꿈)   *이유 구문은 옵션

 

HTTP 버전은 사용된 HTTP의 버전을 나타내며, 상태 코드(status code)는 요청에 대한 결과를 나타내는 세 자리 정수다. 클라이언트는 상태 코드를 통해 요청이 어떻게 처리되었는지 판단할 수 있다. 이유 구문(reason phrase)은 상태 코드에 대한 문자열 형태의 설명을 의미한다. 예를 들어 상태 코드 200은 '요청이 성공적으로 받아들여지고 수행됨'을 의미한다. 이유 구문까지 표기한 예시는 다음과 같다. 

HTTP/1.1 200 OK

 

또 다른 예로, 상태코드 404는 '요청한 자원이 존재하지 않음'을 의미한다. 이를 이유 구문까지 함께 표기한 예시는 다음과 같다. 

HTTP/1.1 404 Not Found

 

필드 라인

 

이번엔 필드 라인이다. 필드 라인에는 0개 이상의 HTTP 헤더(HTTP header)가 명시된다. 그래서 이를 헤더 라인(header-line)이라고도 부른다. 여기서 HTTP 헤더란 HTTP 통신에 필요한 부가 정보를 의미한다. 참고로, 공식 문서에서는 필드 라인에 '0개 이상'의 헤더가 명시된다고 언급되지만, 실제로는 HTTP 메시지에 아주 다양한 헤더들이 사용되는 것이 일반적이다.

 

필드 라인에 명시되는 각 HTTP 헤더는 콜론(:)을 기준으로 헤더 이름(header-name)과 하나 이상의 헤더 값(header-value)으로 구성된다. 다음 예시의 밑줄 친 부분이 HTTP 헤더다. 

GET /example-page HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/118.0
Accept: text/html

 

메세지 본문

 

HTTP 요청 혹은 응답 메시지에서 본문이 필요할 경우 이는 메시지 본문(message-body)에 명시된다. 메시지 본문은 존재하지 않을 수도 있고, 다음과 같이 다양한 콘텐츠 타입이 사용될 수도 있다.

 

HTTP 메소드와 상태 코드, 헤더 등은 다음에 천천히 알아볼 예정이다. 

정리

 

HTTP 메세지의 구조 

1. 전체 구성 

  • HTTP 메시지는 시작 라인, 필드 라인(헤더), 메시지 본문(바디)으로 구성되며, 각 요소는 줄바꿈(CRLF)으로 구분됨. 
[시작 라인] (요청 라인 또는 상태 라인)
[필드 라인] (0개 이상의 헤더들...)
(공백 라인 - 빈 줄 하나 필수!)
[메시지 본문] (선택 사항)

📢 Tip: 필드 라인(헤더)과 메시지 본문(바디) 사이에는 반드시 빈줄(공백 라인)이 들어가야함. 이 빈줄이 있어야 "아, 여기까지가 헤더고 이제부터 진짜 데이터(바디)가 시작되는구나!"라고 인식이 가능함. 

2. 시작 라인 (Start-line)

  • 메세지의 첫 번째 줄로써, 요청이냐 응답이냐에 따라 이름과 구성이 달라짐.

① 요청 라인 (Request-line) > 클라이언트의 요청일 시 

  • 구조: 메서드(공백)요청 대상(공백)HTTP 버전(줄바꿈)
  • 예시: GET /index.html HTTP/1.1
    • 메서드: 서버에 요구하는 작업 유형(GET, POST 등). 메서드가 다르면 다른 요청으로 처리됨. 
    • 요청 대상: 접근하려는 서버의 자원 경로(URL/URI). 하위 경로가 없으면 '/'가 표기됨.
      • 예) 'www.example.com/login?name=kim' 일경우 '/login?name=kim'이 명시됨. 슬래시 이후의 경로가 없다면, '/'만 있음.
    • HTTP 버전 : 'HTTP/<버전>' 형식으로 표기. 

② 상태 라인 (Status-line) > 요청에 대한 서버의 응답일 시

  • 구조 : HTTP 버전(공백)상태 코드(공백)이유 구문(줄바꿈)
  • 예시 : HTTP/1.1 200 OK
    • HTTP 버전 : 요청 라인과 동일한 항목. HTTP의 버전이 명시.
    • 상태 코드 : 요청 처리 결과를 나타내는 3자리 정수.
    • 이유 구문 : 상태 코드에 대한 문자열 형태의 설명(없을 수도 있음).

3. 필드 라인 (Field-line / Headers)

  • 구조 : 헤더 이름 : 헤더 값 (콜론 기준으로 구분)
  • 특징 : HTTP 통신에 필요한 부가 정보(메타 데이터)를 담는 곳. 공식 문서에선 '0개 이상'이라고 설명하나, 실제 통신에선 수많은 헤더가 사용됨. 

4. 메시지 본문 (Message-body)

  • 특징 : 실제 전송하는 데이터의 알맹이. 전송할 데이터가 없다면 비어있을 수도 있음. HTML 파일, 이미지, JSON 데이터 등 다양한 형태(콘텐츠 타입)의 값이 들어갈 수 있음. 

5. 추가로 알면 좋은 점 

① 요청/응답에 따른 바디 유무의 차이

  • 보통 데이터를 달라고 하는 GET 요청은 바디를 비워서 보내는 것이 일반적임. 반대로 서버에 데이터를 저장해달라고 하는 POST나 PUT 같은 요청은 바디에 회원가입 정보나 글 내용 같은 데이터를 꽉꽉 채워서 보냄. 응답할 때도 마찬가지로 데이터가 필요 없으면 바디가 비어있을 수 있음. 

② 줄바꿈 (CRLF) 

  • 컴퓨터가 HTTP 메시지를 읽을 때 줄바꿈을 기준으로 해석(파싱)함. 이때 쓰이는 줄바꿈은 일반적으로 쓰는 키보드의 엔터와는 다름. 정확히는 CR(\r)과 LF(\n)라는 두 가지 특수 문자가 합쳐진 CRLF 방식을 규격으로 사용함. 추후 코드나 패킷으로 직접 메시지를 보게 되면 CRLF라는 단어가 자주 등장함. 
  • \n 은 말 그대로 "줄을 바꿔라."라는 명령이며, \r은 "커서를 왼쪽으로 옮겨라."라는 명령이라 보면됨. (옛날 타자기 쓸 때의 관행이 그대로 옮겨온거라 함.)