들어가며

  • 이전 포스트에서 HTTP헤더와 클라이언트와 서버가 상호간 보내려고 하는 데이터를 표현(Representation)으로 정의한 것과, 이 표현 데이터의 정보를 기록한 표현 헤더, 클라이언트가 선호하는 Content-Type이나 Content-Language 등을 사용한 협상(Content Negotiation)에 대해 알아보았다.
  • 이번 포스트에서는 전송 방식에 대한 헤더와 여러 헤더 정보에 대해 알아보도록 한다.

 

 

 

전송 방식

  • HTTP 메시지를 전송하는 방식에는 4개의 방식이 존재한다.
    • 단순 전송
    • 압축 전송
    • 분할 전송
    • 범위 전송
  • 단순 전송의 경우 일반적인 전송을 말하며 이때 표현 데이터의 길이를 나타내는 Content-Length 헤더가 들어간다.
  • 압축 전송의 경우 표현 데이터가 압축된 데이터로 들어가는 것이다. 해당 데이터를 받는 측에서는 어떠한 표시 없이는 해당 데이터가 압축된 데이터인지를 알 수 없기 때문에 이를 표시하는 Content-Encoding 헤더를 사용해야 한다.
  • 분할 전송은 서버에서 데이터를 분할하여 전송한다. 이 분할 전송이 어떤 방식인지를 보면 다음과 같다.
    • 우리가 hello world 라는 데이터를 분할해서 보내려고 한다. 그렇다면 이렇게 보낼 수 있다.
      • 먼저 hello 라는 데이터를 만든 뒤에 전송한다.
      • 이후 world라는 데이터를 만든 뒤에 전송한다.
      • 이후 메시지의 끝이라는 의미로 \r\n을 전송한다.
    • 이렇게 각 부분으로 나누어 전송하는 방식을 분할 전송이라고 한다.
  • 이때 역시 데이터를 수신받는 측에서는 데이터가 분할 전송된 데이터인지를 알 수 없기 때문에 헤더에 Transfer-Encoding: chunked라는 것으로 분할 전송을 수행하고 있다는 것을 알려 주어야 한다.
  • 범위 전송은 클라이언트에서 서버로 특정한 범위를 요청하면, 서버가 해당 요청을 받고 데이터의 특정 범위만큼만 때서 전송하는 방식이다.
    • 이를 위해서는 클라이언트에서 요청 메시지를 보낼 때 Range 헤더를 사용하여 범위를 정의해주어야 한다.
    • 서버는 해당 요청을 받은 뒤 응답으로 헤더에 Content-Range를 넣어 요청에서 보낸 범위를 포함시킨다. 만약 범위가 데이터의 끝보다 크다면 해당 데이터의 끝 길이로 끝 범위를 바꾸어 전송한다.

 

 

 

일반 헤더 정보

  • 일반 헤더 정보는 5개로 나뉘어진다. 종류는 아래와 같다.
    • Form
    • Referer
    • User-Agent
    • Server
    • Date

Form

  • Form 헤더는 유저 에이전트의 이메일 정보를 나타낸다.
  • 일반적으로 잘 사용되지 않는 헤더이며 검색 엔진같은 곳에서 주로 사용되는 헤더이다.

Referer

  • Referer는 현재 요청된 페이지의 이전 웹 페이지 주소를 보관하는 헤더이다.
  • 보통 A -> B로 이동하는 경우 B를 요청할 때 Referer: A를 포함하여 요청한다.(요청 메시지에서 사용된다.)
  • 이를 어디에 활용하는가라는 생각을 할 수 있는데 보통 유입 경로를 유추할 때 사용할 수 있다.
    • 예를 들어 티스토리 페이지를 방문할 때 직전 사이트가 구글 검색 페이지로 URL이 지정되어 있었다면 티스토리 사이트에서 Referer를 통하여 구글 검색을 통해 해당 페이지를 방문하였다고 유추할 수 있을 것이다.

User-Agent

  • User-Agent 헤더는 유저 에이전트의 어플리케이션 정보를 나타낸다. 클라이언트의 어플리케이션 정보를 나타내며 보통 웹 브라우저의 정보, 운영체제등을 포함한다.
  • 이를 통하여 어떤 종류의 브라우저에서 장애가 발생하는지를 확인할 수 있으며 요청에서 사용된다.

Server

  • Server 헤더는 요청을 받아 처리하는 ORIGIN 서버의 소프트웨어 정보를 나타낸다.
  • 만약 서버가 아파치를 사용하고 있다면 Apache로 헤더가 설정될 것이고, ngix를 사용하면 ngix로 표기될 것이다.
  • 서버 정보를 나타내고 있기 때문에 응답에서 사용되는 헤더이다.

Date

  • Date는 메시지가 발생한 날짜와 시간을 의미한다. 해당 HTTP 메시지가 생성된 시간을 기입하며 응답에서 사용된다.

 

 

 

특수 정보

  • 특수한 정보들을 기입하는 헤더들은 4개가 있다.
    • Host
    • Location
    • Allow
    • Retry-After

Host

  • Host는 요청한 호스트 정보를 표시한다. 요청 메시지에서 사용되며 필수적인 헤더 값이다.
  • 이 헤더가 필요할 때는 하나의 서버가 여러 개의 도메인을 처리해야 하는 상황에서 볼 수 있다.
    • 하나의 서버에 가상 호스트를 통해 여러 개의 도메인을 처리할 수 있다고 가정해보자. 즉 서버 하나에 aaa.com, bbb.com, ccc.com이 존재한다고 가정해 보자.
    • 이때 Host는 클라이언트에서 요청하는 도메인이 어딘지를 특정하여 찾기가 가능하도록 해주는 역할을 수행한다. 만약 Host가 없다면 어떤 도메인으로 가야하는지를 알 수 없기 때문에 문제가 발생할 것이다.

Location

  • Location 헤더는 페이지 리다이렉션이 수행될 때 이동해야 하는 위치를 지정해주는 역할을 하는 헤더이다.
  • 리다이렉션이 아니어도 201 - Created 응답 코드에서도 사용될 수 있는데 요청에 의해 생성된 리소스의 URI를 담는데도 사용될 수 있다.
  • 리다이렉션에서의 Location은 자동으로 리다이렉션하기 위한 대상 리소스를 가리키는데 사용된다.

Allow

  • Allow는 허용 가능한 HTTP 메서드를 나타내는데 사용되는 헤더이다.
  • 해당 헤더는 보통 405 - Method Not Allowed 상태코드가 발생할 때 같이 포함되어야 하며 해당 URI로 허용될 수 있는 HTTP 메서드들을 기입한다.

Retry-After

  • Retry-After는 503 Service Unavailable 응답 코드가 반환되는 상태에서 서비스가 언제까지 불능인지 클라이언트에게 알리기 위해 사용되는 헤더이다.
  • 날짜로 표기할 수 있으며 초 단위로도 표기가 가능하다.
복사했습니다!