- 웹의 여러 요소들은 그냥 주고 받기에는 너무 큼 → 여러 압축 알고리즘을 통해 압축을 한 후 주고 받음
- 어떤 것들은 이미 압축이 되어 다시 압축할 필요가 없는 경우도 있고, 클라이언트나 서버에서 어떤 알고리즘은 지원하고 어떤 것은 지원하지 않는지 확인이 필요함
- 클라이언트가 서버에게 Accept-Encoding 헤더를 보냄으로써 사용 가능한 압축 알고리즘을 알 수 있음
- 즉, Accept-Encoding 헤더는 클라이언트(브라우저)가 지원하는 압축방식을 열거함으로써, 클라이언트는 웹서버에게 요청할 때 "나는 이런이런 형태의 압축을 풀어 볼수 있으니, 원하면 명시된 압축방식을 이용해서 보내도 괜찮아요.."라는 메시지를 주는것
Accept-Encoding 헤더 사용 예시
- 클라이언트가 Accept-Encoding 헤더에 gzip, br, 그리고 가중치를 함께 적음으로서 서버에게 사용할 알고리즘을 전달함
- gzip, compress, br을 함께 적으면, 셋 모두 클라이언트에서 처리할 수 있으니 서버에게 셋 알고리즘 중 아무 형태든 보내달라고 함
Accept-Encoding: gzip
Accept-Encoding: gzip, compress, br
Accept-Encoding: br;q=1.0, gzip;q=0.8, \*;q=0.1
- 네이버의 PC 홈 화면에서 날라가는 request를 캡쳐 → Accept-Encoding 헤더가 gzip, deflate, br 으로 구성
의미
- gzip의 경우 그 유명한 gzip 알고리즘 의미
- br의 경우 구글에서 만든 Brotli 압축 알고리즘을 의미 → 크롬의 경우 버전 50 이후(2016년 배포), 파이어폭스는 44 이후(16년), 사파리는 11 이후 (17년 배포) 버전을 이용한다면 이용 가능
- br의 경우 css, js, html 파일에 대해 gzip보다 대략 15~20% 크기 측면에서 효율적
- 2개 이상의 압축방식을 지원하는 경우 쉼표(,) 로 구분하여 표시
- "압축방식; 퀄리티 정보" 형식 → 퀄리티 부분은 1일 경우 마찬가지로 생략 가능
- 가중치를 주어서 계산 가능
- deflate → deflate 압축 알고리즘과 함께 zlib 구조를 사용하는 압축 포맷으로, q값이 생략됨으로 선호도는 1임
- gzip;q=1.0 → gzip 압축 알고리즘을 사용하는 압축 포맷으로, q=1.0으로 선호도는 1임
- *;q=0.5 → 표현된 선호 대상이 없다는 것을 의미로 아무 압축 알고리즘을 사용하여 전송해달라는 것, q=0.5로 q=1.0이 없는 경우 전송 요청
Accept-Encoding: deflate, gzip;q=1.0, \*;q=0.5
※ q는 quality의 약자로 품질의 의미
- 가중치를 줘서 선호하는 압축 알고리즘을 서버에게 알려줌
- q 의 값은 0 ~ 1 사이의 값이 부여
- 1이 최고로 선호하는 품질
- q는 값이 1일때 생략 가능
- 웹서버는 클라이언트가 선호하는 형태의 요청을 받게 되면, 압축 알고리즘을 클라이언트가 선호하는 방법으로 제공하여 데이터 전송
문법
Accept-Encoding: gzip
Accept-Encoding: compress
Accept-Encoding: deflate
Accept-Encoding: br
Accept-Encoding: identity
Accept-Encoding: \*
# Multiple algorithms, weighted with the quality value (en-US) syntax:
Accept-Encoding: deflate, gzip;q=1.0, \*;q=0.5
디렉티브
- gzip
- 32비트 CRC와 함께 Lempel-Ziv coding (LZ77)를 사용하는 압축 포맷
- compress
- Lempel-Ziv-Welch (LZW) 알고리즘을 사용하는 압축 포맷
- deflate
- deflate 압축 알고리즘과 함께 zlib 구조를 사용하는 압축 포맷
- br
- identity
- 압축하지 않거나 수정하지 않은 경우를 표시
- identity 값은 존재하지 않은 경우에도 항상 수용 가능
- *(asterisk)
- 헤더 내에 아직 나열되지 않은 컨텐츠 인코딩이라도 일치
- 헤더가 존재하지 않을 경우, 기본값 → 모든 알고리즘이 지원된다는 것을 의미 X
- 표현된 선호 대상이 없다는 것을 의미
- ;q= (q값 가중치)
- weight라고 부르는 상대적인 퀄리티 값을 사용
- 표현한 선호도에 따라 배치된 값