본문 바로가기
운영체제&네트워크/Network

HTTP 리퀘스트 메시지

by GangDev 2024. 4. 24.

 

HTTP 리퀘스트 메시지를 작성하는 것은 웹 클라이언트가 웹 서버와 통신하기 위해 필요한 과정 중 하나다.

이 과정은 클라이언트가 서버에 요청을 보내는 방법을 정의하고 있으며, 이를 통해 웹 페이지의 내용을 가져오거나, 데이터를 전송하거나, 웹 서버에 명령을 내릴 수 있다.

 

HTTP 리퀘스트 메시지는 다음과 같은 구조를 가지고 있다:

 

  1. 시작 라인(Start Line): 이 부분에는 리퀘스트 라인이 포함되며, 메소드(GET, POST 등), 요청하는 리소스의 URL, 그리고 HTTP 버전이 명시된다.
  2. 헤더(Headers): 클라이언트와 서버 간의 추가 정보를 전달하는 헤더 필드들이 포함된다. 예를 들어, User-Agent는 클라이언트의 정보를, Accept는 클라이언트가 받을 수 있는 미디어 타입을 나타낸다.
  3. 본문(Body): 필요에 따라 요청과 함께 전송되는 데이터가 포함된다. 예를 들어, POST 메소드를 사용할 때 서버에 전송할 데이터를 본문에 포함시킬 수 있다.

 

예를 들어, 웹 브라우저에서 웹 페이지를 요청하는 경우, 다음과 같은 HTTP 리퀘스트 메시지가 생성될 수 있다:

GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8

 

이 메시지는 다음과 같은 구성 요소를 포함하고 있다:

  • 시작 라인: GET /index.html HTTP/1.1 - 이 부분은 메소드(GET), 요청하는 리소스의 URL(/index.html), 그리고 HTTP 버전(HTTP/1.1)을 나타낸다.
  • 헤더: 여러 헤더 필드들이 포함되어 있으며, 각각의 필드는 새로운 줄에 위치한다. 예를 들어, Host 필드는 요청하는 서버의 호스트 이름을 나타내고, User-Agent는 클라이언트의 정보를 나타낸다.

HTTP 리퀘스트 메시지를 작성할 때는 요청하는 리소스의 종류와 필요한 정보에 따라 적절한 메소드와 헤더를 선택해야 한다. 또한, 필요한 경우 본문에 추가 데이터를 포함시킬 수 있다. 이러한 과정을 통해 웹 클라이언트는 웹 서버와 효과적으로 통신할 수 있으며, 웹 페이지의 내용을 가져오거나 데이터를 전송할 수 있다.


서버는 HTTP 리퀘스트 메시지의 헤더를 해석하여 클라이언트의 요청을 처리한다. 헤더는 대소문자를 구분하지 않는 문자열로 구성되며, 콜론(:) 뒤에 값이 오는 구조를 가지고 있다. 헤더의 전체, 즉 값을 포함한 부분은 단일 라인으로 구성되어 있으며, 이 라인은 상당히 길어질 수 있다.

 

헤더는 여러 그룹으로 나눌 수 있다:

  • 일반 헤더(General headers): 메시지 전체에 적용되는 헤더로, 예를 들어 Via와 같은 헤더가 있다.
  • 요청 헤더(Request headers): 요청을 더욱 구체화하거나, 컨텍스트를 제공하거나, 조건부로 제한하는 역할을 하는 헤더로, 예를 들어 User-Agent, Accept, Accept-Language, Referer, If-None-Match 등이 있다.
  • 표현 헤더(Representation headers): 메시지 데이터의 원래 형식과 적용된 인코딩을 설명하는 헤더로, 메시지에 본문이 있을 때만 나타난다. 예를 들어 Content-Type이 있다.

서버는 이러한 헤더를 통해 클라이언트의 요청을 이해하고, 요청에 따라 적절한 응답을 생성한다. 예를 들어, User-Agent 헤더는 클라이언트의 정보를 제공하며, Accept 헤더는 클라이언트가 받을 수 있는 미디어 타입을 나타낸다. 이러한 정보를 바탕으로 서버는 클라이언트의 요청을 처리하고, 적절한 응답을 반환한다.

또한, HTTP 메시지는 요청과 응답 두 가지 유형의 메시지로 구성되며, 각각은 시작 라인, 헤더, 빈 라인, 그리고 선택적으로 본문으로 구성된다. 이 구조를 통해 서버는 클라이언트의 요청을 정확히 해석하고, 요청에 따라 적절한 응답을 생성할 수 있다.

