개요
- http message : start line ⇒ header ⇒ 공백 ⇒ body
- header-field = field-name:(공백)field-value
- 대소문자 구분 없음
용도
- http 전송에 필요한 모든 부가정보를 헤더에 넣는다
- 메세지 바디 내용, 메시지 바디 크기, 압축, 인증, 요청 클라이언트, 서버정보, 새키 정보 등..
- 표준 헤더가 굉장히 많음
- 필요 시 임의의 헤더 추가 가능
분류
과거 1999년 RFC2616
- general - 메시지 전체에 적용되는 정보
- request - 요청을 보낼 때
- response - 응답 정보, 웹브라우저 정보 뭔지, 서버 정보가 뭔지
- entity - 엔티티 바디 정보
http body
- 메시지 본문은 엔티티 본문을 전달하는데 사용된다
- 엔티티 본문은 요청이나 응답에서 실제 전달할 데이터
- 엔티티 헤더는 엔티티 본문의 데이터를 해석할 수 있는 정보 제공
- 데이터 유형, 데이터 길이, 어떤걸로 압축되어 있는지 등..
엔티티와 관련없는 헤더도 있다
최신 RFC723x (개정 후)
- 엔티티(Entity) → 표현(Representation)
- 표현 = 표현 메타데이터 + 표현 데이터
- 메시지 본문을 통해 표현 데이터 전달
- 메시지 본문 = 페이로드
- 표현은 요청이나 응답에서 전달할 실제 데이터
- 표현 헤더는 표현 데이터를 해석할 수 있는 정보를 제공한다
- 표현 헤더는 표현 메타데이터와 페이로드 메시지를 구분해야 한다
표현
표현 리소스를 html으로 전달할거야 / json으로 전달할거야 이거를 json, xml등으로 표현한다
- 표현헤더는 전송, 응답 둘 다 사용한다
- content-type: 표현 데이터의 형식
- content-encoding: 표현 데이터의 압축방식
- content-language: 자연언어
- content-length: 데이터의 길이
Content-Type
- 표현 데이터의 형식
- 바디에 들어가는 내용이 뭐야?
- 예시
-
text/html; charset=utf-8
-
application/json
-
image/png
Content-Encoding
- 표현데이터를 주로 압축할 때 사용
- 서버에서 압축했으면 클라이언트에서는 읽을 때 인코딩 헤더의 정보로 압축 해제
- 예시
Content-Language
Content-Length
- 표현 데이터의 길이
- 바이트 단위
- transfer-encoding(전송코딩, 끊어서 보냄)을 사용하면 안에 내용이 다 들어가 있기 때문에 content-length를 사용하면 안됨
협상(콘텐트 네고시에이션)
- 클라이언트가 선호하는 표현 요청
- 클라이언트가 원하는 표현으로 서버한테 요청하는 것
- 서버: 그래 니가 원하는 대로 만들어줄게
- 협상 헤더는 요청시에만 사용
- Accept: 클라이언트가 선호하는 미디어 타입
- Accept-Charset: 선호하는 문자 인코딩
- Accept-Encoding: 선호하는 압축 인코딩
- Accept-Language: 선호하는 자연언어
Accept-Language
예시1
- 클라이언트 :
- 내가 선호하는 언어는 ko야
- accept-language: ko
- 서버:
예시2
- 한국어 브라우저
- 다중 언어 지원 서버
- 기본 독일어, 영어도 지원
- content-language: de
- 독일어 보내버림!!
- 이때 필요한 것이 협상과 우선순위다
협상과 우선순위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
- ko-KR
- ko
- en-US
- en
협상과 우선순위2
- 구체적인 것이 우선
- Accept: text/, text/plain, text/plain;format=flowed, /*
- text/plain;format=flowed
- text/plain
- text/*
*/*
협상과 우선순위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
1. text/html;level=1 `1`
2. text/html, text/html;level=3 `0.7`
3. image/jpeg `0.5`
4. text/html;level=2 `0.4`
5. text/plain `0.3`
전송 방식
단순 전송
- 예시
- 전송하면 길이를 주는거다
- 단순하게 요청하고 쭉 받는거
압축 전송
- 예시
content-encoding: gzip
- content-length: 521
- 서버에서 데이터를 압축을 해서 보낸다.
- 용량이 굉장히 줄어든다.
- 뭘로 압축되어 있는지 같이 보내줘야 한다.
분할 전송
- 예시
transfer-encoding: **chunked**
- 용량이 큰걸 한번에 보내면 기다려야하는데 분할해서 전송하면 오는대로 바로 표시 할 수 있다
- content-length를 넣으면 안된다
범위 전송
- Range, Content-Range
- 이미지를 받는데 중간에 절반을 받다가 끊겼을 때 처음부터 다시 요청하면 용량이 아까우므로 범위를 지정해서 요청하는 방식
- 예시
일반 정보
http의 정보성 헤더들
From
- 유저 에이전트의 이메일 정보
- 검색 엔진 같은 곳에서 주로 사용
- 요청에서 사용
Referer
- 현재 요청된 페이지의 이전 웹 페이지 주소
- a ⇒ b로 이동할 때 referer: a를 포함해서 요청
- 유입 경로 분석할 때 사용
- 요청에서 사용
User-Agent
- 클라이언트 애플리케이션 정보(웹 브라우저 정보 등등)
- 어떤 종류의 브라우저에서 장애가 발생하는지 파악 가능
- 통계 정보에서 사용
- 요청에서 사용
Server
- 요청을 처리하는 origin 서버의 소프트웨어 정보
- 여러 프록시 서버를 거치게 되는데 나의 요청을 실제로 처리해주는 마지막 서버를 말한다
- 응답에서 사용
Date
특별한 정보
특별한 정보를 제공하는 header들
Host
- 하나의 IP 주소에 여러 도메인이 적용되어 있을 때 구분을 해준다
- 가상 호스트를 통해 여러 도메인을 한번에 처리할 수 있는 서버
- 만약 호스트가 없다면 서버 입장에서는 GET/hello 가 어느 도메인으로 들어가야 하는지 알 수 없다(구분할 수 있는 방법이 없다) = 가상 호스팅
- 그래서 host header 필드를 필수로 넣어주어야 한다
- 요청한 호스트 정보 (도메인)
- 필수값
- 요청에서 사용
- 하나의 IP 주소에 여러 도메인이 적용되어 있을 때
- 요청이 왔을 때 어떤 도메인에 연결되어 있는지 확인해야 함
Location
- 웹 브라우저는
3xx
응답의 결과에 location 헤더가 있으면 location 위치로 자동 이동한다(리다이렉트)
201(created)
- location 값은 요청에 의해 생성된 리소스 uri
3xx
- location 값은 요청을 자동으로 리다이렉션 하기 위한 대상 리소스를 가리킴
Allow
- 허용가능한 http 메서드
405(Method Not Allowed)
오류를 내리면서 응답에 포함해야 함
Retry-After
- 유저 에이전트가 다음 요청을 하기까지 기다려야 하는 시간
503
- 날짜를 표시할 수도 있고 초 단위로 표시할 수도 있다
인증
Authorization
- 클라이언트의 인증정보를 서버에 전달 가능
- 인증 방법마다 value 값이 다 다르다
WWW-Authenticate
- 접근을 했는데 인증이 안됐을 때
- 리소스 접근시 필요한 인증 방법을 정의할 때 사용
401 unauthorized
응답과 함께 사용
401
이 나면 이 헤더와 함께 보내줘야 한다
Reference.