`Accept-Encoding`으로 압축된 응답을 요청해 전송량을 크게 줄이는 레시피입니다. 큰 JSON·텍스트 응답에서 특히 효과적입니다.
`Accept-Encoding`으로 압축된 응답을 요청해 전송량을 크게 줄이는 레시피입니다. 큰 JSON·텍스트 응답에서 특히 효과적입니다.
# --compressed advertises Accept-Encoding AND decompresses for you:
curl --compressed https://api.example.com/big.json
# ask explicitly (you must decode it yourself):
curl -H 'Accept-Encoding: gzip, br' https://api.example.com/big.json// Browsers send Accept-Encoding automatically and decode transparently.
// res.json()/res.text() already give you the decompressed body.
const res = await fetch('https://api.example.com/big.json');
const data = await res.json();import requests
# requests sends Accept-Encoding: gzip, deflate and decodes automatically
res = requests.get('https://api.example.com/big.json')
print(res.headers.get('Content-Encoding')) # e.g. 'gzip'
data = res.json() # already decompressed클라이언트가 `Accept-Encoding: gzip, br`로 지원 압축 방식을 알리면, 서버는 압축 후 `Content-Encoding`으로 실제 사용한 방식을 응답합니다. 텍스트 기반 응답은 보통 70~90% 줄어듭니다. curl에서 `--compressed`는 헤더 전송과 자동 압축 해제를 한 번에 해 주지만, 직접 `-H 'Accept-Encoding: gzip'`만 주면 압축된 바이트를 그대로 받아 스스로 풀어야 합니다.
브라우저 `fetch`와 `requests`는 압축 협상과 해제를 투명하게 처리하므로, `res.json()`·`res.text()`가 이미 풀린 본문을 돌려줍니다. 즉 대부분의 라이브러리에서는 별도 코드가 필요 없습니다.
주의점: 압축 시 `Content-Length`는 압축된 크기를 가리키므로 원본 크기와 다릅니다. 또한 응답이 인코딩에 따라 달라지므로 캐시 정확성을 위해 서버는 `Vary: Accept-Encoding`을 붙여야 합니다. 이미 압축된 형식(JPEG·PNG·mp4)이나 아주 작은 응답은 재압축 이득이 없거나 오히려 손해입니다.