본문 바로가기
CS/Network

[Network] HTTP 메시지

by 0xe82de 2022. 8. 13.
반응형

HTTP 메시지는 클라이언트 <-> 서버 간 데이터를 교환하는 방식입니다. HTTP 메시지는 요청 메시지와 응답 메시지로 나뉩니다. 각 메시지의 역할은 다음과 같습니다.

구분 역할
요청 메시지 클라이언트가 서버에게 특정 동작을 취하도록 요청하는 것
응답 메시지 요청에 대한 서버의 답변

HTTP 메시지는 개행 문자를 기준으로 헤더와 바디로 나뉘는데, 바디는 생략될 수 있습니다.

메시지 헤더
──────────────────────
개행 문자 (CR + LF)
──────────────────────
메시지 바디 (생략 가능)

헤더, 개행 문자, 바디의 역할은 다음과 같습니다.

구분 역할
헤더 요청 또는 응답에 대한 정보와 바디에 대한 정보를 가집니다.
개행 문자 더 이상 헤더 정보가 없음을 의미합니다.
바디 요청 또는 응답에서 필요한 페이로드를 가집니다.

요청 메시지

요청 메시지 헤더

요청 메시지 헤더의 구조는 다음과 같습니다. 요청 라인에는 요청 메소드, 요청 URI, HTTP 버전이 포함됩니다.

요청 라인
───────────────
요청 헤더 필드
───────────────
일반 헤더 필드
───────────────
엔티티 헤더 필드

요청 메시지 예제

POST /users HTTP/1.1
Host: google.com
Accept-Language: ko
Cache-Control: no-cache

username=kim&password=passw0rd

 

반응형

 

응답 메시지

응답 메시지 헤더

응답 메시지 헤더의 구조는 다음과 같습니다. 응답 메시지 헤더는 요청 메시지 헤더와 달리 요청 라인요청 헤더 필드 대신 상태 라인응답 헤더 필드를 가집니다. 그리고 상태 라인에는 HTTP 버전, 상태 코드, 상태 메시지가 포함됩니다.

상태 라인
───────────────
응답 헤더 필드
───────────────
일반 헤더 필드
───────────────
엔티티 헤더 필드

응답 메시지 예제

HTTP/1.1 201 Created
Date: Mon, 8 Aug 2022 10:06 GMT
Server: Apache
Content-Type: application/json

{
    userId: 1
    username: "kim"
    password: "passw0rd"
}

메시지 인코딩

HTTP로 데이터를 전송할 때 인코딩을 적용하면 데이터를 효율적으로 전송할 수 있습니다.

압축, Content-Encoding

대용량 파일과 같이 용량이 큰 데이터를 요청할 경우 데이터를 압축하여 받을 수 있습니다.

클라이언트는 Accept-Encoding 필드를 요청 헤더에 추가하여 압축 방법을 협상할 수 있습니다.

GET /files/1 HTTP/1.1
Accept-Encoding: gzip, deflate

서버는 Content-Encoding 필드를 응답 헤더에 추가하고 데이터를 압축하여 클라이언트로 전달합니다.

HTTP/1.1 200 OK
Content-Type: text/plain
Content-Encoding: gzip

compressed body

참고

분할, Transfer-Encoding

대용량 파일과 같이 용량이 큰 데이터를 요청하고 화면에 표시할 때 데이터를 분할하여 표시할 수 있습니다.

클라이언트는 Accept-Encoding 필드를 요청 헤더에 추가하여 분할 전송을 받을 수 있습니다.

GET /images/2 HTTP/1.1
Accept-Encoding: chunked

서버는 Transfer-Encoding 필드를 응답 헤더에 추가하고 데이터를 분할하여 전송합니다. 이때 헤더는 Content-Length 필드를 가지지 않습니다. 바디의 chunk마다 길이가 명시됩니다.

HTTP/1.1 200 OK
Content-Type: text/plain
Transfer-Encoding: chunked

7\r\n
Mozilla\r\n
9\r\n
Developer\r\n
7\r\n
Network\r\n
0\r\n
\r\n

Multipart

메일의 경우 본문에 텍스트를 작성하고 파일을 첨부하여 전송할 수 있습니다. HTTP로 여러 종류의 데이터를 한 번에 보내야 하는 경우에 멀티파트 타입을 사용하여 전송할 수 있습니다.

참고

multipart/form-data

multipart/form-data는 클라이언트에서 서버로 여러 종류의 데이터를 전송할 수 있습니다.

Content-Type 필드에 multipart/form-data를 설정하고 바디에 각 데이터를 - 문자로 시작하는 boundary로 구분하여 전송합니다.

POST / HTTP/1.1
Content-Type: multipart/form-data; boundary=--xyz
Content-Length: 465

--xyz
Content-Disposition: form-data; name="name"
Content-Type: text/plain

John
--xyz
Content-Disposition: form-data; name="age"
Content-Type: text/plain

23
--xyz
Content-Disposition: form-data; name="photo"; filename="photo.jpeg"
Content-Type: image/jpeg

[JPEG DATA]
--xyz--

multipart/byteranges

multipart/byteranges는 클라이언트에서 복수 범위의 데이터를 요청할 때 사용합니다.

각 데이터는 boundary에 의해 구분되어 바디에 포함되며, 각각 Content-Type, Content-Range 필드를 가집니다.

HTTP/1.1 206 Partial Content
Accept-Ranges: bytes
Content-Type: multipart/byteranges; boundary=3d6b6a416f9b5
Content-Length: 385

--3d6b6a416f9b5
Content-Type: text/html
Content-Range: bytes 100-200/1270

eta http-equiv="Content-type" content="text/html; charset=utf-8" />
    <meta name="vieport" content
--3d6b6a416f9b5
Content-Type: text/html
Content-Range: bytes 300-400/1270

-color: #f0f0f2;
        margin: 0;
        padding: 0;
        font-family: "Open Sans", "Helvetica
--3d6b6a416f9b5--

Range Request

데이터를 요청할 때 일부 데이터만 요청할 수 있습니다.

참고

GET /images/3 HTTP/1.1
Host: github.com
Range: bytes=0-1023
반응형

'CS > Network' 카테고리의 다른 글

[Network] Proxy & Gateway  (0) 2022.08.20

댓글