Как заголовки HTTP могут помочь вам в создании лучшего программного обеспечения

Заголовки HTTP - это элементы сообщений запроса и ответа в протоколе передачи гипертекста (HTTP), которые устанавливают важные рабочие параметры в транзакции HTTP и частично определяют безопасность и эффективность вашего веб-сайта.

В этой статье я расскажу о том, как некоторые заголовки HTTP могут помочь вам создавать более безопасные и эффективные приложения.

Показатель

1. Фон

2. Заголовки HTTP для безопасной связи между вашим приложением и сервером:

  • Строгая безопасность транспорта HTTP (HSTS)
  • Upgrade-Insecure-Requests
  • Политика безопасности контента (CSP)
  • X-XSS-защита
  • Параметры X-Content-Type

Заголовки HTTP для повышения производительности

  • Кэш-контроль
  • Content-Encoding

Заключение

1. Фон

Когда вы запрашиваете (используя браузер, curl) ресурс с сервера, этот запрос включает в себя набор пар ключ-значение, предоставляющих метаданные о самом запросе, такие как форматы, которые он понимает, или тип безопасности, используемый в соединении. Эти пары ключ-значение называются заголовками запроса.

Когда сервер отвечает с запрошенным ресурсом, также отправляйте заголовки ответа с информацией о запрошенном ресурсе, и эти пары ключ-значение называются заголовками ответа.

Рассмотрим пример использования API, расположенного на сайте RapidAPI, с помощью которого мы можем получать информацию о различных фильмах.

Я использую оболочку Linux и команду cURL для запроса IMDB API.

curl --request GET \  --url 'https://movie-database-imdb-alternative.p.rapidapi.com/?page=1&r=json&s=Back%20to%20future' \  --header 'x-rapidapi-host: movie-database-imdb-alternative.p.rapidapi.com' \  --header 'x-rapidapi-key: xxxxxxxxx your api key xxxxxxxxx' -include

Я использую флаг «- include», чтобы включить заголовки ответа в верхнюю часть тела ответа.

Если все пойдет хорошо, вы получите JSON со списком фильмов, найденных для поля поиска: «назад в будущее» и заголовками ответа поверх тела ответа:

Этот запрос включает пары ключ-значение, дающие серверу информацию, такую ​​как API ключа или хост ресурса.

--header 'x-rapidapi-host: movie-database-imdb-alternative.p.rapidapi.com'
--header 'x-rapidapi-key: xxxxxxxxx your api key xxxxxxxxx'

Здесь вы можете увидеть заголовки ответов, которые дают нам информацию о самом ресурсе:

HTTP/1.1 200 OK
Accept-Ranges: bytes
Access-Control-Allow-Origin: *
Age: 1106
Cache-Control: public, max-age=86400
...
Expires: Sat, 01 Aug 2020 08:26:52 GMT
Last-Modified: Sat, 01 Aug 2020 07:26:52 GMT
Server: RapidAPI-1.1.24
Set-Cookie: __cfduid=dcdc511196cfb0471cbedcdc511196cfb0471cbe; expires=Mon, 31-Aug-20 07:45:18 GMT; path=/; domain=.omdbapi.com; HttpOnly; SameSite=Lax
Vary: *
...
Content-Length: 2265
Connection: keep-alive

Код ответа об успешном состоянии HTTP 200 OK означает, что запрос выполнен успешно.

  • HTTP-заголовок Accept-Ranges используется сервером для информирования о единицах измерения, которые можно использовать для определения диапазона.
  • Заголовок Access-Control-Allow-Origin указывает, можно ли поделиться ответом с запрашивающим кодом из данного источника.
  • Заголовок Age содержит время, в течение которого объект находился в кэше прокси.
  • Заголовок Cache-Control содержит директивы (инструкции) для кэширования как в запросах, так и в ответах.
  • Заголовок Expires содержит дату, после которой ответ считается устаревшим.
  • Заголовок Connection определяет, остается ли сетевое соединение открытым после завершения текущей транзакции.

Теперь, когда вы ознакомились с базовым примером, показывающим заголовки в сообщении, давайте рассмотрим другие важные аспекты, которые следует учитывать.

2. Заголовки HTTP для безопасного обмена данными между вашим приложением и сервером.

Строгая безопасность транспорта HTTP (HSTS)

Представьте, что хакер использует «сниффер пакетов», который анализирует ваш трафик, потому что вы подключены к общедоступному Wi-Fi. Теперь этот хакер может перехватывать ваш сетевой трафик через HTTP для любого веб-сайта, который использует только 301 редирект для перехода с HTTP на HTTPS, а затем крадет ваши данные.

По этой причине ваш веб-сайт должен использовать HTTP Strict Transport Security или HSTS только по HTTPS.

Для этого вы можете использовать заголовок ответа HSTS, который позволяет веб-сайту уведомлять браузеры о том, что к нему следует обращаться по протоколу HTTPS вместо использования HTTP.

Этот заголовок устанавливает параметр поля политики Strict-Transport-Security, который принудительно устанавливает эти соединения через шифрование HTTPS, игнорируя любые другие вызовы для загрузки ресурсов в этом домене через HTTP. Таким образом, вероятность HTTP-соединения полностью исключается.

Синтаксис:

Strict-Transport-Security: max-age=<expire-time>
Strict-Transport-Security: max-age=<expire-time>; includeSubDomains
  • Директива max-age устанавливает время в секундах, в течение которого браузер должен помнить, что к сайту можно получить доступ только по протоколу HTTPS.
  • Директива includeSubDomains указывает, что правило применяется также ко всем субдоменам сайта.

Upgrade-Insecure-Requests

Еще одна хорошая идея - использовать заголовок HTTP Upgrade-Insecure-Requests.

