HTTP 헤더
HTTP헤더에는 수 많은 정보들이 들어간다. 요청헤더에는 클라이언트가 요청하는 내용의 헤더들, 응답헤더에는 서버에서 보내는 내용에 대한 헤더들이 들어있다.
표현
특정 리소스를 어떤 방식으로 전달할 것인지에 대한 내용을 담고있다.
- Content-Type: 표현 데이터의 형식
- Content-Encoding: 표현 데이터의 압축 방식
- Content-Lauguage: 표현 데이터의 자연 언어
- Content-Length: 표현 데이터의 길이
표현 헤더는 요청헤더, 응답헤더 둘 다 사용 가능하다.
(1) Content-Type
바디에있는 데이터의 내용이 어떤것인지에 따라서 미디어 타입, 문자 인코딩 등의 데이터의 형식을 알려준다.
- text/html;charset=utf-8
- application/json
- 기본이 utf-8 인코딩이다.
- image/png
등의 형식으로 나타난다.
(2) Content-Encoding
서버에서 응답 데이터를 보낼 때 압축을 해서 보내게 되는데 어떤 형식으로 압축했는지를 알려준다.
- gzip
- deflate
- identity
등의 형식이 있고 클라이언트가 압축을 풀어서 데이터를 보여주는 방식으로 사용한다.
(3) Content-Lauguage
표현 데이터의 자연 언어를 포현한다.
응답 데이터에 한글이 들어있다면 ko, 영어가 들어있다면 en등으로 표현할 수 있다.
이 경우에는 전송된 언어에 따라서 전체 번역을 하는 등의 작업을 클라이언트에서 언어형식을 받아서 진행할 수 있다.
(4) Content-Length
표현 데이터의 길이이며 바이트 단위로 표현한다.
Transfer-Encoding(전송 코딩)을 사용하면 Content-Length를 사용하면 안된다.
협상(콘텐츠 네고시에이션)
클라이언트가 서버에 본인이 원하는 방식으로 응답해달라고 요청할 수 있다.
- Accept: 클라이언트가 선호하는 미디어 타입 전달
- Accept-Charset: 클라어이언트가 선호하는 문자 인코딩 타입
- Accept-Encoding: 클라이언트가 선호하는 압축 인코딩
- Accept-Language: 클라이언트가 선호하는 자연 언어
협상은 클라이언트가 요청시에만 적용되며 서버에서 요청한 방식으로 응답 가능한 최대한의 응답은 하지만 불가능할 경우 서버가 가능한 방식으로 응답한다.
클라이언트는 협상을 적용하여서 요청할 때 원하는 것들을 우선순위를 정해서 요청할 수도 있다. 이것을 협상과 우선순위라고해서 Quallity Values(q)라고 한다.
협상과 우선순위를 같이해서 몇 가지 알아보자.
(1) Accept
서버가 응답데이터를 줄 때 어떤 방식으로 받기를 원하는지를 작성한다.
- Accept: text/*, text/plain, text/plain;format=flowed, \*/\*
이와같이 작성 할 수 있고 여기서도 우선순위가 있다.
위의 예시에는 총 4가지의 방식이 담겨있는데 여기에는 가장 구체적인 순서대로 우선순위를 가진다.
- text/plain;format=flowed
- text/plain
- text/*
- \*/\*
위와 같은 우선순위가 형성될 수 있다.
이제 서버는 이 헤더를 받아서 서버가 가능한 요청대로 응답해준다.
(2) Accept-Language
클라이언트가 한국어를 원해서 한국어를 요청했을 때 서버에서 한국어를 지원한다면 응답 데이터를 한국어로 보내준다.
그런데 만약 서버에서 한국어를 지원하지 않는다면 어떻게 될까?
서버에서 지원하는 언어가 독일어(de), 영어(en)를 지원하는 상황이고 독일어가 기본언어인 상태라면 한국어(ko)요청이 들어왔을 때 한국어를 지원하지 않기 때문에 한국어로 응답해 줄 수가 없다. 이런 경우에 클라이언트가 요청한 언어들을 확인하고 요청한 언어를 서버에서 지원하면 그 언어로 응답해준다.
이 경우에도 우선순위를 설정할 수 있다
클라이언트가 요청한 언어가 여러개일 경우 가장 필요한 언어로 응답을 해야할 것이다.
- Accept-Language: ko-KR, ko;q=0.9, en-US;q=0.8, en;q=0.7
먼저 우선순위는 0~1 사이의 숫자로 지정한다. 1과 가까울수록 우선순위가 크다는 것이고 1은 생략하여 표현한다. 표현은 q=0.9와 같이 우선순위를 표현한다.
위의 요청을 보면 우선순위가 ko-KR, ko, en-US, en 의 순서로 나타날 수 있다.
이렇게 우선순위를 부여해서 요청하면 서버가 한글지원이 안되더라도 독일어가 아니라 영어로 받아서 볼 수가 있다.
결국 협상(Accept)에서는 클라이언트에서 원하는 방식의 요청과 우선순위를 정해주면 서버에서는 가능하다면 요청대로 응답하고 여건이 안 될 경우에는 서버 자체적인 규율대로 응답이 나갈 것이다.
전송방식
서버에서 클라이언트로 데이터를 전송하는 방식으로는 4가지가 있다.
- 단순 전송
- 압축 전송
- 분할 전송
- 범위 전송
(1) 단순 전송
어떠한 것도 하지않고 원본 그대로를 전송한다. Content-Length를 정확히 알고있어야한다.
(2) 압축 전송
gzip등의 방식으로 데이터를 압축해서 전송한다. 실제로 용량이 절반이상까지 줄어드는 경우가 많다.
응답 헤더에 Content-Encoding: gzip 처럼 어떤 형식으로 압축했는지를 표기해준다.
(3) 분할 전송
데이터를 여러개로 쪼개서 전송한다. 이 경우에는 클라이언트가 먼저 받은 데이터를 먼저 화면에 보여줄 수 있게 된다.
데이터가 쪼개서 전송되서 전체 길이를 예측할 수가 없기 때문에 Content-Length를 표기하지 않는다.
응답헤더에 Transfer-Encoding: chunked 라고 표기해준다.
(4) 범위 전송
서버가 데이터를 보내는 중에 연결이 끊겼을 경우 클라이언트가 처음부터 다시 요청하는 것이 아니라 받지 못한부분부터 요청을 할 수 있다.
Content-Range: bytes 1001-2000 / 2000 등으로 표기한다.
기타 정보
엄청 중요하게 다루지는 않지만 여러정보를 담고있는 헤더들이다.
(1) referer
이전 사이트의 URL을 담고있다. 만약 내가 네이버에서 http를 검색한 후 구글로 들어가면 referer에 네이버의 URL이 입력된다.
실제로도 자주 사용하는 헤더이다.
(2) User-Agent
클라이언트의 애플리케이션 정보 즉 웹 브라우저의 정보를 담고있다. 익스플로러인지 크롬인지를 구분할 수 있다.
보통 어떤 브라우저를 많이 사용하는지에 대한 통계를 내거나 로그에 담긴 에러를 보며 어느 브라우저에서 에러가 많이 나는지 등을 알 수 있다.
(3) Server
요청이 오고 갈때 중간에 수 많은 서버들을 거쳐서 도착하게 되는데 중간 서버들이 아닌 최종적으로 요청을 처리해주는 서버에 대한 정보이다.
응답메세지에서 사용한다.
(4) Date
메세지가 발생한 날짜와 시간이다. 응답에서 사용한다.
(5) Host
요청에서 사용하고 내가 접근하는 호스트를 넣어준다.
이 헤더는 요청헤더중에서 필수 값으로 지정될만큼 중요한 헤더이다.
(6) Location
리다이렉션을 위해서 사용하는 헤더이다.
3XX번대 HTTP 응답코드에서는 리다이레션을 위해서 새로운 URI정보를 알려주어야 하는데 이 정보를 Location에 담아서 넘겨준다.
(7) Retry-After
503응답코드와 함께 사용할 수 있다.
만약 서버점검이 12:00 - 12:30 이라면 이 30분동안은 사용할 수 없고 12:30분부터 다시 사용할 수 있다라는 의미를 가진다.
정해진 시간대의 서버점검이라면 사용이 가능하지만 갑작스러운 에러에 의한 서버다운에서는 사용하기가 쉽지 않다.