navigator.connection без разрешения выдаёт effectiveType, downlink и rtt — а поддержка только в Chromium сама по себе сигнал.
Большинство сигналов фингерпринтинга описывают ваше оборудование или программное обеспечение. Network Information API описывает нечто совсем иное: само соединение, по которому загружается страница — его грубый класс скорости, измеренное время round-trip и включён ли у вас режим экономии трафика. Ничего из этого не требует запроса разрешения, а в браузерном движке, где API реализован, любая страница может прочитать это в момент загрузки.
Ключевые выводы
navigator.connectionраскрываетeffectiveType,downlink,rttиsaveDataбез единого запроса разрешения — любой скрипт может считать грубый класс скорости вашего соединения при загрузке страницы.- Значения намеренно округлены и разбиты на диапазоны, а не выданы напрямую — это ослабляет их пригодность для фингерпринтинга, но диапазон, в который вы попадаете, в сочетании с десятками других сигналов всё равно добавляет измеримую энтропию к совокупному отпечатку.
- Поддержка есть только в Chromium. Chrome, Edge, Opera и Samsung Internet реализуют API; Safari и Firefox не реализуют ни
NetworkInformation, ниnavigator.connection. - Этот разрыв сам по себе является сигналом — скрипт может использовать сам факт наличия или отсутствия
navigator.connectionкак грубую, трудно подделываемую проверку движка, независимую от того, что заявляет строка User-Agent. - Проверка отпечатка от BrowserInsight показывает, какие сетевые атрибуты раскрывает именно ваш браузер, наряду со всеми остальными сигналами вашего отпечатка.
navigator.connection: effectiveType, downlink, rtt, saveData
API прикрепляет единственный объект NetworkInformation к navigator.connection. Там, где он реализован, чтение занимает одну строку и не требует никакого взаимодействия с пользователем:
const conn = navigator.connection;
console.log(conn.effectiveType); // "4g", "3g", "2g" или "slow-2g"
console.log(conn.downlink); // оценка пропускной способности в Мбит/с, округлённая до ближайших 25 кбит/с, затем разбитая на диапазон
console.log(conn.rtt); // оценка времени round-trip в мс, округлённая до ближайших 25 мс, затем разбитая на диапазон
console.log(conn.saveData); // true, если пользователь включил режим экономии трафика
Работу выполняют четыре свойства. effectiveType — это собственная классификация браузера, относящая ваше соединение к одному из четырёх поколенческих диапазонов — slow-2g, 2g, 3g или 4g — на основе недавно замеренных значений rtt и downlink, а не реальной используемой радиотехнологии; урезанное по скорости Wi-Fi-соединение вполне может показать "3g". downlink — это оценочная эффективная пропускная способность, а rtt — оценочная задержка round-trip до текущего сервера; оба значения строятся на основе недавних реальных сетевых передач браузера, а не свежего замера, специально проведённого для этой страницы. saveData попросту отражает, включён ли у пользователя режим «Экономия трафика» на уровне ОС или браузера. Некоторые сборки Chromium также раскрывают поле type (wifi, cellular, ethernet, bluetooth, none или unknown), хотя его доступность зависит от платформы.
Грубое профилирование и энтропия
Авторы спецификации прямо указали, что сырые, непрерывно обновляемые числа пропускной способности и задержки сами по себе были бы мощным вектором фингерпринтинга — показатель реальной пропускной способности в конкретный момент почти уникален для конкретного сетевого маршрута. Именно поэтому downlink и rtt округляются и разбиваются на диапазоны, а не сообщаются с полной точностью, и именно поэтому effectiveType сжимает всё в лишь четыре грубых уровня. Это реальная мера снижения риска, а не формальность.
Тем не менее, к нулю вклад это не сводит. Четырёхвариантный effectiveType, диапазон rtt, диапазон downlink и булев флаг saveData вместе всё же образуют скромное число различимых состояний — небольшое по сравнению с хешем canvas, но не нулевое, если сложить его с совокупным отпечатком наряду с параметрами экрана, шрифтами и выводом WebGL. Ценность этого сигнала для отслеживания заключается не столько в сырой энтропии, сколько в стабильности и корреляции между контекстами: одно и то же физическое соединение обычно сообщает один и тот же диапазон effectiveType/rtt на разных сайтах и даже в разных вкладках, открытых примерно в одно время, что даёт трекеру слабую, но бесплатную подсказку о том, что две сессии могут делить одну сеть — полезно для связывания активности между источниками даже тогда, когда cookie и хранилище разделены по сайтам. Это ещё и проверка на правдоподобие: сессия, заявляющая о соединении «4g» с задержкой до жилого IP-эндпоинта провайдера менее 20 мс, выглядит противоречиво — точно так же, как техника несовпадения геолокации по IP и часового пояса выявляет не единичный сигнал, а противоречие между независимыми сигналами.
Поддержка только в Chromium как отдельный сигнал
Охват этого API — как раз то, что легко упустить. Таблица совместимости на caniuse.com показывает глобальную поддержку примерно в диапазоне 75–80% — не потому что это нишевая или экспериментальная функция, а потому что она реализована в каждом браузере на базе Chromium и ни в одном другом. Safari никогда не реализовывал NetworkInformation; Firefox много лет назад ненадолго добавлял раннюю версию за флагом, а затем убрал её — сегодня ни один из этих браузеров не раскрывает navigator.connection. Репозиторий спецификации WICG, определяющий этот API, сам размещён под эгидой Web Incubator Community Group, тесно связанной с Chromium, а принятие вне этой экосистемы так и не состоялось.
Эта асимметрия полезна именно потому, что не зависит от того, что скрипт считывает из значений соединения — она зависит только от того, существует ли navigator.connection вообще. Страница может проверить 'connection' in navigator как почти мгновенный сигнал без разрешений, сужающий движок браузера до «некоторая сборка Chromium» против «не Chromium», независимо от того, что заявляет строка User-Agent или User-Agent Client Hints. Это делает его небольшой, но по-настоящему полезной перекрёстной проверкой из того же семейства, что фингерпринтинг стека TCP/IP или TLS-фингерпринтинг: такие сигналы трудно убедительно подделать, потому что для этого нужно либо реально запускать соответствующий движок, либо тщательно воспроизводить поведение, которое большинство инструментов подмены даже не пытаются трогать. Скрипт, подделывающий строку UA под Safari, но при этом всё ещё получающий реальный объект navigator.connection, тихо противоречит сам себе.
Соображения приватности
Этот сигнал не требует таких агрессивных мер защиты, как canvas- или WebGL-фингерпринтинг, во многом потому, что риск уже ограничен самой конструкцией API:
- Разбиение на диапазоны действительно работает. Поскольку
downlinkиrttуже округлены и квантованы, а не выданы в сыром виде, дополнительно самостоятельно их маскировать смысла особого нет — спецификация уже устранила ту высокоточную версию сигнала, которая имела бы значение больше всего. - Браузеры, ориентированные на приватность, уже устраняют эту поверхность. Поскольку Firefox и Safari вообще не реализуют этот API, использование любого из них полностью устраняет этот вектор — без какой-либо настройки.
- У пользователей Chromium меньше прямого контроля. У страниц нет видимого пользователю переключателя, скрывающего
navigator.connection, как это есть для доступа к камере или геолокации, потому что этот API изначально не был встроен в модель разрешений — он был спроектирован достаточно безопасным, чтобы такая модель не требовалась. - Относитесь к нему как к одному из многих слабых сигналов. В сочетании с геометрией экрана, шрифтами и WebGL это лишь небольшое приращение к более широкому отпечатку — стоит знать о нём, но не стоит из-за него переживать в одиночку.
- Проверьте, что раскрывает ваша конфигурация. Проверка отпечатка от BrowserInsight покажет, присутствует ли
navigator.connectionв вашем текущем браузере, что он сообщает, и остальной набор раскрываемых вами сигналов.
Часто задаваемые вопросы
Требует ли Network Information API запроса разрешения?
Нет. Там, где он поддерживается, navigator.connection и его свойства доступны для чтения любому скрипту при загрузке страницы, без жеста пользователя, диалога или явного разрешения — в отличие от геолокации или доступа к камере.
Может ли сайт узнать мою точную скорость интернета через этот API?
Нет, не с точностью. downlink и rtt намеренно округлены и разбиты на диапазоны спецификацией, а effectiveType сообщает лишь один из четырёх грубых поколенческих уровней. Вы получите приблизительный класс соединения, а не измерение уровня полноценного теста скорости — для этого сайту пришлось бы реально передать данные и замерить время, как это делает тест скорости интернета от BrowserInsight.
Почему Firefox и Safari не поддерживают этот API?
Оба браузера попросту никогда не выпускали его как стабильную функцию; Firefox пробовал раннюю версию за флагом и затем убрал её. Сегодня поддержка ограничена браузерами на базе Chromium — включая Chrome, Edge, Opera и Samsung Internet — что также задокументировано на caniuse.com.
Можно ли заблокировать этот сигнал расширением браузера?
Косвенно да — расширение, блокирующее выполнение JavaScript или удаляющее navigator.connection до запуска скриптов страницы, закроет его, но выделенного, широко используемого расширения именно под этот API не существует, поскольку его вклад невелик по сравнению с сигналами canvas, WebGL и шрифтов. Использование Firefox или Safari устраняет этот сигнал вообще без каких-либо расширений.
Заключение
Network Information API — хороший пример сигнала фингерпринтинга, изначально спроектированного небольшим, но всё равно заслуживающего понимания. Его авторы явно предвидели риск и разбили значения на диапазоны, чтобы его ослабить, так что один только navigator.connection вас не идентифицирует. Что он добавляет — это грубую подсказку о стабильности между контекстами, наслаивающуюся на гораздо более крупный совокупный отпечаток, и, что не менее важно, бесплатную, трудно подделываемую проверку того, какой движок браузера вы на самом деле используете, поскольку полноценно его реализует только Chromium. Ни то, ни другое не требует специальной защиты: этот сигнал в основном закрывается заодно с тем, что вы уже делаете для управления остальной частью своего отпечатка браузера.
Рекомендуем прочитать:


