JSON добре стискається: повторювані ключі й структура дають зменшення у 5-10 разів. Для мобільних клієнтів і великих списків це суттєва економія часу й трафіку.
Як це працює:
GET /api/products
Accept-Encoding: zstd, br, gzip
HTTP/1.1 200 OK
Content-Type: application/json
Content-Encoding: br
Vary: Accept-Encoding
- клієнт перелічує в
Accept-Encodingалгоритми, які розуміє; - сервер обирає один, стискає тіло й повідомляє про це в
Content-Encoding; - клієнт (браузер,
fetch, HTTP-клієнт) розпаковує автоматично.
Vary: Accept-Encoding обов'язковий для кешів і CDN - інакше стиснена копія може дістатися клієнту, що її не розуміє.
Алгоритми:
| Алгоритм | Особливість |
|---|---|
gzip |
підтримується всюди, швидкий, середнє стиснення |
br (Brotli) |
краще стиснення за gzip, особливо для тексту; підтримка в усіх сучасних браузерах |
zstd (Zstandard) |
дуже швидке стиснення й розпакування при хорошому коефіцієнті; підтримується в Chrome і Firefox, Safari - з 2025 року |
Сервер обирає найкращий з того, що підтримує клієнт, і зазвичай лишає gzip як запасний варіант.
Де вмикати: не в PHP, а на рівні вебсервера чи CDN - Nginx (gzip, модуль brotli), Caddy (encode zstd gzip), Cloudflare. Там стиснення ефективніше й не займає воркери PHP.
Що варто знати:
- малі відповіді не стискають: для тіла в кількасот байтів накладні витрати більші за виграш (типовий поріг - 1 КБ);
- вже стиснене (зображення, архіви, PDF) повторно не стискають;
- рівень стиснення - компроміс з процесором: для динамічних відповідей - середній рівень, максимальний - лише для статики, стисненої заздалегідь;
- BREACH: стиснення відповідей, що містять і секрет (CSRF-токен), і дані, підконтрольні атакувальнику, на HTTPS дає змогу вгадувати секрет за розміром відповіді. Для JSON API з токенами в заголовках, а не в тілі, ризик невеликий, але про атаку варто знати;
- тіло запиту клієнти зазвичай не стискають -
Content-Encodingу запиті сервер має підтримувати окремо.
Перевірка: curl -H 'Accept-Encoding: br' -I https://api.example.com/products - у відповіді має бути Content-Encoding.