Синтаксис:

Upgrade-Insecure-Requests: 1

Этот заголовок служит для указания серверу, что клиент предпочитает зашифрованный и аутентифицированный ответ, и что он может обрабатывать директиву CSP для обновления небезопасных запросов.

Когда сервер находит это предпочтение в заголовках HTTP-запроса, он должен перенаправить пользователя на безопасное представление запрашиваемого ресурса.

Обратите внимание, что сервер может игнорировать это, но все же это указывает на предпочтения клиента.

Политика безопасности контента (CSP)

Используя заголовок ответа HTTP Content Security Policy, вы можете ограничить ресурсы для загрузки на сайте. Эти политики в основном включают указание источников сервера и конечных точек сценария.

Эти заголовки помогают защититься от межсайтовых сценариев и других атак путем внедрения кода.

Синтаксис:

Content-Security-Policy: <policy-directive>; <policy-directive>

Более подробная информация о Контент-политика безопасности Mozilla.

X-XSS-защита

Заголовок X-XSS-Protection защищает от атак межсайтового скриптинга и особенно полезен в старых браузерах, потому что в современных браузерах вы можете реализовать строгую Content-Security-Policy, которая отключает использование встроенного JavaScript.

Синтаксис:

X-XSS-Protection: 0
X-XSS-Protection: 1
X-XSS-Protection: 1; mode=block
0: Disables XSS filtering. 1: Enables XSS filtering.
  • 1: mode = block указывает, что браузер будет предотвращать отображение страницы при обнаружении атаки, а не очищать страницу.

Подробнее о Mozilla X-XSS-Protection.

Параметры X-Content-Type

Заголовок X-Content-Type обеспечивает защиту от инструкций сниффинга MIME, указывая браузеру следовать типам MIME, указанным в заголовках.

Синтаксис:

X-Content-Type-Options: nosniff

Директива nosniff блокирует запрос, если цель запроса имеет тип:

  • «style», а MIME-тип - это не text / css.
  • «script», а тип MIME не является типом MIME JavaScript.

и включает защиту Cross-Origin Read Blocking (CORB) для MIME-типов: text / html, text / plain, text / json, application / json, text / xml, application / xml.

3. Заголовки HTTP для повышения производительности

Кэш-контроль

Заголовок HTTP Cache-Control содержит директивы (инструкции) для кэширования как в запросах, так и в ответах. Целью кэширования является уменьшение необходимости отправлять запросы / ответы во многих случаях, уменьшая количество сетевых вызовов, необходимых для многих операций.

Синтаксис:

Директивы запроса кеша:

Cache-Control: max-age=<seconds>
Cache-Control: max-stale[=<seconds>]
Cache-Control: min-fresh=<seconds>
Cache-Control: no-cache 
Cache-Control: no-store
  • Директива max-age устанавливает максимальное количество времени в секундах, в течение которого ресурс считается обновленным. В отличие от директивы Expires, эта директива относится ко времени запроса.
  • Директива max-stale устанавливается, если клиент примет устаревший ответ.
  • Директива min-fresh означает, что клиент хочет, чтобы ответ был свежим в течение как минимум указанного количества секунд.
  • Директива no-cache указывает, что любой кеш может хранить ответ, даже если ответ обычно не кэшируется.
  • Директива no-store указывает, что ответ не может храниться ни в каком кэше. Хотя могут быть установлены дополнительные директивы, это единственная уникальная директива, которая вам нужна для остановки кешированных ответов в современных браузерах.

Директивы ответа кеша:

Cache-Control: must-revalidate
Cache-Control: no-cache
Cache-Control: no-store
Cache-Control: no-transform
Cache-Control: public
Cache-Control: private
Cache-Control: proxy-revalidate
Cache-Control: max-age=<seconds>
  • Директива must-revalidate указывает, что когда ресурс становится старым, кеши не должны использовать свою старую копию без успешной проверки на сервере.
  • Директива public указывает, что любой кеш может хранить ответ.
  • Директива private указывает, что ответ может храниться только в кеше браузера.
  • Директива no-transform указывает, что промежуточный прокси или кеш не может редактировать тело ответа.
  • Директива proxy-revalidate аналогична директиве must-revalidate, но только для общих кешей.

Подробнее о Mozilla Cache-Control.

Content-Encoding

Заголовок Content-Encoding используется сервером, чтобы сообщить клиенту, какую кодировку следует применить к телу сообщения. Кодирование содержимого в основном используется для сжатия, экономии полосы пропускания и повышения общей производительности сайта.

Синтаксис:

Content-Encoding: gzip
Content-Encoding: compress
Content-Encoding: deflate
Content-Encoding: identity
Content-Encoding: br
Content-Encoding: gzip, identity
Content-Encoding: deflate, gzip

Директивы кодирования содержимого:

  • Директива gzip использует алгоритм deflate (формат GNU zip) для сжатия.
  • Директива compress или программный метод UNIX устарела и заменена алгоритмом gzip или deflate.
  • Директива deflate указывает на использование структуры Zlib с алгоритмом сжатия deflate.
  • Директива identity указывает, что преобразование не используется.
  • Директива br указывает на использование современного алгоритма Бротли, специально разработанного для HTTP.

Дополнительная информация о Кодировке содержимого Mozilla.

Заключение

Создание веб-сайта сегодня - сложная задача, потому что вам нужно знать о многом, но, в конце концов, самое полезное - это изучить основы.

В этой небольшой статье я рассказал о нескольких заголовках, которые могут помочь повысить безопасность и производительность вашего приложения. Я призываю вас продолжить изучение других полезных заголовков.

Надеюсь, статья была вам полезна. Заботиться!