Сеть

Семантика HTTP-прокси и запросы браузера

Разберитесь, как браузеры используют HTTP-прокси, туннели CONNECT, заголовки, перенаправления и DNS, чтобы надёжно настраивать прокси-маршруты.

Документация

Нужна структурированная документация по теме Сеть?

Эта статья относится к редакционной библиотеке. Для пошаговой настройки, справки и постоянных обновлений переходите сразу в соответствующий раздел docs.

Почему семантика прокси важна в браузере

HTTP-прокси: это не просто адрес между браузером и веб-сайтом. Он меняет маршрут, форму запроса и иногда место, где разрешается имя. От этих деталей зависят аутентификация, cookies, перенаправления, TLS-сертификаты, кэширование, журналы и видимый источник запроса. Команда запуска может выглядеть правильной, но обмен по сети окажется не таким, как ожидает приложение.

Когда браузер использует HTTP- или HTTPS-прокси, семантика запросов влияет на аутентификацию, cookies, перенаправления, TLS-сертификаты, кэширование, журналы и видимый источник запроса. Ниже описано наблюдаемое поведение и стандарты, а не особенности конкретного поставщика. Практические примеры конфигурации приведены в руководстве Настройка прокси браузера: SOCKS5, HTTP и HTTPS. Если развёртывание использует WebRTC, отдельный путь трафика рассматривается в статье Что такое утечка IP через WebRTC?: настройки HTTP-прокси автоматически его не контролируют.

Основные идеи:

  • Запрос к прокси может использовать абсолютный URI, а запрос внутри туннеля: origin-form.
  • CONNECT создаёт байтовый туннель к хосту и порту. После успешного ответа прокси обычно пересылает зашифрованные TLS-байты, не разбирая находящиеся внутри HTTP-сообщения.
  • Аутентификация прокси и аутентификация источника: разные задачи с разными заголовками.
  • Браузер может разрешить имя локально или попросить прокси выполнить разрешение; это зависит от протокола и реализации.
  • Перенаправления, сервис-воркеры, кэш и не-HTTP-протоколы создают запросы, которые легко пропустить в простом тесте.

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

Границы маршрутов HTTP-прокси и CONNECT (ru)

Формы запросов и первый переход

HTTP/1.1 определяет четыре формы цели запроса в RFC 9110, раздел 7.1: origin-form, absolute-form, authority-form и asterisk-form. Браузер с forward-прокси обычно отправляет обычный HTTP-запрос в absolute-form. Например, вместо GET /products HTTP/1.1 он может отправить:

GET http://shop.example/products HTTP/1.1
Host: shop.example
Accept: text/html

Прокси использует полный URI, чтобы выбрать следующий переход. Заголовок Host остаётся важным: он обозначает authority, ожидаемый сервером-источником, и обязателен для запросов HTTP/1.1. В корректном запросе authority в URI и поле Host совпадают. Прокси может отклонить несовпадение, вместо того чтобы угадывать назначение клиента.

При прямом подключении к HTTP-источнику браузер обычно использует origin-form. В первой строке есть только путь и query:

GET /products?sort=price HTTP/1.1
Host: shop.example

Это различие полезно при чтении захвата пакетов или журнала доступа прокси. Абсолютный URI в строке запроса подтверждает, что первый переход идёт через forward-прокси, но не означает, что источник получил ту же форму. Обычно прокси преобразует запрос в форму, которую ожидает следующий переход.

Authority-form используется с CONNECT и состоит из хоста и порта, например shop.example:443. Asterisk-form, OPTIONS *, обращается к самому серверу, а не к ресурсу. В обычной загрузке браузеры редко создают такой запрос, но диагностический или совместимый тест может это сделать.

HTTP- и HTTPS-URL: разные случаи

Для URL http:// браузер может отправить HTTP-запрос HTTP-прокси в открытом виде. Прокси видит метод, путь, заголовки и статус ответа. Соединение прокси с источником тоже может быть HTTP, хотя при запросе HTTPS прокси способен использовать TLS до источника.

Для URL https:// браузер обычно просит HTTP-прокси открыть туннель:

CONNECT shop.example:443 HTTP/1.1
Host: shop.example:443

