HTTP 헤더
HTTP 헤더는 HTTP 전송에 필요한 모든 부가정보(메시지 바디의 내용, 메시지 바디의 크기, 압축, 인증, 요청 클라이언트, 서버 정보, 캐시 관리 정보...)를 포함한다. 표준헤더의 종류는 상당히 많으며 필요시 임의의 헤더를 추가 가능하다.
HTTP 헤더 형식
Content-Type: application/json
header-field = field-name":" OWS field-value OWS (OWS:띄어쓰기 허용)
HTTP 헤더 분류 - RFC2616(과거)
과거에는 HTTP 헤더가 크게 다음과 같이 분리되어 있었다.
- General 헤더: 메시지 전체에 적용되는 정보
- ex) Connection: close
- Request 헤더: 요청 정보
- ex) User-Agent: Mozilla/5.0 (Macintosh; ..)[웹 브라우저 정보.. 등]
- Response 헤더: 응답 정보
- ex) Server: Apache (응답하는 서버 정보)
- Entity 헤더: 엔티티 바디 정보, 실제메시지 바디에 대한 정보들이 들어있다.
- ex) Content-Type: text/html, Content-Length: 3423
HTTP Body - RFC2616(과거)
과거에는 메시지 본문(message body)은 엔티티 본문(entity body)을 전달하는데 사용한다고 정의되어 있다. 엔티티 본문이란 요청이나 응답에서 전달할 실제 데이터를 말하며 엔티티 헤더는 엔티티 본문의 데이터를 해석할 수 있는 정보를 제공한다.(데이터 유형, 데이터 길이, 압축 정보.. 등)
HTTP 표준의 변화 - RFC2616(1999) -> RFC7230~7235(2014)
위에서 설명했던 RFC2616 버전의 HTTP 스펙은 RFC7230~7235의 등장으로 폐기되었다. 주요 스펙의 변경점으로는 엔티티 바디라는 개념이 사라지게 된다. 이에 따라서 엔티티(Entity)라는 개념은 표현(Representation)으로 대체 되었다. Representation은 표현 메타 데이터(Representation Metadata)와 표현 데이터(Representation Data)를 합쳐놓은 개념이다.
RFC7230~7235(2014)
현재는 엔티티라는 개념이 사라지고 메시지 본문(message body)을 통해 표현 데이터를 전달하게 된다. 메시지 본문은 페이로드(payload)라고 불리기도 한다. 표현은 요청이나 응답에서 전달할 실제 데이터를 말하며 표현 헤더는 표현 데이터를 해석할 수 있는 데이터를 제공한다. 즉, 데이터 유형(html, json), 데이터 길이, 압축 정보 등을 제공하게 된다. 세부적으로 표현 헤더는 표현 메터데이터와 페이로드 메시지를 구분해야 하지만, 복잡해지기 때문에 생략을 하게 된다.
웹 페이지 같은 html 문서를 서버에게서 받을 수도 있고 api 서버에서 JSON 형태의 데이터를 받을 수도 있는데 이를 표현(Representation)이라는 개념으로 정의하였다.
표현(Representation)
표현은 HTTP 통신에서 바이너리 데이터에 대해 어떠한 방식으로 표현한다는 뜻이다. 즉, 들어오는 데이터의 정보를 표현하고 데이터 내용을 알맞게 해석하는 것을 말한다. 다음은 표현 데이터에 대한 정보들을 나타내는 표현 헤더들이다.
- Content-Type: 표현 데이터의 형식
- 미디어 타입, 문자 인코딩
- text/html;charset=UTF-8, application/json, 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: 클라이언트가 선호하는 자연 언어
다중 언어(영어, 한국어)를 지원하는 서버에 요청하는 경우를 생각해보자. `Accept-Language` 헤더에 아무런 설정없이 클라이언트가 요청을 보내게 되면 기본적으로 영어를 제공하는 서버는 영어로 된 웹페이지를 보내게 된다. 하지만, `Accept-Language: ko`라는 헤더를 사용하게 되면 서버는 클라이언트가 `한국어 웹페이지를 요청하는 구나`라고 인식할 수 있고 한국어 웹페이지를 받을 수 있을 것이다.
하지만, 실무에는 복잡한 경우의 수가 있다. 만약 다중 언어를 지원하지만 기본값으로는 de 독일어를 지원하고, en 영어를 추가로 지원하지만 ko 한국어를 지원하지 않는 서버라면 어떻게 될까? 한국어를 사용하는 웹 브라우저는 `Accept-Language: ko`라는 헤더를 사용하여 요청을 보내지만 서버에서는 이에 대한 정보를 처리할 수 없으므로 독일어가 기본으로 된 웹 페이지를 응답할 것으로 예상된다. 하지만 아무래도 독일어로 된 페이지보다는 영어로 된 페이지가 더 편할 것이다. 이런 경우는 어떻게 해야할까?
협상과 우선순위 - Quality Values(q)
우선 순위 (Quality Values) 설정
위와 같은 복잡한 경우를 위해 HTTP 스펙에는 우선순위라는 개념이 있다. 협상 헤더에 각 언어별로 우선순위 값을 설정하여 해결할 수 있다.
예시
GET /event
Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
위와 같이 `Accept-Language` 헤더에 q라는 우선순위 값을 지정하여 보내면 우선순위에 따라 표현 데이터를 알맞게 받을 수 있다. 자세히 설명하자면 ko-KR 자연 언어는 선호도가 1이므로 생략이 되며, ko는 0.9, en-US는 0.8 이런 식으로 우선순위를 함께 작성하고 콤파(,)를 통하여 구분하여 작성하면 된다.
만약 위에서 설명했던 독일어가 기본값인 서버의 경우에도 en의 우선순위가 0.7로 가장 높으므로 de 독일어를 제치고 en 자연 언어로 표현된 데이터를 받을 수 있게 된다.
우선 순위 (Quality Values)의 상세 규칙
- 우선 순위를 숫자로 설정할 수 있지만 이외에도 다른 규칙이 있는데 구체적인 것이 우선된다. 만약 다음과 같은 헤더가 있다고 생각해보자.
- Accept: text/*, text/plain, text/plain;format=flowed, */*
- text/plain;format=flowed
- text/plain
- text/*
- */*
- 위와같이 구체적인 설정이 먼저 우선된다.
- Accept: text/*, text/plain, text/plain;format=flowed, */*
- 구체적인 것을 기준으로 미디어 타입을 맞춘다.
- Accept: text/*;q=0.3, text/html;q=0.7, text/html;level=1, text/html;level=2;q=0.4, */*;q=0.5
- 세부적인 미디어 타입이 왔을 때는 그에 맞추어 응답해주면 된다.
- text/html;level=1 - 1
- text/html - 0.7
- text/plain - 0.3(text/*이 존재하므로)
- image/jpeg - 0.5(*/*이 존재하므로)
- text/html;level=2 - 0.4
- text/html;level=3 - 0.7(level=3에 대한 설정은 없지만 text/html이 0.7 이므로)
'노트 정리 > 모든 개발자를 위한 HTTP 웹' 카테고리의 다른 글
[HTTP 웹] 9. HTTP 헤더 - 캐시와 조건부 요청 (0) | 2022.11.01 |
---|---|
[HTTP 웹] 8. HTTP 헤더 - 옵션 종류 (0) | 2022.10.31 |
[HTTP 웹] 6. HTTP 상태 코드 (0) | 2022.10.29 |
[HTTP 웹] 5. HTTP 메서드 활용 (0) | 2022.10.28 |
[HTTP 웹] 4. HTTP 메서드 (0) | 2022.10.27 |