Основная идея - собирать косвенные данные, доступные из браузера, до куда дотянешься.
* обход прокси и vpn (частично) - webrtc, позволяет получить данные о локальном ip адресе и даже попытаться подключиться к своему веб-приложению, запущенному в другом браузере на этом же компьютере или в локальной сети (т.е. если у вас запущено два браузера, один анонимный а другой нормальный, то webrtc позволит это отследить)
* данные о машине - webgl (данные о видеокарте, в т.ч. внутри виртуальной машины или нет), битность операционной системы и в принципе саму операционную систему, размер экрана (разрешение монитора), размер шрифтов (размер пиксела для retina-like экранов)
* наличие и отсутствие плагинов в браузере, каждый плагин кстати может дать индивидуальные данные (можно попытаться вызвать публичные методы плагина, интерпретировать результат и т.п. многие разработчики очень безалаберно относятся к информации)
* кеш (в пределах одного браузера) и тайминги (наличие кеширующего прокси)
* данные о локальной сети (часто vpn на локальном компьютере не закрывает доступ этого компьютера в локальную сеть), например при типичных конфигурациях, у 99.(9) частников роутер это 192.168.0.1 или 192.168.1.1, к нему можно делать get/post ajax запросы, определить модель версию прошивки и даже попытаться подобрать пароль (взломанный роутер это вообще джекпот), помимо роутера есть много много http служб на нестандартных портах, которые запускают различные не шибко умные разработчики сервисов, часто в windows экосистеме, даже антивирусы этим балуются - наличие таковых уже четкий маркер, то же самое для других машин в сети, само наличие или их отсутствие уже маркер...