우클릭방지

글 목록

2017년 7월 19일 수요일

[HTTP 프로토콜 강좌]#11 HTTP 요청 헤더 I - Accept, Accept-Charset, Accept-Encoding, Accept-Language

우리가 이전 포스팅 내용에서 봤듯이 HTTP 요청과 응답에는 다수의 HTTP 헤더 들이 존재한다. 헤더는 헤더명과 헤더값으로 구성되며, 이 둘간의 구분은 " : " 콜론을 기준으로 좌측은 헤더명, 우측은 헤더값이다.

오늘은 HTTP 요청 헤더 중 다음 5개에 대해 먼저 정리해본다.


  1.  Accept
  2. Accept-Charset
  3. Accept-Encoding
  4. Accept-Language
1. Accept

Accept 헤더는 클라이언트가 웹서버로 요청할 때 보내는 것으로, 클라이언트가 수용할 수 있는 메시지 형태를 정의해 놓은 것이다. 
즉, 내가 이런 종류의 메시지를 확인 할 수 있어요 하는걸 웹서버에게 알려주는 것이다.

다음은 실제 사용된 Accept 헤더의 내용이다. 


위 내용을 좀 정리해 보면 다음과 같다. 
  • image/webp
  • image/apng
  • image/*
  • */*; q=0.8
Accept 헤더의 구성은 "/" 를 기준으로 좌,우측에 정보가 하나씩 존재한다. 먼저 좌측은 컨텐츠의 주 타입 (Main type) 이고, 우측은 보조 타입(Subtype) 이다. 

좌,우측에는 와일드카드로 "*(asterisk)"를 사용 할 수도 있다. 
image/webp 를 해석하면.. 이미지 컨텐츠 중 webp 라는 형태를 확인 가능하다 라는 의미인것이다. 
image/* 는 이미지 컨텐츠는 어떤 것이든 확인할 수 있다. 
*/* 는 어떤 컨텐츠라도 모두 확인이 가능하다

뭐 이런식의 의미이다. 

그렇다면 4번째 " */*; q=0.8 " 에서.. q=0.8 의 의미는 무엇일까? 
q는 quality 의 약자로... 품질을 의미한다. q 의 값은 0 ~ 1 사이의 값이 부여되는데 1이 최고로 선호하는 품질이란 뜻이다. 
참고로 품질을 뜻하는 q는 값이 1일때 생략되어 진다. 

위 4가지 헤더를 다시 정리하면 다음과 같다고 보면 된다. 

  • image/webp; q=1
  • image/apng; q=1
  • image/*; q=1
  • */*; q=0.8
웹서버가 위와 같은 형태의 요청을 받게 되면 다음과 같이 이해하고 서비스를 하게 된다.

"클라이언트는 image/webp, image/apng 또는 image/* 를 가장 선호하는 것이니 웹서버가 전달해 줘야 할 컨텐츠 형태가 이거에 맞으면 전달해 줄것이고, 이런 형태의 컨텐츠가 아니면 그래도 해석이 가능하니 보내줘야 되겠군"


2. Accept-Charset

Accept-Charset 은 클라이언트가 지원하는 문자셋(character set)의 종류를 알려주는 헤더이다. 
표시형식은 Accept 헤어와 거의 비슷하다. 
";"을 기준으로 왼쪽으로는 문자셋의 종류, 오른쪽으로는 퀄리티 정보가 표시된다. 
퀄리티 정보는 Accept 헤데에서와 마찬가지로 0~1 사이의 값이 표시되며, 값이 1인 경우는 표시가 생략된다. 

Accept-Charset 을 지정하지 않을 경우 웹서버는 ISO 8859-1 문자셋을 이용한다. 
즉, ISO 8859-1 이 기본 문자셋이라는 의미이다. 

다음 예를 보자. 


클라이언트는 unicode 문자셋을 가장 선호한다는 의미이며, unicode 문자셋이 아닌 경우는 ISO 8859-1로 처리한다는 의미이다. 


3. Accept-Encoding

Accept-Encoding 헤더는 클라이언트(브라우저)가 지원하는 압축방식을 열거한 것이다. 
클라이언트는 웹서버에게 요청할 때 

"나는 이런이런 형태의 압축을 풀어 볼수 있으니, 원하면 명시된 압축방식을 이용해서 보내도 괜찮아요.."

라는 메시지를 주는것이다. 

다음은 실제 HTTP 요청헤더의 Accept-Encoding 부분이다. 



위 예제 이미지에서 보면 클라이언트는 gzip, deflate 방식의 압축방식을 지원하고 있음을 알수 있다. 

표시 방식은 Accept 헤더와 비슷하다. 
2개 이상의 압축방식을 지원하는 경우 "," 로 구분하여 표시하며, "압축방식; 퀄리티 정보" 형식이다. 퀄리티 부분은 1일 경우 마찬가지로 생략된다. 

따라서..
  • gzip; q=1
  • deflate; q=1 
와 같은 의미이다. 

* 압축은 서버에서 직접 지원할 수 있다. 압축하여 컨텐츠를 제공할 경우 대역폭(Bandwidth) 절감의 효과를 볼수 있으나, 웹서버의 성능에 영향이 간다. 





4. Accept-Language

Accept-Language 헤더는 클라이언트가 지원하는 언어의 종류를 표시하는 것이다. 
웹서버에게 나는 한국어, 영어를 할줄 알아요.. 라고 이야기 하는 것과 같다. 

언어도 멀티레벨로 표현하는 방식을 지원한다. 멀티레벨은 "-" 표시를 이용하는데..
가령 en-us 이면 영어중에서도 어메리칸 영어라는 뜻이다. 

이 헤더도 Accept 와 마찬가지로 퀄리티 부분을 ";" 로 구분하여 같이 명시할 수 있다. 
퀄리티는 Accept에서 이야기한 것과 같이 0~1 사이의 값으로 표시되며, 1인 경우 생략된다.

다음 예를 살펴 보자.


위 헤더의 값을 보면.. 총 4가지 language 를 지원하는 것으로 되어 있다. 
  • ko-KR
  • ko; q=0.8
  • en-US; q=0.6
  • en; q=0.4
ko-KR을 가장 선호하며, 그다음은 ko, en-US, en 의 순이다. 


오늘 내용을 정리하면 다음과 같다. 

  1. HTTP 헤더는 요청/응답 모두 ' 헤더명 : 헤더값 ' 으로 구성된다. 
  2. Accept 헤더는 클라이언트가 해석할 수 있는 컨텐츠 종류를 명시한다. 
  3. Accept-Charset 헤더는 클라이언트가 지원하는 문자셋 종류를 명시한다.
  4. Accept-Encoding 헤더는 클라이언트가 지원하는 압축 방식을 명시한다.
  5. Accept-Language 헤더는 클라이언트가 지원하는 언어 종류를 명시한다. 
  6. Accept 헤더를 비롯하여 오늘 이야기한 헤더의 값은 모두  ' 값; 퀄리티 ' 형태로 표시되며, 퀄리티는 0~1 사이의 값을 가진다.
    1의 값인 경우 생략이 가능하며, 클라이언트가 가장 선호하는 항목을 의미한다. 




댓글 없음:

댓글 쓰기