Анализ серверных заголовков ответа: что они говорят о сайте
проверку HTTP-заголовков — это метаданные, которые сервер отправляет вместе с ответом. Они управляют кешированием, безопасностью, аутентификацией, сжатием и многими другими аспектами работы сайта. Умение читать и анализировать заголовки — важный навык для веб-разработчика, SEO-специалиста и системного администратора.
Категории HTTP-заголовков
Заголовки ответа можно разделить на несколько основных категорий:
| Категория | Примеры | Назначение |
|---|---|---|
| Кеширование | Cache-Control, ETag, Expires, Last-Modified | Управление кешем браузера и прокси |
| Безопасность | CSP, HSTS, X-Frame-Options, X-Content-Type-Options | Защита от атак |
| Контент | Content-Type, Content-Length, Content-Encoding | Описание тела ответа |
| CORS | Access-Control-Allow-Origin и другие | Кросс-доменные запросы |
| Соединение | Connection, Keep-Alive | Управление TCP-соединением |
| Сервер | Server, X-Powered-By | Информация о сервере |
Заголовки кеширования
Cache-Control
Самый важный заголовок для управления кешированием. Определяет, кто может кешировать ответ, на какой срок и при каких условиях.
Основные директивы:
public— ответ может кешироваться любым промежуточным кешем (CDN, прокси)private— только браузер пользователя может кешировать (не CDN)max-age=N— ответ считается свежим N секундno-cache— кешировать можно, но перед использованием нужно проверить актуальность на сервереno-store— вообще не кешировать (конфиденциальные данные)immutable— ресурс никогда не изменится (файлы с хешем в имени)stale-while-revalidate=N— можно отдать устаревший кеш, пока в фоне идёт обновление
Проверить заголовки кеширования вашего сайта можно через инструмент проверки HTTP-заголовков enterno.io.
ETag
ETag (Entity Tag) — уникальный идентификатор версии ресурса. При повторном запросе браузер отправляет If-None-Match с сохранённым ETag. Если ресурс не изменился, сервер возвращает 304 Not Modified без тела ответа, экономя трафик.
# Первый запрос — ответ 200 с ETag
HTTP/1.1 200 OK
ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
# Повторный запрос — клиент отправляет If-None-Match
GET /style.css HTTP/1.1
If-None-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"
# Ответ — 304, тело не передаётся
HTTP/1.1 304 Not Modified
Last-Modified и If-Modified-Since
Альтернатива ETag, основанная на времени последнего изменения. Менее точная (разрешение — 1 секунда), но проще в реализации. ETag предпочтительнее при наличии обоих заголовков.
Expires
Устаревший заголовок, задающий абсолютную дату истечения кеша. Cache-Control: max-age имеет приоритет над Expires. Используйте Expires только для совместимости с очень старыми клиентами.
Заголовки безопасности
Content-Security-Policy (CSP)
CSP — мощный механизм защиты от XSS и инъекций контента. Он определяет, откуда страница может загружать скрипты, стили, изображения и другие ресурсы.
Content-Security-Policy: default-src 'self'; script-src 'self' https://cdn.example.com; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; connect-src 'self' https://api.example.com
Начните с режима Content-Security-Policy-Report-Only — он не блокирует ресурсы, а только отправляет отчёты о нарушениях.
Strict-Transport-Security (HSTS)
HSTS заставляет браузер всегда использовать SSL/TLS проверку для данного домена. Это предотвращает атаки downgrade и strip-ssl.
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
Директива preload позволяет добавить домен в встроенный список HSTS в браузерах Chrome, Firefox и Safari.
X-Frame-Options
Защищает от clickjacking-атак, запрещая встраивание страницы во фрейм. Используйте DENY или SAMEORIGIN. Современная альтернатива — директива frame-ancestors в CSP.
X-Content-Type-Options
Значение nosniff запрещает браузеру «угадывать» MIME-тип содержимого, предотвращая MIME-sniffing атаки. Всегда включайте этот заголовок.
Referrer-Policy
Контролирует, сколько информации о реферере передаётся при переходе на другой сайт. Рекомендуемое значение — strict-origin-when-cross-origin.
Permissions-Policy
Управляет доступом к API документацию устройства: камера, микрофон, IP геолокацию, платежи. Отключайте неиспользуемые возможности:
Permissions-Policy: camera=(), microphone=(), geolocation=(self), payment=()
Заголовки содержимого
Content-Type
Указывает MIME-тип тела ответа. Всегда включайте charset для текстовых типов:
Content-Type: text/html; charset=utf-8
Content-Type: application/json; charset=utf-8
Content-Type: image/webp
Content-Encoding
Указывает алгоритм сжатия тела ответа:
gzip— стандартное сжатие, поддерживается всеми браузерамиbr— Brotli, на 15–20% эффективнее gzipzstd— Zstandard, поддерживается в современных браузерах
Если ваш сайт не возвращает Content-Encoding, значит сжатие не настроено — это серьёзная проблема производительности.
CORS-заголовки
Cross-Origin Resource Sharing заголовки определяют правила кросс-доменных запросов:
Access-Control-Allow-Origin— какие домены могут обращаться к ресурсуAccess-Control-Allow-Methods— разрешённые HTTP-методыAccess-Control-Allow-Headers— разрешённые заголовки запросаAccess-Control-Max-Age— время кеширования preflight-ответаAccess-Control-Allow-Credentials— разрешена ли передача cookies
Подробнее о безопасной настройке CORS читайте в нашей статье о безопасности API.
Заголовок Server и информационная безопасность
Заголовок Server раскрывает название и версию веб-сервера, а X-Powered-By — серверный язык или фреймворк. Эта информация помогает атакующим подбирать эксплойты.
Рекомендации:
- Удалите или минимизируйте заголовок
Server(например, простоServer: nginxбез версии) - Полностью удалите
X-Powered-By - Удалите
X-AspNet-Version,X-AspNetMvc-Versionи аналогичные
Как анализировать заголовки
Для анализа заголовков используйте:
- enterno.io — быстрая проверка заголовков любого сайта с подробным анализом
- Chrome DevTools → Network → Headers — просмотр заголовков в браузере
- curl —
curl -I https://example.comдля просмотра в терминале
Чек-лист оптимальных заголовков
Cache-Controlнастроен для всех типов ресурсовContent-Encoding: brилиgzipдля текстовых ресурсовContent-Security-Policyограничивает источники контентаStrict-Transport-Securityс длительным max-ageX-Content-Type-Options: nosniffвключёнX-Frame-Optionsили CSP frame-ancestors настроеныReferrer-Policyограничивает передачу реферераPermissions-Policyотключает неиспользуемые API- Заголовок
Serverне раскрывает версию X-Powered-Byудалён
Проверьте сами
Проанализируйте заголовки вашего сайта прямо сейчас с помощью анализатора HTTP-заголовков enterno.io — получите полный отчёт за секунды.
Проверьте ваш сайт прямо сейчас
Проверить →