주니어 개발자 성장기

(22.11.14) HTTP(6) - 헤더(1) 본문

Web

(22.11.14) HTTP(6) - 헤더(1)

Junpyo Lee 2022. 11. 14. 10:50

HTTP 헤더 개요

헤더의 형식은 다음과 같다

field-name ":" OWS field-value OWS   (OWS: 띄어쓰기 허용)

또한, field-name은 대소문자 구분이 없다.

 

용도

  • HTTP 전송에 필요한 모든 부가정보
    • 예) 메시지 바디의 내용, 메시지 바디의 크기, 압축, 인증, 요청 클라이언트, 서버 정보, 캐시 관리 정보, etc
  • 표준 헤더가 너무 많다.
  • 필요시 임의의 헤더도 추가 가능하다.

 

RFC723x 변화

  • 2014년 새로운 헤더 표준인 RFC7230 스펙이 제정된다.
  • 엔티티(Entity) -> 표현(Representation) 변경
  • Representation = Representation Metadata + Representation Data
    • 표현 = 표현 메타데이터 + 표현 데이터
    • 여기서 Representation의 R이 REST API의 R이다.

HTTP BODY

  • 메시지 본문(message body)을 통해 표현 데이터 전달
  • 메시지 본문 = 페이로드(payload)
  • 표현은 요청이나 응답에서 전달할 실제 데이터
  • 표현 헤더는 표현 데이터를 해석할 수 있는 정보 제공
    • 데이터 유형(html, json), 데이터 길이, 압축 정보 등
  • 참고: 표현 헤더는 표현 메타데이터와, 페이로드 메시지를 구분해야 하지만, 복잡해서 생략한다.

 

'entity'에서 '표현(representation)'으로 변경한 이유는 한 가지 리소스는 데이터 유형, 압축 등 여러가지 방식으로 나타내질 수(표현될 수) 있기 때문에 이를 명확하게 하기 위함이다.

 

 

표현

  • Content-Type: 표현 데이터의 형식
  • Content-Encoding: 표현 데이터의 압축 방식
  • Content-Language: 표현 데이터의 자연 언어
  • Content-Length: 표현 데이터의 길이
    • Content-Length는 엄밀히 말하면 표현 헤더라기보다 전체 메시지에 대한 것이므로 페이로드지만 편의상 표현 헤더라고 한다.
*표현 헤더는 전송, 응답 둘 다 사용한다!

 

 

Content-Type

표현 데이터의 형식 설명

  • 미디어 타입, 문자 인코딩
    • text/html;charset=utf-8
    • application/json (* json은 기본이 utf-8이다.)
    • image/png

Content-Encoding

표현 데이터의 인코딩 형식

  • 표현 데이터를 압축하기 위해 사용
  • 데이터를 전달하는 곳에서 압축 후 인코딩 헤더 추가
  • 데이터를 읽는 쪽에서 인코딩 헤더의 정보로 합축 해제
    • gzip
    • deflate
    • identity <- 압축을 안한다는 의미

Content-Language

표현 데이터의 자연 언어

  • 표현 데이터의 자연 언어를 표현
    • ko
    • en
    • en-US

Content-Length

표현 데이터의 길이

  • 바이트 단위
  • Transfer-Encoding(전송 코딩)을 사용하면 Content-Length를 사용하면 안된다!

 

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

클라이언트가 선호하는 표현 요청 <- 요청시에만 사용!

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

 

협상과 우선순위1

Quality Values(q)

  • Quality Values(q) 값 사용
  • 0~1 , 클수록 높은 우선순위
  • 생략하면 1
  • Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
    1. ko-KR;q=1 (q생략)
    2. ko;q=0.9
    3. en-US;q=0.8
    4. en:q=0.7

 

협상과 우선순위2

  • 구체적인 것이 우선한다.
  • Accept: text/*, text/plain, text/plain:format=flowed, */*
    1. text/plain;format=flowed
    2. text/plain
    3. text/*
    4. */*

협상과 우선순위3

  • 구체적인 것을 기준으로 미디어 타입을 맞춘다.
  • Accept: text/*q=0.3, text/html;q=0.7, text/html;level=1, text/html;level=2;q=0.4, */*;q=0.5
Media Type Quality
text/html;level=1 1
text/html 0.7
text/plain 0.3
image/jpeg 0.5
text/html;level=2 0.4
text/html;level=3 0.7

 

전송 방식 설명

  • 단순 전송
    • Content-Length
  • 압축 전송
    • Content-Encoding
  • 분할 전송
    • Transfer-Encoding
    • ex) Transfer-Encoding: chunked

분할 전송의 Body 예시

5

Hello

5

World

0

\r\n

  • 각 숫자는 분할돼 전송되는 바이트를 의미한다.
  • 실제로 Body가 한 번에 보내지지 않고 분할되어 보내진다.
  • 마지막의 0 \r\n은 종료를 의미
  • 분할 전송에서는 Content-Length 헤더가 포함이 되지 않는다

 

  • 범위 전송
    • Range, Content-Range 
    •  Range: bytes=1001-2000
    • 바이트로 된 컨텐츠의 범위를 지정해서 받는 것
    • 분할해서 요청, 응답할 경우 사용 (실패 시 처음부터 다시 할 수는 없기 때문에)

 

 

 

출처: 인프런, 모든 개발자를 위한 HTTP 웹 기본 지식, 김영한

'Web' 카테고리의 다른 글

(22.11.21) HTTP(7) - 헤더(3)  (0) 2022.11.21
(22.11.14) HTTP(6) - 헤더(2)  (0) 2022.11.14
(22.10.29)HTTP(5) - 상태코드  (0) 2022.10.29
(22.10.26) HTTP(3) - 메서드 활용  (0) 2022.10.27
(22.10.04) HTTP(2) - TCP, UDP  (0) 2022.10.04