Отпечаток устройства: 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 о том, как считается интеграция.
