PentestBlog - Основное об HTTP

Основное об HTTP

December 10, 2017

HTTP (HyperText Transfer Protocol, «протокол передачи гипертекста») — это протокол передачи данных, изначально предназанченный для передачи гипертекстовых документов. Согласно модели OSI протокол HTTP является протоколом прикладного уровня (уровня приложения). Основой HTTP является клиент-серверная структура передачи данных:

  • Клиент (браузер или клиентское приложение) формирует запрос и отправляет его на сервер;
  • Сервер обрабатывает данный запрос, формирует ответ и отправляет обратно клиенту.

В настоящее время протокол HTTP повсюду используется во Всемирной паутине для получения информации с веб-сайтов. Передача данных по протоколу HTTP, как правило, происходит через TCP/IP-соединение. Сервер по умолчанию использует TCP-порт 80 (хотя может использовать и любой другой).

И так, чтобы лушче разобраться в HTTP протоколе, рассмотрим кратко теорию и на наглядном примере разберем более подробно.

Структура протокола HTTP

Каждое HTTP-сообщение состоит из стартовой строки, заголовков и тела сообщения (может отсутствовать).

HTTP-запрос к ресурсу

Стартовая строка запроса составляется следующим способом: Метод URI HTTP/Версия

  1. Метод – тип запроса, одно слово заглавными буквами, определяет операцию, которую нужно осуществить с указанным ресурсом. Например, метод POST применяется для передачи пользовательских данных заданному ресурсу. Метод GET используется для запроса содержимого указанного ресурса, также для начала какого-либо процесса. Есть еще много других методов, но в данной статье их мы не будем рассматривать;
  2. URI (Uniform Resource Identifier, унифицированный идентификатор ресурса) – определяет путь к запрашиваему конкретному ресурсу (документу);
  3. Версия – определяет, в соответствии с какой версией стандарта HTTP составлен запрос.

Пример:

GET / HTTP/1.1

В данном примере стартовая строка показывает, что запрашивается стартовая страница.

Более подробный пример: Например, мы заходим на сайт tonyasokolova.github.io, и мы хотим прочитать о владельце данного сайта. Мы нажимаем на About, т.е. мы обращаемся к tonyasokolova.github.io/about, в качестве URI у нас /about. Так как никаких пользовательских данных мы не передаем, то у нас метод GET. Версия HTTP обычно всегда 1.1. Таким образом стартовая строка будет выглядеть так:
index page

После стартовой строки идут заголовки (HTTP Headers) – это строки в HTTP-сообщении, содержащие разделённую двоеточием пару параметр-значение.

Разберем в нашем примере пару заголовков. Первый заголовок это хост (host) – к какому сайту мы обращаемся, в данном случае tonyasokolova.github.io: index page

Второй заголовок User-Agent – клиентское приложение, в данном примере используется браузер mozilla firefox: index page

Остальные заголовки: Accept – список допустимых форматов ресурса, Accept-Language – список поддерживаемых языков, Сookie – используется веб-серверами для того, чтобы различать пользователей и хранить данные о них.

Заголовки должны отделяться от тела сообщения хотя бы одной пустой строкой. Так как метод у нас GET, то тело сообщения у нас отсутствует.

Ответ от сервера

Стартовая строка ответа выглядит так: HTTP/Версия КодСостояния Пояснение

  1. Версия – как и в запросе;
  2. Код состояния (Status Code) – три цифры. По коду состояния определяется дальнейшее содержимое сообщения и поведение клиента. Например, в случае, если был использован метод GET, и сервер предоставляет ресурс с указанным идентификатором, то такое состояние задаётся с помощью кода 200. Если сервер сообщает о том, что такого ресурса не существует — 404. Весь список кодов можно глянуть по ссылке: список кодов состояния.
  3. Пояснение – текстовое короткое пояснение к коду ответа для пользователя. Никак не влияет на сообщение и является необязательным.

Продолжаем рассматривать наш пример. После нашего запроса к ресурсу мы получаем от сервера ответ. Стартовая строка ответа содержит версию 1.1. Код состояние у нас 200, т.е. наш запрос был успешным. И пояснение OK – поясняет код состояния. index page

Далее идут заголовки, а после заголовок идет тело сообщения (обратите внимание, что оно обязательно отделено хотя бы одной пустой строкой). В качестве тела сообщения сервер отправляет документ в формате HTML, который и отображает в итоге нужную нам информацию на странице.

Безопасность

В HTTP не используется шифрование для передачи данных, но есть расширение, которое реализует упаковку передаваемых данных в криптографический протокол SSL или TLS. Называется это расширение HTTPS (HyperText Transfer Protocol Secure). Как правило для HTTPS-соединения используется TCP-порт 443. Данное расширение используется для защиты информации от перехвата, а также, как правило, обеспечивает защиту от атак вида man-in-the-middle, при условии, что будут использоваться шифрующие средства и сертификат сервера проверен и ему доверяют.

На данный момент HTTPS поддерживается всеми популярными веб-браузерами.

Ссылки