Evercookie. Ранее для таких задач было популярным решение
Evercookie (
github,
статья 1,
статья 2). Это решение и на данный момент используется на различных проектах, над которыми я работал. Если кратко, это «стойкие cookie», которые сохраняются множеством различных способов, и которые сложнее очистить. В прошлом это решение позволяло получать значение таких cookie даже работая в разных браузерах или даже после переустановки браузера.
Для борьбы с Evercookie, существуют например приложения, которые умеют чистить такие «стойкие cookie» (предполагаю, что
Bleachbit одно из таких приложений).
Fingerprint. Другие более современные решения, которые можно использовать отдельно и совместно c Evercookie — это Anonymous browser Fingerprint, которые уже указали здесь ранее. Они работают на основе отпечатков браузера/ОС/девайса и т. п.
Статья по теме. Одной из популярных библиотек является
Valve/fingerprintjs2.
Для борьбы с Fingerprint клиентские приложения научились предотвращать автоматическое считывание Fingerprint, уведомлять о таких попытках пользователей и даже делать подсказки пользователям, как работать в интернете, чтобы оставаться анонимным и Fingerprint невозможно было получить. Ещё одну проблему с этим решением можно почувствовать на мобильных устройствах, среди которых возможны нередкие совпадения отпечатков, но тут спасает сочетание различных техник.
И дополнительно можно почитать про
определение локальных IP-адресов через WebRTC.