Прокси возвращает статус вроде 200 Connection Established. Затем браузер начинает TLS-handshake через созданное соединение. HTTP-запрос, заголовки ответа и тело находятся внутри TLS и не видны обычному forward-прокси. Прокси всё же видит authority назначения, время соединения, число байтов и метаданные, необходимые его политике.

Модель туннеля объясняет, почему HTTPS-страница может не загрузиться ещё до ответа страницы. Прокси может отклонить CONNECT, потребовать аутентификацию, запретить порт или не суметь разрешить назначение. В таком случае HTTP-ответа источника нет; инструменты разработчика покажут сетевую ошибку, а не обычный статус.

Особенности HTTP/2 и HTTP/3

RFC 9112 описывает сообщения HTTP/1.1 и правила разбора, защищающие границы сообщений. После создания туннеля современные браузеры могут использовать с источником HTTP/2 или HTTP/3; это зависит от поддержки браузера и прокси. Понятия запроса сохраняются, но представление в сети меняется: HTTP/2 использует бинарные фреймы и псевдозаголовки :method и :authority, а HTTP/3 работает поверх QUIC.

Нельзя определять протокол между каждой парой участников только по URL. Между браузером и прокси может быть один протокол, а между прокси и источником: другой. Прокси, принимающий HTTP/1.1 CONNECT, может переносить TLS-сеанс HTTP/2 как непрозрачные байты. Прокси с поддержкой HTTP/2, напротив, может использовать расширенный CONNECT. При диагностике записывайте каждый переход отдельно.

Туннели CONNECT, TLS и разрешение имён

CONNECT - метод создания туннеля к authority назначения. Это не произвольный URL с путём, а обычно хост и порт, чаще всего 443 для HTTPS. После успешного ответа прокси перестаёт обрабатывать HTTP-сообщения и пересылает данные в обоих направлениях до закрытия соединения.

Что видит прокси

В обычном HTTPS-туннеле прокси видит сам запрос к прокси, включая целевой хост и порт, а также метаданные соединения. Он не может прочитать зашифрованный HTTP-путь, cookies, значения авторизации и тело ответа. При этом он может применять политику по назначению, ограничивать порты, максимальную длительность или закрывать туннель.

Проверка TLS-сертификата в end-to-end-туннеле выполняется браузером. Браузер проверяет имя, срок действия и цепочку доверия для хоста источника. Сертификат прокси не участвует, если только развёртывание специально не выполняет TLS-перехват. Перехват меняет модель доверия и требует доверенного центра сертификации в профиле браузера; это отдельная архитектура, которую нужно документировать и тестировать.

SNI и другие детали TLS-handshake могут раскрывать предполагаемый хост сетевому наблюдателю; это зависит от версии TLS и включённых функций приватности. Прокси, который лишь пересылает байты, не устраняет такие сигналы. Приватность DNS, приватность TLS и HTTP-проксирование связаны, но являются разными средствами контроля.

Где выполняется DNS

Разрешение имён часто вызывает путаницу. При HTTP-прокси браузер может передать имя хоста в абсолютном URI или authority CONNECT и предоставить прокси разрешить его. Некоторые реализации сначала разрешают имя локально, например для локальной политики или выбора семейства адресов. Точное поведение зависит от браузера, типа прокси и настроек.

При локальном разрешении локальный resolver узнаёт назначение, даже если последующее TCP-соединение идёт через прокси. Разрешение на прокси оставляет запрос там, но не гарантирует, что все вспомогательные запросы идут тем же путём. Проверки отзыва сертификатов, captive portal, DNS-prefetch, спекулятивные соединения и расширения могут иметь отдельное сетевое поведение.

Если расположение DNS важно, тестируйте не только навигацию из адресной строки. Проверьте холодный профиль, новый процесс браузера, перенаправление на другое имя, iframe, worker и ошибочное разрешение. Справочник HTTP в MDN помогает отделить семантику HTTP от планирования сети браузером.

Заголовки, аутентификация и политика пересылки

У HTTP-заголовков разные адресаты в конфигурации с прокси. Одни описывают запрос источнику, другие: соединение с прокси, третьи добавляются посредниками. RFC 9110, раздел 5 задаёт общие правила полей и предупреждает, что посредники должны осторожно обрабатывать hop-by-hop-поля.

