HTTP Request, HTTP Response의 구조

dahyeon·2022년 8월 24일
0
post-thumbnail

HTTP Request의 구조


HTTP Request는 다음과 같은 구조를 갖는다.
  • request-line

  • header (General|Request|Entity) fields + CRLF (없거나 1개 이상)

  • empty line: header와 body를 구분하기 위해 사용

  • message-body (optional)

    ✔ CRLF는 줄바꿈을 의미하는 문자로 CR(Carriage Return, \r)과 LF(Line Feed, \n)이 조합된 것이다.


예시 1)
GET /hello.htm HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
Host: www.tutorialspoint.com
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Connection: Keep-Alive

예시 2) message-body가 있음

POST /cgi-bin/process.cgi HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
Host: www.tutorialspoint.com
Content-Type: application/x-www-form-urlencoded
Content-Length:length
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Connection: Keep-Alive

licenseID=string&content=string&/paramsXML=string

하나씩 살펴보도록 하자.
  1. Request-line
GET /hello.htm HTTP/1.1

위와 같이 HTTP-METHOD URI HTTP-PROTOCOL 의 형태로 작성한다.

  • GET: HTTP method가 GET임을 의미

  • /hello.htm: 읽어들일 resource. 정확히는 URI/hello.htm 위치에 있는 resource를 요청

  • HTTP/1.1: 사용할 HTTP 프로토콜. HTTP/1.1이 가장 흔히 사용되지만, 좀 더 최신 버전으로는 HTTP/2.0이 있다.


  1. Header
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
Host: www.tutorialspoint.com
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Connection: Keep-Alive

Header에는 요청에 대한 metadata가 들어간다. 대소문자를 구분하지 않는 이름과 콜론 ‘:’ 다음에 오는 값(줄 바꿈 X)으로 이루어져 있다.

각 헤더에 대한 설명은 이 링크에 자세히 나와있다. 그 중 일부만 설명하자면,

  • 인증 관련

    • Authorization: 서버와 함께 유저 에이전트를 인증하기 위한 자격 증명 포함
  • 캐싱

    • Cache-control: 요청과 응답 모두에서의 캐싱 매커니즘을 명시. Cache-control에 대한 자세한 정보는 이 링크를 참고하자!
  • 연결관리

    • Connection: 현재 트랜잭션이 끝난 후에 네트워크 연결을 열린 상태로 둘 지 여부를 제어 ❗ HTTP/2. 에서는 사용이 금지되었다고 한다… 크롬과 파이어폭스는 응답에서 이 부분을 무시한다. close가 기본값. keep-alive는 네트워크 접속을 유지한다는 것을 의미하며, 동일한 서버에 대한 후속 요청(TCP 연결을 위한 three-way handshake를 또 맺을 필요없이)을 수행할 수 있다.
  • 컨텐츠 협상

    • Accept-language: 서버가 돌려주기로 예상된 언어를 서버에게 알려줌. 어떤 언어를 클라이언트가 이해할 수 있는지, 지역 설정 중 어떤 것이 더 선호되는지 알려주는 일종의 힌트. 서버는 제안 중 하나를 선택한 뒤 응답에서 content-language 헤더를 통해 선택된 내용을 클라이언트에게 알려준다.
    • Accept-encoding: 클라이언트가 이해 가능한 컨텐츠 인코딩(보통 압축 알고리즘)이 무엇인지 서버에게 알려줌. 서버는 제안 중 하나를 선택한 뒤 응답에서 content-encoding 헤더를 통해 선택된 내용을 클라이언트에게 알려준다.
  • message body 정보

    • Content-type: 서버에게 어떤 유형의 데이터가 전송됐는지 알려줌.
      Content-Type: text/html; charset=utf-8
      Content-Type: multipart/form-data; boundary=something
      • media-type: 리소스 혹은 데이터의 MIME type. 위 예시에서는 text/html, multipart/form-data 부분.

        기본값은 보통 application/octet-stream이다.

    • Content-length: 전송된 데이터(body)의 크기를 10진수 byte 단위로 나타냄.
  • 요청 컨텍스트

    • host: 서버의 도메인명과 서버가 리스닝 중인 TCP 포트 번호(optional)를 명시

이 외에도 쿠키, CORS, 보안 등에 관련된 다양한 HTTP 헤더가 있다.


  1. Body

Body 부분에는 사실상 무엇이든 들어갈 수 있다! 다만 데이터에 따라 header의 message body 정보가 달라질 것이다.

  • 다음과 같은 JSON 형식의 데이터도 가능하다. 이 때 content-type이 application/json인 것을 확인할 수 있다.
    POST /api/authors HTTP/1.1
    Host: myWebApi.com
    Content-Type: application/json
    Cache-Control: no-cache
    
    {
         "Name": "Felipe Gavilán",
         "Age": 999
    }


HTTP Response의 구조

HTTP Response는 다음과 같은 구조를 갖는다.

  • status-line

  • header + CRLF (없거나 1개 이상)

  • empty line: header와 body를 구분하기 위해 사용

  • message-body (optional)

예시)

HTTP/1.1 200 OK
Date: Mon, 27 Jul 2009 12:28:53 GMT
Server: Apache/2.2.14 (Win32)
Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT
Content-Length: 88
Content-Type: text/html
Connection: Closed

Status-line 부분을 제외하면 request의 구조와 동일하다.

  • Status-line Status-line은 다음과 같은 형식으로 작성한다. HTTP-Version Status-Code Reason-Phrase CRLF Reason-phrase는 status code를 간략하게 텍스트로 설명해주는 부분이다.

참고 자료

HTTP - Requests
Anatomy of an HTTP request
Accept-Language - HTTP | MDN
[HTTP] keep alive란? (persistent connection에 대하여)

profile
https://github.com/dahyeon405

0개의 댓글