들어가며

  • 이전까지 응답에 대해 알아보았다.
  • 이번에는 HTTP 메시지에 있는 HTTP 헤더에 대해 좀 더 심화적으로 알아본다.

 

 

HTTP 헤더

  • HTTP 헤더는 HTTP 전송에 필요한 모든 부가정보를 가지고 있는 부분을 말한다.
    • 여기서 부가정보란 말 그대로 모든 부가정보로 바디의 내용, 길이, 크기, 압축 방법, 인증, 요청 클라이언트 정보, 서버 정보, 캐시 관련 정보, 쿠키 정보 등이 있다.
  • 일반적으로 다음과 같은 메시지 Form을 다룬다.
    • header-field =field-name":" OWS field-value OWS (OWS는 띄워쓰기 허용이란 의미이다.)
  • 헤더 필드는 만약 필요하다면 임의의 헤더 필드를 만들어 HTTP 메시지에 추가하여 전송할 수 있다.

 

 

 

엔티티(Entity)와 표현(Representation)

  • Entity는 2014년 이전까지 사용하던 HTTP 메시지 데이터를 나타내는 용어였다.
  • 하지만 2014년 이후로 새로운 표준이 제정되면서 엔티티의 개념이 폐기되고 표현(Representation)이라는 개념으로 바뀌었다.
    • 표현은 표현 메타데이터와 표현 데이터로 이루어지며 자세한 내용은 HTTP 메시지 구조와 함께 보면서 설명하겠다.

  • 위에서 보듯이 메시지 본문을 통해 표현 데이터를 전달한다. 이때 메시지 본문을 페이로드(payload)라고도 한다.
  • 표현은 어떠한 요청 또는 응답에서 상호 전달하려고 하는 실제 데이터를 의미한다.
  • 표현이 표현 메타데이터와 표현 데이터로 이루어진다고 위에서 설명하였다. 표현 헤더라고 되어있는 해당 영역은 표현 데이터를 해석할 수 있는 정보들을 제공한다. 즉 표현 데이터를 나타내는 데이터이다.
    • 이때 이 데이터의 데이터라는 개념을 소위 메타데이터(Metadata)라고 한다. 표현 헤더는 이 표현 메타데이터라는 부분과 페이로드 메시지라는 부분이 함께 존재한다.
  • 이제 표현 헤더에 대해 알아보자

 

 

표현

  • 표현 데이터의 정보를 나타내는 헤더들은 다음과 같이 4개가 존재한다.
    • Content-Type
    • Content-Encoding
    • Content-Language
    • Content-Length

Content-Type

  • Content-Type 헤더는 표현 데이터가 어떤 형식인지를 나타낸다.
  • 만약 text/html; charset=utf-8이라면 넘어오는 표현 데이터가 html문서이며 해당 문서의 문자 인코딩이 UTF-8로 되어 있다는 것을 말한다.
  • 또다른 예시로 application/json으로 되어 있다면 넘어오는 표현 데이터가 json 데이터라는 것을 의미한다.
  • image/png로 되어 있다면 넘어오는 표현 데이터가 png 형식의 이미지 파일이라는 것을 의미한다.

Content-Encoding

  • 해당 헤더는 표현 데이터 인코딩 형식을 나타낸다.
  • 표현 데이터를 압축하기 위해 사용된다. 데이터를 전달하는 측에서 표현 데이터가 너무 클 때 압축을 수행하고, 이후 인코딩 헤더를 추가한다.
  • 이를 통해 데이터를 수신받는 측에서 인코딩 헤더를 사용하여 어떤 압축 방식을 사용했는지 알 수 있고, 이를 토대로 압축을 해제하여 원 데이터를 가져갈 수 있다.
    • 보통 Content-Encoding: gzip 또는 Content-Encoding: deflate 등으로 사용한다.

Content-Language

  • 해당 헤더는 표현 데이터에 포함되어 있는 자연 언어 정보를 나타내려고 할 때 사용된다.
  • 만약 한국어가 포함된 html문서가 넘어온다면 Content-Language: ko로 표현하는 식이다.

