Post

HTTP - 7 HTTP 헤더 1(1)

해당 자료는 인프런 김영한 선생님의 모든 개발자를 위한 HTTP 웹 기본 지식 강의노트입니다.


1. HTTP 헤더 개요

Contnet-Type에는 메시지 바디의 내용, 크기, 압축 등 정보가 들어있습니다.

필요시에는 임의의 헤더 추가가 가능합니다.

과거에는 RFC2616이라는 표준을 사용했는데, 이 표준의 스펙은 다음과 같습니다.

  • General 헤더 : 메시지 전체에 적용되는 정보
  • Request 헤더 : 요청 정보
  • Response 헤더 : 응답 정보
  • Entity 헤더 : 엔티티 바디 정보

  • 메시지 본문은 엔티티 본문을 전달하는 데 사용됩니다.
  • 엔티티 본문은 요청이나 응답에서 전달할 실제의 데이터입니다.
  • 엔티티 헤더는 엔티티 본문의 데이터를 해석할 수 있는 정보를 제공합니다.(데이터 유형, 길이, 정보)

하지만, 위의 스펙은 2014년 RFC7230~7235 등장으로 폐기되었습니다.

엔티티를 표현이라고 부르게 되었습니다.
표현(Representation)은 representation Metadata + Representation Data,
표현 = 표현 메타데이터 + 표현 데이터입니다.

  • 메시지 본문을 통해 표현 데이터을 전달합니다.
  • 메시지 본문을 페이로드(Payload)라고도 불립니다.
  • 표현은 요청이나 응답에서 전달할 실제 데이터이고 Json,HTML 형식 등으로 보낼 수 있습니다.
  • 표현 헤더는 표현 데이터를 해석할 수 있는 정보를 제공합니다.(유형, 길이, 정보 등)

2. 표현

  • Content-Type : 표현 데이터의 형식 (Json,HTML,png 등)

  • Content-Encoding : 표현 데이터의 압축 방식(보통 데이터를 전달하는 쪽에서 압축 후 인코딩 헤더 추가하고 데이터를 읽는 쪽에서 인코딩 헤더의 정보를 가지고 압축을 해제합니다.)
    gzip, deflate, identity(압축 해제 안함)

  • Content-Language

표현 데이터의 자연 언어를 표현합니다.
예를 들어서 한국에서 영어 사이트를 들어가면 서버에서 한국번역 여부를 물어보는 처리에 사용될 수 있습니다.

  • Content-Length

표현 데이터의 길이입니다.
Transfer-Encoding(전송 코딩)을 사용하면 Content-Length를 사용하면 안됩니다. 전송 코딩 내부에 이미 정의되어있기 때문입니다.


3. 협상(콘텐츠 네고시에이션)

클라이언트가 선호하는 표현방식을 클라이언트가 요청하는 방식을 말합니다.

  • Accept : 클라이언트가 선호하는 미디어 타입 전달
  • Accept-Charset : 클라이언트가 선호하는 문자 인코딩
  • Accept-Encoding : 클라이언트가 선호하는 압축 인코딩
  • Accept-Language : 클라이언트가 선호하는 자연 언어

협상 헤더는 요청시에만 사용합니다.

위의 예시와 같이 ko라는 언어를 요청할 때 서버에서 지원하는 언어면 해당 언어로 페이지를 뿌려주는 역할을 합니다.

헤더에서 지원하는 기능입니다.

만약 서버에서 지원하지 않는 언어를 요청했을 때에는 다음과 같은 우선순위를 따릅니다.

  • ko-KR 은 1이 생략된 것입니다.
  • ko;q=0.9는 ko라는 언어에 대해 0.9의 우선순위를 갖습니다.
  • en-US;q=0.8 또한 마찬가지입니다.

구글에 임창정을 검색했을 때 나오는 네트워크 도구입니다.

헤더쪽을 보면 Accept 헤더가 있는걸 볼 수 있습니다.

Accept는 또한 구체적인 것을 우선순위로 갖습니다.

  • text/plain;format=flowed 가 우선순위 1번째
  • text/plain이 우선순위 2번째
  • text/이 우선순위 3번째 (은 아무 파일 디렉터리 등입니다.)
  • */ * 우선순위 4번째

또한 구체적인 것을 기준으로 미디어 타입을 맞춥니다.

text/plain은 위의 헤더에서 명시가 되지 않았지만 text/*;q=0.3을 따라 0.3의 우선순위를 갖습니다.


4. 전송 방식

전송 방식에는 4가지가 있습니다.

  • 단순 전송(Content-Length)
  • 압축 전송(Content-Encoding)
  • 분할 전송(Transfer-Encoding)
  • 범위 전송(Range,Content-Range)

단순 전송

클라이언트에서 요청을 보내고 서버에서 응답을할 때 해당 컨텐츠에 대한 길이를 알 때 길이를 보냅니다.
한번에 처리하는 방식입니다.

압축 전송

서버에서 압축을해서 컨텐츠를 보낼 때 Content-Encoding을 추가로 넣어줘서 압축 정보와 길이를 보냅니다.

분할 전송

분할해서 정보를 전달합니다. 분할해서 보내기 때문에 응답이 빠르고 Content-Length를 알 수 없어서 Content-Length를 포함하면 안됩니다.

범위 전송

범위를 정해서 받을 수 있습니다. 실제 전송된 데이터의 길이를 Content-Length를 포함해서 전달하면 됩니다.(예제에서는 써있지 않습니다.)


This post is licensed under CC BY 4.0 by the author.