앞서 해당글은 인프런에 있는 '모든 개발자를 위한 HTTP 웹 기본 지식' 강의를 기반으로 추가 보충하여 공부하고 정리한 내용들로 해당 강의 자료를 일부 사용하였습니다. 강의를 듣고자 하시는 분은 아래 링크로 가셔서 들으시면 되겠습니다.
HTTP 구조
HTTP (Hypertext Transfer Protocol) 메시지는 웹 서버와 클라이언트 간에 데이터를 전송하기 위한 표준 프로토콜입니다. HTTP 메시지는 HTTP 요청과 HTTP 응답으로 나뉩니다. 각각의 메시지는 헤더(Header)와 바디(Body)로 구성됩니다.
HTTP 요청 메시지는 클라이언트가 서버에게 요청을 보낼 때 사용됩니다. 요청 메시지에는 요청 메서드(GET, POST, PUT, DELETE 등), 요청 대상 URL, HTTP 버전, 요청 헤더와 요청 바디 등이 포함됩니다.
HTTP 응답 메시지는 서버가 클라이언트에게 응답을 보낼 때 사용됩니다. 응답 메시지에는 HTTP 버전, 응답 상태 코드(200 OK, 404 Not Found 등), 응답 헤더와 응답 바디 등이 포함됩니다.
HTTP 메시지의 구조는 다음과 같습니다.
<start-line> // 요청 또는 응답 메시지의 시작 라인
<header-fields> // 요청 또는 응답 메시지의 헤더 필드
<empty-line> // 요청 또는 응답 메시지의 빈 줄
[<message-body>] // 요청 또는 응답 메시지의 바디(있을 수도, 없을 수도 있음)
- start-line: 요청 또는 응답 메시지의 시작 라인으로 요청 메서드, 요청 대상 URL, HTTP 버전 또는 HTTP 응답 상태 코드, 상태 코드 설명, HTTP 버전이 포함됩니다.
- header-fields: 요청 또는 응답 메시지의 헤더 필드는 "필드 이름: 필드 값"의 형식으로 되어 있습니다. 헤더 필드에는 Content-Type, Content-Length, Content-Language, Content-Encoding 등이 포함됩니다.
- empty-line: 요청 또는 응답 메시지의 헤더와 바디를 구분하기 위한 빈 줄입니다.
- message-body: 요청 또는 응답 메시지의 바디는 데이터가 포함됩니다. 바디는 생략할 수 있습니다.
요청 메시지
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/89.0.4389.82 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
요청 라인에서는 요청 메서드(GET), 요청 대상 URL(/index.html)과 HTTP 버전(HTTP/1.1)이 포함됩니다. 헤더 필드는 키-값 쌍으로 이루어져 있으며, 키와 값은 콜론(:)으로 구분됩니다. 헤더 필드에는 요청의 세부 정보가 포함됩니다. 예를 들어, "Host" 헤더 필드는 요청한 호스트의 이름을 나타냅니다. 마지막으로, 요청 메시지의 바디는 없습니다.
응답 메세지
HTTP/1.1 200 OK // 응답 라인
Content-Type: text/html // 헤더 필드
Content-Length: 1234
Cache-Control: no-cache
Server: Apache/2.2.21 (Unix) mod_ssl/2.2.21 OpenSSL/0.9.8e-fips-rhel5
<빈 줄>
<HTML>... // 응답 바디
응답 라인에서는 HTTP 버전(HTTP/1.1), 응답 상태 코드(200 OK)와 상태 코드에 대한 설명이 포함됩니다. 헤더 필드는 요청과 마찬가지로 키-값 쌍으로 이루어져 있으며, 응답의 세부 정보가 포함됩니다. 마지막으로, 응답 메시지의 바디에는 요청에 대한 응답으로 전송된 데이터가 포함됩니다.
HTTP 메시지는 웹 서버와 클라이언트 간에 데이터를 전송하는 데 필요한 구조입니다. HTTP 요청과 응답은 각각 요청 라인 또는 응답 라인, 헤더 필드, 바디로 구성됩니다. 이러한 구조를 이용하여 웹 서버와 클라이언트 간에 정보를 주고받을 수 있습니다.
HTTP Header-Feilds
헤더 필드는 key - value로 값을 표현하고 있으며, 헤더는 해당 메세지에 대한 정보를 표시하는데 사용됩니다. 많은 헤더들이 존재하지만 자주 사용되는 Content-Type, Content-Encoding, Content-Language, Content-Length 에 대한 설명을 하겠습니다. 각 헤더정보에 따른 내용은 아래와 같습니다.
Content-Type
Content-Type 헤더는 메시지 바디의 미디어 타입을 나타냅니다. 메시지 바디가 어떤 유형의 데이터인지에 대한 정보를 포함합니다. 예를 들어, 텍스트 문서인지, 이미지인지, 동영상인지 등을 나타냅니다. 이 헤더는 클라이언트와 서버 간에 데이터를 교환할 때 중요한 역할을 합니다. Content-Type 헤더는 다음과 같은 형식으로 표현됩니다.
Content-Type: text/html; charset=UTF-8
Content-Encoding
Content-Encoding 헤더는 메시지 바디의 인코딩 방법을 나타냅니다. 이 헤더를 사용하여 메시지 바디를 압축하거나 인코딩하여 전송할 수 있습니다. Content-Encoding 헤더는 다음과 같은 형식으로 표현됩니다.
Content-Encoding: gzip
Content-Language
Content-Language 헤더는 메시지 바디의 언어를 나타냅니다. 이 헤더는 클라이언트가 선호하는 언어를 서버에 알리는 데 사용됩니다. 서버는 이 정보를 사용하여 사용자가 이해할 수 있는 언어로 메시지를 제공합니다. Content-Language 헤더는 다음과 같은 형식으로 표현됩니다.
Content-Language: ko-KR
Content-Length
Content-Length 헤더는 메시지 바디의 크기를 나타냅니다. 이 헤더는 서버가 클라이언트에게 전송할 메시지 바디의 크기를 알리는 데 사용됩니다. Content-Length 헤더는 다음과 같은 형식으로 표현됩니다.
Content-Length: 1024
협상 (Negotitation)
HTTP 협상은 클라이언트와 서버 간의 데이터 교환 과정에서 사용됩니다. 클라이언트는 HTTP 요청 메시지를 보낼 때, 해당 요청 메시지에 포함된 헤더를 통해 서버에게 어떤 미디어 타입, 언어, 문자 인코딩 등의 속성을 요청하고, 서버는 이에 대한 적절한 응답을 제공합니다.
예를 들어, 클라이언트가 언어 속성으로 "ko-KR"을 요청하면, 서버는 "ko-KR"에 해당하는 콘텐츠를 제공합니다. 만약 서버가 "ko-KR"에 대한 콘텐츠를 지원하지 않는다면, 서버는 다른 언어 속성에 대한 적절한 응답을 제공하거나, 에러 메시지를 반환할 수 있습니다.
HTTP 협상은 다양한 방식으로 사용될 수 있습니다. 예를 들어, 웹 브라우저에서는 사용자의 언어 설정에 따라 해당 언어에 맞는 콘텐츠를 보여주기 위해 HTTP 협상을 사용합니다. 또한, RESTful API에서는 클라이언트가 요청하는 데이터 포맷에 따라 적절한 형식의 응답을 제공하기 위해 HTTP 협상을 사용합니다.
Content-Encoding 에서 우선순위 설정은 0.1 ~ 1 값으로 지정을 하여 사용할 수 있습니다. 높은 값이 우선순위를 가집니다.
Content-Type의 경우에는 구체적인 내용이 우선순위를 가지게 됩니다.
HTTP 협상은 클라이언트와 서버 간의 효율적인 데이터 교환을 가능케 하며, 다양한 형태의 데이터를 교환할 수 있도록 지원합니다. 따라서 HTTP 프로토콜에서 협상은 매우 중요한 역할을 합니다.
HTTP Message-Body
HTTP 메시지 바디는 HTTP 요청 또는 응답 메시지에 포함되는 데이터를 나타냅니다. 이 메시지 바디는 HTTP 헤더 이후에 빈 줄 (CRLF) 다음에 나오며, 크게 두 가지 유형이 있습니다.
- 텍스트 기반 데이터: 텍스트 기반의 데이터를 포함하는 HTTP 바디는 보통 HTML, XML, JSON, 텍스트 파일 등의 형식을 사용합니다. 이 경우 Content-Type 헤더 필드에 적절한 미디어 타입을 지정해야 합니다. 예를 들어, HTML 데이터인 경우 Content-Type 헤더 필드는 "text/html"이 되어야 합니다.
- 이진 데이터: 이진 데이터를 포함하는 HTTP 바디는 보통 이미지, 오디오, 비디오 등의 형식을 사용합니다. 이 경우 Content-Type 헤더 필드에 적절한 미디어 타입을 지정해야 합니다. 예를 들어, JPEG 이미지인 경우 Content-Type 헤더 필드는 "image/jpeg"이 되어야 합니다.
청크 코딩(Chunked encoding)은 HTTP 메시지를 전송할 때, 메시지 바디의 크기를 미리 알 수 없는 경우에 사용되는 전송 코딩 방식 중 하나입니다. 이 방식은 메시지 바디를 일정한 크기의 청크(chunk)로 분할하고, 각 청크의 크기와 데이터를 전송하는 방식입니다.
HTTP 메시지 바디의 길이는 Content-Length 헤더 필드를 사용하여 나타내며, 이 값은 바이트 단위로 지정됩니다. 만약 메시지 바디가 청크 전송 코딩을 사용하여 전송된 경우, Content-Length 헤더 필드는 생략될 수 있으며, 대신 Transfer-Encoding 헤더 필드에 "chunked"라는 값을 지정하여 전송됩니다.
HTTP 메시지 바디는 클라이언트와 서버 간의 데이터 교환을 위해 사용되며, 주로 웹 페이지, API 응답 데이터, 파일 등의 형태로 사용됩니다. HTTP 메시지 바디는 메시지 헤더와 함께 전송되어 데이터의 정확성과 안정성을 보장하며, HTTP 프로토콜에서 중요한 역할을 합니다.
'CS 지식 > 네트워크' 카테고리의 다른 글
HTTP 2xx, 3xx, 4xx, 5xx 상태코드 (0) | 2023.05.06 |
---|---|
HTTP 메소드 및 메소드의 속성 (0) | 2023.05.06 |
HTTP (0) | 2023.05.04 |
네트워크(TCP/UDP,IP,URI/URL) (0) | 2023.05.04 |
REST, REST API, RESTful (3) | 2023.01.25 |