Аутентификация прокси не равна аутентификации источника

Прокси, которому нужны учётные данные, отвечает 407 Proxy Authentication Required и включает Proxy-Authenticate. Клиент отвечает Proxy-Authorization. Источник, требующий учётные данные, отвечает 401 Unauthorized, использует WWW-Authenticate и ожидает Authorization.

Эти вызовы происходят в разное время. Для HTTP URL вызов прокси может прийти до пересылки запроса. Для HTTPS он обычно является ответом на CONNECT, до начала TLS. Браузер может повторить соединение с учётными данными, но библиотека автоматизации выдаст ошибку навигации, если прокси не настроен через поддерживаемый API.

Не помещайте учётные данные источника в поле прокси и учётные данные прокси в Authorization, предназначенный сайту. У них разные области действия, и их часто записывают разные системы. Используйте защищённое хранилище учётных данных или документированный механизм конфигурации прокси браузера, а не создавайте заголовки в JavaScript страницы.

Поля пересылаемой идентичности

Посредники часто используют Via, Forwarded и X-Forwarded-For, но их наличие: вопрос политики. Прокси может добавить, сохранить или удалить их. Forwarded способен описывать адрес клиента, протокол и хост при прохождении запроса через посредников. Поскольку эти поля могут содержать чувствительные сетевые данные, доверяйте им только от известных переходов прокси.

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

Поля hop-by-hop и end-to-end

Некоторые поля описывают одно соединение и не должны пересылаться через прокси без изменений. Поле Connection в HTTP/1.1 может перечислять hop-by-hop-поля; прокси удаляет или использует их перед пересылкой. End-to-end-поля, например Cache-Control, предназначены для пути до источника и обратно с учётом обычного поведения посредников.

Это важно при отладке. Заголовок в инструментах разработчика может отличаться от полученного источником. И наоборот, прокси может добавить поле, которого страница не создавала. Если различие важно, захватите обмен браузер-прокси и проверьте журнал на стороне источника.

Возможности браузера, создающие дополнительные запросы

Загрузка страницы: последовательность, а не один запрос. Основной документ может запросить стили, скрипты, изображения, шрифты, frames, preload, workers, manifest и API. Для каждого URL выбираются отдельное назначение и состояние кэша. Политика, работающая для документа, может сломаться на хосте шрифта или API.

Перенаправления: распространённый пример. Ответ 301, 302, 303, 307 или 308 заставляет браузер отправить новый запрос к другой authority. Обработка метода и тела зависит от кода и правил браузера. Новый запрос по-прежнему использует настроенный прокси, но может потребовать нового DNS-запроса, нового решения об аутентификации и нового TLS-туннеля.

Cookies тоже пересекают границы запросов. Set-Cookie от одного хоста влияет на следующие запросы по правилам domain, path, secure и same-site. Прокси видит cookies в открытом HTTP, но не внутри HTTPS-туннеля. Журнал, где записан только первый запрос, не объяснит все последующие изменения состояния.

Сервис-воркер добавляет ещё один уровень. После установки он может вернуть fetch из кэша или программно создать запрос. Отсутствие записи в сети не доказывает обход прокси: возможно, сеть не понадобилась. Обратная ситуация также возможна: воркер обращается к API-хосту, которого нет в исходном документе.

Не-HTTP-трафик требует отдельной проверки. WebSocket начинает с HTTP-handshake, но затем становится долгоживущим двунаправленным потоком. Медиа- и data-каналы WebRTC используют ICE и могут обращаться к STUN- или TURN-серверам вне обычного HTTP. Документация WebRTC API в MDN объясняет, почему такие потоки нужно тестировать отдельно. Руководство, охватывающее только GET и CONNECT, не является полной сетевой инвентаризацией.

Практический метод проверки

Надёжная проверка сравнивает намерение браузера, полученное прокси и наблюдение источника. Следующая последовательность разделяет эти наблюдения.

1. Создайте базовый вариант