HTTP/1.x에서는 헤더 필드가 요청 라인 또는 응답 라인 다음에 전송되며, 헤더 필드는 콜론으로 구분된 키-값 쌍의 텍스트 형식으로 전송된다. 헤더 섹션의 끝은 빈 필드 라인으로 표시되며, 이는 두 개의 연속된 CR-LF 쌍의 전송을 의미한다. HTTP/2와 HTTP/3에서는 이진 프로토콜을 사용하여 헤더가 단일 HEADERS 프레임과 0개 이상의 CONTINUATION 프레임에 인코딩되며, 이는 효율적인 헤더 압축을 제공한다.

따라서, 서버는 헤더를 통해 클라이언트의 요청을 해석하고, 요청에 따라 적절한 응답을 생성하여 반환한다. 이 과정은 웹 클라이언트와 서버 간의 효과적인 통신을 가능하게 한다.

 


서버가 클라이언트 요청을 해석할 때 자주 사용되는 몇 가지 공통적인 요청 헤더는 다음과 같다:

  • User-Agent: 요청을 보내는 브라우저나 사용자 에이전트를 지정한다. 이 헤더는 서버가 클라이언트의 브라우저 정보를 알 수 있게 해주며, 웹사이트는 이 정보를 바탕으로 적절한 콘텐츠를 제공할 수 있다.
  • Accept: 클라이언트가 처리할 수 있는 미디어 타입을 지정한다. 예를 들어, 클라이언트가 HTML, JSON, XML 등의 데이터 형식을 처리할 수 있음을 나타냅니다. 서버는 이 정보를 바탕으로 적절한 응답을 생성한다.
  • Host: 요청하는 서버의 호스트 이름과 포트 번호를 지정한다. 이 헤더는 서버가 요청을 올바른 호스트로 라우팅할 수 있게 해준다.
  • Referer: 현재 요청을 보내기 전에 클라이언트가 방문했던 웹 페이지의 URL을 지정한다. 이 정보는 서버가 클라이언트의 이전 페이지를 추적하거나, 특정 웹 페이지로의 접근을 제한하는 등의 목적으로 사용될 수 있다.

이러한 헤더들은 클라이언트와 서버 간의 통신을 효과적으로 하기 위해 사용되며, 서버는 이 정보를 바탕으로 클라이언트의 요청을 정확히 해석하고, 적절한 응답을 생성할 수 있다. 예를 들어, User-Agent 헤더를 통해 서버는 클라이언트의 브라우저 정보를 알 수 있고, 이를 바탕으로 적절한 콘텐츠를 제공할 수 있다. 또한, Accept 헤더를 통해 서버는 클라이언트가 처리할 수 있는 미디어 타입을 알 수 있으며, 이를 바탕으로 적절한 응답을 생성한다.

 


서버가 클라이언트 요청을 해석할 때 사용되는 다른 공통적인 요청 헤더들도 있다:

- **Accept-Language**: 클라이언트가 이해할 수 있는 언어를 지정한다. 서버는 이 정보를 바탕으로 적절한 언어로 된 콘텐츠를 제공할 수 있다.
- **Authorization**: 클라이언트가 서버에 인증을 요청할 때 사용되는 헤더로, 인증 정보를 포함한다. 이를 통해 서버는 요청이 유효한지 확인할 수 있다.
- **Content-Type**: 요청 본문의 미디어 타입을 지정한다. 서버는 이 정보를 바탕으로 요청 본문의 형식을 이해하고, 적절한 처리를 할 수 있다.
- **Cookie**: 클라이언트가 서버에 전송하는 쿠키를 포함한다. 서버는 이 정보를 바탕으로 세션 정보를 유지하거나, 사용자 선호도를 기억할 수 있다.
- **Referer**: 요청을 보내기 전에 클라이언트가 방문했던 웹 페이지의 URL을 지정한다. 이 정보는 서버가 클라이언트의 이전 페이지를 추적하거나, 특정 웹 페이지로의 접근을 제한하는 등의 목적으로 사용될 수 있다.

이러한 헤더들은 클라이언트와 서버 간의 통신을 효과적으로 하기 위해 사용되며, 서버는 이 정보를 바탕으로 클라이언트의 요청을 정확히 해석하고, 적절한 응답을 생성할 수 있다. 예를 들어, `Accept-Language` 헤더를 통해 서버는 클라이언트가 이해할 수 있는 언어를 알 수 있고, 이를 바탕으로 적절한 언어로 된 콘텐츠를 제공할 수 있습니다. 또한, `Authorization` 헤더를 통해 서버는 클라이언트의 인증 정보를 확인하고, 요청의 유효성을 검증할 수 있습니다.