Перейти к содержимому

Отпечаток устройства: 5 сигналов, которым можно верить

Отпечаток устройства: 5 сигналов, которым можно верить

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

Код: Fingerprint-JS, лицензия MIT.

@globus.studio/fingerprintjs работает в браузере, собирает сигналы и отделяет устойчивый идентификатор от доказательств вокруг него.

Набор 1: устойчивое ядро

Сигналы среды, локали, экрана и железа: семейство браузера, client hints, язык, часовой пояс, метрики экрана, число потоков, поддержка касаний, архитектура.

Они меняются редко и медленно. Из них складывается visitorId, и стабильность это причина их выбора: идентификатор, который переезжает каждую неделю, бесполезен для постоянного клиента.

Набор 2: доказательства вне хеша

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

Ни один из них по умолчанию не входит в visitorId, и hashComponents() следует тому же правилу. Сигнал бота, который менял бы идентификатор, давал бы одному человеку две личности в момент, когда браузер обновил способ обнаружения.

Набор 3: согласованность заявлений

Следы подмены сравнивают, что браузер заявляет и что делает: пропатченный нативный API, платформа, которая расходится с client hints, нулевые размеры экрана, пустая глобальная переменная Chromium.

Это отчёт, а не блокировка. Решение, пропатченный canvas.toDataURL это расширение приватности или скрапер, принимает сервер, у которого есть контекст, недоступный странице.

Набор 4: взгляд сервера

@globus.studio/fingerprintjs/server пересчитывает хеш, проверяет токен повтора и добавляет сетевой риск со своей стороны. Браузер не видит репутацию своего IP, а клиент, который врёт о сигналах, не может соврать про адрес, с которого соединяется.

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

Набор 5: уверенность как число

Уверенность сбора показывает, какая часть разрешённых сборщиков сработала, а уверенность идентичности поправляет на стабильность платформы. Результат с половиной заблокированных сборщиков это результат с низким баллом, а не результат с неверным идентификатором.

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

Что остаётся за рамками

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

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

Что команда спрашивает первым

Узнают ли того же клиента через месяц? Честный ответ «скорее всего, если устройство и браузер не менялись», и балл уверенности говорит, сколько веса этому ответу придавать.

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

Третий вопрос про мобильные сети: человек, который едет из дома в офис, даёт два адреса и два отпечатка, и правило «новое устройство, значит второй фактор» срабатывает на нём каждый день.

Сколько это стоит

Браузерный бандл меньше 65 КБ, без зависимостей в рантайме, без сетевых вызовов по умолчанию, с тестами в Chromium, Firefox и WebKit и покрытием 100%.

Для продукта цена это проверка приватности: отпечаток это псевдонимизированные персональные данные, и выбор профиля принадлежит этому документу. Профиль strict с ясной политикой хранения это защитимая позиция, максимальный сбор без записи нет.

Рядом: серверный фингерпринтинг о серверной половине и разработка на PHP о том, как считается интеграция.