Начните с прямого соединения в чистом профиле браузера. Откройте HTTP- и HTTPS-URL, запишите конечный URL после перенаправлений и согласованный протокол, если браузер его показывает. Сохраните статус, нужные заголовки запроса и время. При сравнении изменений прокси не используйте прогретый кэш.

2. Проверьте handshake прокси

Используйте журнал доступа прокси или контролируемую тестовую конечную точку. Для HTTP подтвердите получение absolute-form. Для HTTPS подтвердите CONNECT с ожидаемой authority и успешный ответ туннеля. 407 означает незавершённую аутентификацию прокси. Отказ или timeout указывают на проблему маршрута или политики до обращения к источнику.

3. Проверьте вид источника

Пусть назначение запишет исходный адрес, Host, forwarding-поля, версию протокола и путь запроса. Сопоставьте запись с журналом прокси. При рабочем маршруте источник должен видеть исходящий адрес прокси, а не локальный адрес браузера, если только посредник намеренно его не пересылает.

4. Проверьте граф запросов

Откройте страницу с перенаправлением, cross-origin изображением, шрифтом, iframe, worker и fetch-вызовом. Добавьте несуществующее имя и хост с записями IPv4 и IPv6. Это показывает, одинаково ли работают разрешение имён, выбор семейства адресов и аутентификация прокси после первого документа.

5. Повторите с прогретым состоянием

Повторите навигацию после создания cookies, сервис-воркера и записей кэша. Сравните сетевые запросы с холодным запуском. Исчезнувший запрос может означать попадание в кэш, а не изменение маршрута. Между контролируемыми опытами очищайте состояние и записывайте, какое состояние использовалось.

Частые симптомы и их значение

Если HTTP-страницы открываются, а HTTPS нет, проверьте авторизацию CONNECT, политику целевого порта и ошибки TLS-сертификата. Если документ загружается, но API не работает, проверьте имя API-хоста, ответ CORS и не обработал ли вызов сервис-воркер. Если не работают только некоторые домены, сравните их DNS-записи и список разрешённых адресов прокси. Неожиданный адрес клиента на источнике требует проверки Forwarded и X-Forwarded-For на каждом посреднике.

Не считайте одну внешнюю страницу «мой IP» полной проверкой. Она измеряет один HTTP-путь и может быть закэширована, перенаправлена или обслуживаться CDN. Проверки по стандартам и журналы обеих сторон дают намного более надёжное объяснение поведения браузера.

Выбор конфигурации для согласованных запросов

Используйте HTTP-прокси, если нужна обычная схема прямого проксирования и поставщик поддерживает HTTP- и HTTPS-направления. Выбирайте SOCKS, когда провайдеру или приложению нужен более общий TCP-релей; заранее уточните, где разрешается имя хоста. Руководство по конфигурации прокси описывает URL для разных протоколов и работу с учётными данными в BotBrowser.

Держите один источник истины для настроек прокси. Смешивание прокси командной строки, proxy-объекта фреймворка автоматизации и перехвата запросов на уровне страницы создаёт конфликтующие маршруты. Настройте учётные данные через поддерживаемый интерфейс браузера или фреймворка и подтвердите результат (407 и CONNECT) по журналам.

Согласуйте географический выход прокси с ожиданиями приложения, если от региона зависит контент, но не считайте, что IP определяет все сигналы браузера. Локаль, часовой пояс, язык, DNS, WebRTC и семейство адресов могут быть независимыми. Для WebRTC используйте отдельный тест из руководства об утечке IP WebRTC.

Наконец, документируйте границы сервиса прокси: принимаемые протоколы, разрешённые порты, место разрешения DNS, ротацию учётных данных, добавляемые заголовки и срок хранения журналов. Такой операционный контракт превращает расплывчатую «проблему прокси» в проверяемый путь запроса.

Семантика HTTP-прокси предсказуема, если определить каждый переход. Читайте форму запроса, различайте 407 и 401, понимайте, когда CONNECT создаёт туннель, и проверяйте полный граф запросов браузера. Это упрощает отладку автоматизации и обычного просмотра без предположений о том, что прокси делает «за кулисами».

Источники

#Http#прокси#Browser#Networking#приватность

Переведите BotBrowser из исследований в продакшн

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