Content-Length

  • 해당 헤더는 표현 데이터가 가지는 길이를 의미한다.
  • 바이트 단위로 되어있으며 표현 데이터(메시지 바디 부분)의 길이를 표현한다.

 

 

 

HTTP 헤더와 협상(Content Negotiation)

  • 협상(Content-Negotiation)이란 클라이언트가 어떠한 리소스를 요청할 때 클라이언트가 선호하는 방식으로 리소스를 전달해 달라고 서버에 전달하는 것이다.
  • 서버는 협상과 관련된 데이터를 수신받으면 클라이언트가 선호하는 방식으로 전송하도록 최대한 노력한다.
  • 이 협상과 관련된 헤더는 4가지가 있는데 각각 다음과 같다.
    • Accept
    • Accept-Charset
    • Accept-Encoding
    • Accept-Language
  • 협상 헤더는 클라이언트가 서버에게 해당 방식으로 리소스를 줬으면 좋겠다라는 것을 나타내기 위해 사용하기 때문에 요청시에만 사용되는 헤더들이다.

Accept

  • Accept는 클라이언트가 선호하는 미디어 타입을 전달해달라고 서버에 요청할 때 사용되는 헤더이다. 만약 Accept에 text/html이 있다면 클라이언트가 html 문서를 선호한다는 뜻이다.
  • 서버는 해당 요청을 수신받고 html이 존재한다면 곧바로 html 문서를 클라이언트에게 반환할 것이다.

Accept-Charset

  • Accept-Charset은 클라이언트가 선호하는 문자 인코딩 타입을 의미한다. 만약 Accept-Charset: UTF-8로 되어 있다면 UTF-8로 인코딩하여 표현 데이터를 반환할 것이다.

Accept-Encoding

  • Accept-Encoding은 클라이언트가 선호하는 압축 인코딩을 의미한다. Accept-Encoding: gzip 으로 되어있다면 서버는 압축을 수행하여 전송할 때 gzip을 사용하여 압축하고 전송할 것이다.
  • Content-Encoding: gzip으로 넣어 보내는것은 물론이다.

Accept-Language

  • Accept-Language는 클라이언트가 선호하는 자연 언어를 의미한다. Accept-Language: ko로 되어 있다면 한국어로 되어 있는 데이터를 우선적으로 전송할 것이다.

 

 

 

협상과 우선순위

  • 만약 한국어를 맨 먼저 받아보고 싶은데 한국어가 없다면 어떻게 해야할까?
  • 여러 개의 우선순위를 지정하여 협상을 수행하고 싶다면 Quality Values라는 우선순위 값을 사용하여 우선순위를 설정할 수 있다.
  • Quality Values는 q로 나타내며 0~1 사이의 실수값으로 나타낸다. 1에 가까울수록 높은 우선순위를 가지며 생략하면 1을 가진다.
    • 만약 Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7 로 헤더가 설정되었다면 우선순위는 다음과 같다.
      • ko-KR
      • ko
      • en-US
      • en
    • 이는 서버가 ko-KR로 되어 있는 데이터를 가지고 있지 않으면 그 다음 우선순위인 ko로, en-US로 단계적으로 우선순위를 따라 자연 언어를 확인하는 과정을 거친 뒤에 리소스를 반환하도록 한다.
  • Accept 헤더에 대해서도 동일하게 우선순위를 지정할 수 있다.
  • 이때 우선순위를 q를 통해 지정해주지 않아도, 구체적으로 적힌 부분들이 우선되는데 다음의 예시를 보자.
    • Accept: text/*,text/plain,text/plain;format=flowed,*/*
    • 이 경우 우선순위는 다음과 같이 설정된다.
      • text/plain;format=flowed
      • text/plain
      • text/*
      • */*
    • 이때 *는 무엇이 들어와도 상관없다는 것으로 구체적인게 아닌 추상적인 것으로 생각하면 된다.
    • 즉 상세하게 적혀 있을수록 우선순위는 높아진다.
    • 이렇게 설정하면 서버 내부에서 미디어 타입을 선정할 때 우선순위에 맞추어 클라이언트에게 최대한 알맞는 미디어 타입과 언어를 보낼 수 있을 것이다.
복사했습니다!