티스토리 뷰

Network

HTTP 메시지

realizers 2023. 3. 26. 15:02
728x90
반응형

서론


  • HTTP 프로토콜이 배달원이라면 HTTP 메시지는 배달원이 배송하는 소포와 같습니다.
  • 이번 장에서는 메시지가 어떻게 흘러가는지와 HTTP 메시지의 구성 요소, 요청 메시지와 응답 메시지의 차이를 살펴보겠습니다.

 

메시지의 흐름


  • 메시지는 클라이언트, 프록시, 서버 사이를 흐릅니다.
  • 인바운드, 아웃바운드, 업스트림, 다운스트림은 메시지의 방향을 의미하는 용어입니다.

 

💡 인바운드

 

  • 클라이언트의 요청이 서버로 진입하는 것을 말합니다.
  • 우리가 서버에 파일이나 이미지를 저장할 때, 업스트림이라고도 합니다.

💡 아웃바운드

 

  • 클라이언트의 요청을 서버가 처리하고 , 메시지를 서버에서 클라이언트로 보내는 것을 말합니다.
  • 우리가 서버로부터 파일이나 이미지를 다운로드 받을 때,  다운 스트림이라고도 할 수 있습니다.

 

메시지의 구성 요소


  • 메시지는 시작줄, 헤더, 본문 이렇게 구성이 되어 있습니다.
  • 시작줄은 이것이 어떤 메시지인지 서술하며, 헤더는 속성을, 본문은 데이터를 담고 있습니다. 또한 본문은 없을 수도 있습니다.

 

💡 Request Message

    start line

 

  • start line은 method, target url, http version을 포함하고 있습니다.
GET /test.html HTTP/1.1
[HTTP Method] [Request target] [HTTP version]

    headers

 

  • headers은 요청에 대한 추가 정보를 담고 있습니다.
  • headers도 크게 general headers, request headers, entity headers로 나뉩니다. 
Host: naver.com
Accept: application/json
Accept-Encoding: gzip, deflate
Connection: keep-alive

    body

 

  • 클라이언트가 전송하고자 하는 데이터를 담고 있습니다. 만약 전송하고자 하는 데이터가 없다면 비어있습니다.

 

💡 Response Message

 

  • Request Message와 비교하여 시작줄만 다르고, headers, body는 비슷합니다.

    status line

 

  • HTTP Version, Status Code, Status Text를 포함하고 있습니다.
HTTP/1.1 200 OK
[HTTP version] [Status Code] [Status Text]

 

Header


  • 헤더에는 특정 종류의 메시지에만 사용할 수 있는 헤더와, 일반 목적으로 사용할 수 있는 헤더, 그리고 요청과 응답 메시지 양쪽 모두에서 정보를 제공하는 헤더가 있습니다. 이러한 헤더는 크게 5가지로 분류될 수 있습니다.

 

💡 일반 헤더(General Headers)

 

  • 일반 헤더는 클라이언트와 서버 양쪽 모두 사용합니다. 이러한 일반 헤더는 메시지의 기본적인 정보를 제공합니다.(ex: Date)

    일반 캐시 헤더

 

  • HTTP/1.0은 HTTP 애플리케이션에게 매번 원 서버로부터 객체를 가져오는 대신 로컬 복사본으로 캐시할 수 있도록 해주는 최초의 헤더를 도입하였습니다.

 

💡 요청 헤더(Request Headers)

 

  • 클라이언트가 서버에게 받고자 하는 데이의 타입이 무엇인지와 같은 부가 정보를 제공합니다.

    Accept 관련 헤더

 

  • 클라이언트는 Accept 관련 헤더들을 사용해 서버에게 자신의 선호와 능력을 알려줄 수 있습니다. 
  • Accept 헤더를 사용함으로써 클라이언트가 사용할 수 없는 것을 판별하여 전송하는데 시간과 대역폭의 낭비를 줄일 수 있습니다.
헤더 설명
Accept 클라이언트는 자신이 원하는 미디어 타입을 알려줍니다.
Accept-Encoding 클라이언트는 자신이 원하는 인코딩 방식을 알려줍니다.
Accept-Language 클라이언트는 자신이 원하는 가능한 언어를 알려줍니다.
Accept-Charset 클라이언트는 자신이 원하는 문자 집합을 알려줍니다.

    조건부 요청 헤더

 

  • 때때로 클라이언트는 요청에 몇몇 제약을 넣기도 합니다. 예를들어 클라이언트가 이미 어떤 문서의 사본을 가지고 있는 상태라면, 클라이언트는 서버에게 그 문서를 요청할 때, 자신이 가지고 있는 사본과 다를 때만 전송해달라고 요청할 수 있습니다.

    요청 보안 헤더

 

  • HTTP는 자체적으로 요청을 위한 간단한 인증요구/응답 체계를 가지고 있습니다. 이러한 인증요구/응답 체계는 클라이언트가 특정 리스소에 접근하기 전 자신을 인증하게 함으로써 트랜잭션을 조금 더 안전하게 만들고자 합니다.
  • Authorization, Cookie 등이 있습니다.

 

💡 응답 헤더(Response Headers)

 

  • 응답 헤더는 클라이언트에게 부가 정보를 제공합니다. 누가 응답을 보내고 있는지, 혹은 응답자의 능력은 어떻게 되는지 알려주며 응답에 대한 특별한 설명도 제공할 수 있습니다.
헤더 설명
Age 응답이 얼마나 오래되었는지 알려줍니다.
Public 서버가 특정 리소스에 대해 지원하는 요청 메서드의 목록입니다.
Retry-After 현재 리소스가 사용 불가능한 상태일 때, 언제 가능해지는지 알려줍니다.
Server 서버 애플리케이션의 이름과 버전을 알려줍니다.
Title HTML 문서에서 주어진 것과 같은 제목
Warning 사유 구절에 있는것보다 더 자세한 경고 메시지

    협상 헤더

 

  • 서버에 영어와 일본어로 번역된 HTML 문서가 있는 경우와 같이 여러 가지 표현이 가능한 상황이라면, HTTP/1.1은 서버와 클라이언트가 어떤 표현을 선택할 것인가에 대한 협상을 할 수 있도록 지원합니다.

 

💡 엔티티 헤더(Entity Headers)

 

  • 엔티티 헤더란 엔티티 본문에 대한 헤더를 말합니다. 예를들어 엔티티 헤더는 엔티티 본문에 들어가 있는 데이터의 타입이 무엇인지 말해줄 수 있습니다.

    콘텐츠 헤더

 

  • 콘텐츠 헤더는 엔티티의 콘텐츠에 대한 구체적인 정보를 제공합니다.
헤더 설명
Content-Type 자원의 형식을 명시
Content-Encoding 자원에 대한 데이터의 인코딩 방식
Content-Language 자원을 이해할 수 있는 자연어
Content-Length 자원의 크기나 길이
Content-Location 해당 자원이 실제 어디에 위치했는지 알려줌

    엔티티 캐싱 헤더

 

  • 일반 케시 헤더는 언제 어떻게 캐시 되어야 하는지에 대한 지시자를 제공합니다. 하지만 엔티티 캐싱 헤더는 엔티티 캐싱에 대한 정보를 제공합니다. 
  • 예를들어 리소스에 대한 캐시된 사본이 아직 유효한지에 대한 정보와 캐시된 리소스가 더 이상 유효하지 않게 되는 시점을 더 잘 추정하기 위한 단서 같은 것입니다.

 

 

 

 

 

 

 

728x90
반응형