Нет Cookies, нет проблем — использование ETag для отслеживания пользователей

Original author: Nicolas Hinternesch
  • Translation
Работая старшим консультантом по дижитал-аналитике в ведущем международном аналитическом агентстве, с огромным интересом наблюдаю за нынешним крестовым походом современных веб-браузеров против технологии cookie.

Оказывается, есть способ отслеживать отдельных не вошедших в систему пользователей без использования файлов cookie. Я тоже реализовал это. Сейчас покажу как.


Для наглядности я создал демо-сайт. Вот он.

Нажмите на каждую из трёх кнопок Page → На всех трёх один и тот же идентификатор.
Закройте окно браузера и снова откройте сайт → Идентификатор не поменялся.
Выключите компьютер и зайдите на эту веб-страницу завтра → Идентификатор всё тот же.
Проверьте ваши куки → Демо-сайт не записывает куки и не считывает их.
Проверьте URL → Сомнительные строки запроса отсутствуют.

Итак, как именно я могу хранить идентификатор и узнавать, что вы с определённого устройства возвращаетесь на сайт, при этом без входа в систему и без использования куки?
EDISON Software - web-development
Мы в EDISON со всеми этими нюансами приватности сталкиваемся постоянно.


Наш новый выполненный проект — «Резидент Такси» — в котором мы связали в единое целое сайт агрегатора-такси, CRM-систему, блок контроля водителей и автомобилей, мобильные приложения для iOS и Android.

Однако, всегда учитываем: безопасность каждого пользователя — это святое ;-)

Cookies используются всё меньше


Если вы достаточно активный пользователь интернета, вы наверняка так или иначе сталкивались с бесконечными дискуссиями относительно файлов cookie и о том, как они используются. В настоящее время браузерные технологии всё чаще отказываются от куки — тем паче что сейчас всё строго зарегламентировано правилами конфиденциальности, такими как GDPR или CCPA. Хотя это, безусловно, прогресс, так как является важным шагом на пути к более ориентированному на конфиденциальность интернету, однако с другой стороны также наносит огромный урон основной функциональности большинства веб-сайтов, их UX, экономической структуре интернета и индустрии дижитал-аналитики. Хотя в техническом аспекте использование cookie-файла браузером в качестве идентификатора для возвращающегося пользователя весьма надёжно, есть и другие веб-технологии, основанные на хранении информации на локальном компьютере.

Роль кэша


Вот кэш. По сути, веб-кэширование означает хранение данных из интернета на вашем устройстве, поэтому браузер может повторно использовать эти данные позже, когда тот же ресурс запрашивается снова. Например, когда пользователь загружает веб-страницу впервые, сервер страницу полностью отправляет браузеру. Когда страница закэшируется, и пользователь запрашивает ту же страницу снова на следующий день, браузер запоминает её, и серверу не нужно отправлять ее снова, страница в браузере может быть сразу отображена из кэша. Это гораздо быстрее, да и обеспечивает высокую пропускную способность. В целом, технология кэширования значительно увеличивает скорость доставки веб-контента, а также значительно сокращает объём работы, выполняемой на стороне сервера.

Кэширование может быть выполнено с использованием ETag. Это такие идентификаторы, которые прикрепляются к каждому ресурсу, предоставляемому сервером (например, веб-странице или изображению). Таким образом сервер выясняет, кэшировал ли пользователь самую новую версию ресурса. Когда ресурс на сервере изменяется, для этого ресурса создается новый идентификатор ETag.

  • Понедельник.
    Пользователь заходит на веб-сайт впервые. → В запросе отсутствует ETag. → Страница сайта отправляется в браузер с ETag 123. → Сайт сохраняется (кэшируется) на локальном устройстве.
  • Вторник
    Пользователь снова заходит на тот же сайт → ETag 123 включён в исходящий запрос → Сервер проверяет, изменился ли ресурс («Идентификатор ETag остается прежним?») → Если ETag не изменился, сервер инструктирует браузер: просто используйте сайт, который был уже доставлен и кэширован в понедельник. → Нет необходимости веб-ресурс пересылать повторно, время и трафик экономятся. Profit.

Использование технологии кэширования для отслеживания и идентификации пользователей


Хотя ETag предназначен именно для кэширования, эта функция также может быть взломана и преднамеренно использована для отслеживания пользователей.

Вот как это сделал я в моём примере:

  • Создаётся простой сайт с тремя страницами.
  • Вставляется один и тот же iFrame на каждую страницу. Этот iFrame — просто белый пиксель 1x1, который невидим для пользователя.
  • Когда запрашивается этот веб-ресурс iFrame, с помощью PHP генерируется случайный идентификатор на стороне сервера. Я использую этот идентификатор, чтобы переопределить идентификатор ETag для iFrame, который обычно сервером выдаётся автоматически.
  • Каждый раз, когда пользователь запрашивает одну из трёх страниц (и, следовательно, запрашивает iFrame), мой идентификатор ETag включается в запрос. Затем проверяется на стороне сервера, существует ли этот идентификатор или это первый запрос без ETag.
  • → Если ETag существует: значит, это вернувшийся посетитель. Можно зафиксировать как удостоверение его личности.
  • → Если ETag не существует: это новый посетитель. Новый ID. С этого момента этот идентификатор будет включен во все заголовки запросов устройства этого пользователя на сайте.
  • В качестве последнего шага — вот как этот ETag ID попадает в аналитику:
    я беру ID из заголовков запроса/ответа в iFrame на стороне сервера. Невидимый для пользователя, этот iFrame теперь содержит идентификатор пользователя. Затем я использую JavaScript на стороне клиента и просто включаю этот идентификатор в свой запрос отслеживания аналитики вместо идентификатора файла cookie.



Поиск ETag ID iFrame с помощью Chrome DevTools.

Как предотвратить отслеживание с помощью ETag


Это может быть достаточно непросто. Здесь не используются куки или локальное хранилище браузера. Работает без участия JavaScript. И не используется User-Agent.

Однако у пользователей есть несколько вариантов защиты от отслеживания ETag:

  • Отключите в настройках браузера кеширование.
    Тут следует соблюдать осторожность — как пояснялось выше, кеширование может быть очень полезным и имеет много преимуществ.
  • Модифицируйте заголовки headers с помощью надстройки браузера.
    Хотя большинство браузеров изначально не предоставляют возможность изменять headers, для этой задачи существует множество доступных расширений браузера, таких как ModHeader. Почему это работает? Функциональность ETag опирается на заголовки запроса и ответа для обмена идентификатором. Например, если пользователь перезаписывает заголовок If-None-Match, чтобы он был пустым при каждом запросе, новое значение ETag будет генерироваться при каждом запросе страницы. Это предотвращает идентификацию устройства пользователя.




Почему это важно


Почему я проверяю эти вещи? Почему я написал эту статью? Я, разумеется, не намерен использовать это в широких масштабах. Но хотя ETag может использоваться и нехорошими людьми, этот пример демонстрирует важную мысль: как и большинство других технологий, по умолчанию ETag не обязательно вреден. В зависимости от того, для каких целей это используется.

Я считаю, что для всех важно знать, про существование подобных методов. И что они могут быть использованы. Было довольно много случаев, когда сайты использовали ETag незаконно. Некоторые из этих инцидентов были даже урегулированы в суде. И вполне вероятно, что подобные методы будут всё чаще использоваться перепуганной рекламной индустрией, которая наблюдает за тем, как рушится один из её столпов: coockie.

Один из многих (безопасных) примеров ETag в интернете можно найти, к примеру, в политике конфиденциальности сети быстрого питания Wendy в отношении файлов cookie и технологий отслеживания:


С помощью ETag можно генерировать уникальные значения отслеживания, даже если пользователь блокирует файлы cookie HTTP, Flash и/или HTML5.

Подобное объявление, похоже, является примером того, как многие сайты используют ETag в своей политике конфиденциальности. Чтобы было ясно: это само по себе не является ни плохим, ни незаконным. Конечно, значения ETag должны быть уникальными. В этом весь смысл их работы в целях кэширования. Однако этот раздел сформулирован очень расплывчато и неоднозначно, особенно когда речь идет о том, используются ли эти значения ETag для отслеживания или нет. И лично я считаю это проблемой. При запросе в отдел конфиденциальности Wendy, они ответили стандартным электронным copy-paste письмом, подтверждающим, что ETag не используются для отслеживания. Политика конфиденциальности, однако, оставляет эту дверь широко открытой. И это то, что меня беспокоит.

Я верю в открытую и прозрачную передачу знаний в отрасли — среди поставщиков аналитики, издателей, рекламщиков и пользователей Интернета. ИМХО, отсутствие открытости является одной из основных причин, по которой мы все оказались втянуты в эту грязную войну с cookie-файлами: интернет-экосистема всегда страдала от недостатка прозрачности, технологии развивается слишком быстро, чтобы законодательство успевало за ними, и люди не понимают многочисленные тонкости веб-технологий, наподобие файлов cookie. И когда технологии используются ненадлежащим образом, пользователь по понятным причинам чувствует себя уязвлённым. Но запрет технологии оказывается классическим случаем борьбы с симптомами, а не с причиной. Тот факт, что многие технологические компании злоупотребляют такими технологиями, как файлы cookie, формирует несправедливое отношение к технологии со стороны общественности. Что, в свою очередь, приводит к несоразмерным мерам со стороны разработчиков браузеров и законодательства. Хотя эти меры нацелены на обеспечение приватности, они в то же время наносят вред хорошим и значимым инновациям.

Всегда есть нюансы. Я твёрдо верю в законность и важность серьёзной дижитал-аналитики — до тех пор, пока она выполняется с должным уровнем соблюдения конфиденциальности. Что происходит после, когда магазин законно идентифицировал посетителя? ETag, безусловно, можно использовать в разных целях. Но одно можно сказать наверняка: эта тема никогда не станет скучной.
Edison
Изобретаем успех: софт и стартапы

Comments 62

    +6
    Вроде давно известный факт, ещё со времён EverCookie, разве нет?
      +11
      С одной стороны не вчера ETag появились. С другой — вот лично я только сегодня о их существовании узнал. Давно используемая, но совершенно не афишируемая технология, в отличие от coockies.
        +7
        Это вы ещё про HSTS-кэш не слышали =)
          +5
          HSTS кеш, ETag, Cookies, LocalStorage, Browser Fingerprint и т.п., используемые для отслеживания пользователя, — предмет регулирования GDPR и закона о Cookies

          Манипуляции названием технологии вряд ли уберегут от возможных исков и штрафов, подобных штрафам за cookies
          +4
          Ctrl F5 его(ETag) меняет.
            –10
            Тоже :)
            Да, лажанул автор со своим eTag :)
              +14
              Вообще говоря, подавляющее большинство пользователей не использует Ctrl+F5 для постоянной перезагрузки страницы (и даже просто не в курсе о такой комбинации клавиш). Может условный 1% пользователей и «противостоит» слежке таким образом, но за остальными 99% можно следить, используя ETag.
            0
            ctrl+shift+R быстро лечат

            EDIT: ах да, уже написали…
          +2
          Нет — закрыл/открыл браузер — ид разные. (последняя версия Mozilla FireFox)
            +2
            Это от настроек зависит, да хоть даже вышеупомянутое в статье элементарное отключение кеширования.

            Я запустил в последней Мозилле, ID сохраняются
              +3
              Firefox Android. Закрыл браузер свайпом — ид сменился.
              0
              Заголовок спойлера

              image


              тоже

              +2
              А почему используется именно iframe? Не просто картинка, скажем…
                +4
                Не знаю почему автор оригинальной публикации пошёл по этому пути, рискну предположить, что на стороне сервера переопределить ETag для веб-страницы по каким-то причинам проще, чем для изображения.
                  0
                  имхо серверу абсолютно все равно какой content-type отдавать по http…
                  +17
                  Ну, начнём с того, что автор для страницы со строкой и тремя кнопками подключил Bootstrap и jQuery…
                    +1
                    Потому, что из iframe на стороне браузера проще достать идентификатор, чем из картинки.
                      0
                      А зачем это все на стороне браузера? Только для этого примера?
                        0

                        Он же говорит: чтобы потом отдать этот идентификатор скрипту аналитики.

                    +1
                    Кэширование на RAM-диске без сохранения кэша ломает всю малину :)
                      +1
                      У меня так и настроен Firefox. Кеш в RAM, гарантированно сотрётся при перезапуске браузера. Да ещё и размер пару сотен мегабайт. Хватает, чтобы получить ускорение от кеширования, но через небольшое время старые файлы вытесняются.
                      –10

                      image
                      Пожалуйста, отслеживайте, отслеживайте...

                        –1
                        за что его так сильно минусят? Он ведь указал, что система не только не идеальна, но и блокируема тоже
                          +3
                          Блокируя js, вы можете заблокировать всю функциональность сайта. В итоге, либо придётся включить js, либо не пользоваться сайтом.
                        0
                        Затем я использую JavaScript на стороне клиента…

                        Работает без участия JavaScript.

                        Как-то я завис в этом месте.

                          +3
                          Наверное, JavaScript используется именно для кнопок, а не для отслеживания с помощью ETag.
                          +1

                          Одна часть интернета идет по пути надежной и простой аутентификации oAuth, OpenId, BrowserId и т.п. Другая неожиданно открыв для себя куки пытается с ними боротья с помощью банеров в пол экрана. Третья изобретает велосипед по отслеживанию пользователя по косвенным параметрам.

                            +2
                            Разные инструменты решают разные задачи.
                            В одном случае пользователь хочет авторизоваться, а в другом — остаться анонимным.
                              +1
                              Лично я был бы не против нормально авторизоваться для сервиса, но остаться анонимным для всех его third-party исполняемых скриптов: отслеживание данных с целью продажи; реклама; вся цепочка аналитик, включая промежуточные ссылки из поисковиков.

                              Для предоставления услуг они не нужны, на минуточку. Именно это и регулирует GDPR. Они не запрещают «вообще все» cookies и регулируют не только cookies.
                                0

                                Аналитика в целом бог с ней, если даже отданная на аутсорс она другим недоступна. Но вот нет уверенности, что тот же Гугл не использует данные GA с разных сайтов, чтобы определить круг моих интересов в целом, например чтобы показывать на айтишном сайте рекламу мебели, которую я смотрел на мебельном сайте. Вернее есть уверенность, что это не так.

                                  +1
                                  Об этом и речь. :)

                                  Было бы неплохо, если бы third-party скрипты запускались в песочнице и не имели доступа к каким-либо средствам идентификации. Пусть маркетологи/Google и увидят с какого источника человек пришёл, но не смогут как-либо определить кто именно = невозможность персонализировать.

                                  Возможно, тогда бы и рекламу меньше блокировали.
                                  +1
                                  Лично я был бы не против нормально авторизоваться для сервиса, но остаться анонимным для всех его third-party исполняемых скриптов
                                  Вы понимаете, что это невозможно, если сайт специально сотрудничает с 3rd-party и заинтересован, чтобы предоставлять им информацию. Тут либо полная анонимность (и для основных сервисов сайта тоже), либо полная неанонимность, либо юридические пляски: «технически вы можете, но по закону вам этого нельзя делать», что конечно же, технарям не нравится.
                                    0
                                    Вы понимаете, что это невозможно
                                    Мне кажется, что таки возможно. Разрешить доступ к хранилищам (cookies, localStorage) для скриптов, которые загружены только с «текущего» домена и его поддоменов учитывая CORS политики. Всем остальным — запретить, а данные с средств, по которым можно построить отпечаток — рандомайзить.

                                    Это многое сломает, не будет возможности использовать сторонние CDN (которые уже сейчас занимаются отслеживанием), но вполне действенно и «жить» с таким механизмом возможно.

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

                                    Исключением может быть IPv6 без NAT'а. В таком случае будут идентифицировать банально по IP с точностью до конкретного устройства (даже не до конкретного человека).
                                      0
                                      Если я что-то упустил — сообщите, буду рад услышать.
                                        0
                                        если сайт специально сотрудничает с 3rd-party и заинтересован, чтобы предоставлять им информацию
                                        Это значит, что на основной странице скрипт аналитики будет подключен не как
                                        script src='https://www.google-analytics.com/analytics.js'
                                        а например, так
                                        script src='https://www.google-analytics.com/analytics.js?realname=JohnSmith'
                                          0
                                          Вот только John'ов Smith'ов в мире много и единственным вариантом нормально обменяться будет ввод уникальных идентификаторов с привязкой и корректировкой этого идентификатора как со стороны сервиса, так и со стороны условного Гугла. Об этом я писал («будет сложно сопоставить пользователя на одном сайте с тем же пользователем на другом сайте»).

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

                                          В итоге такие сложности, что с каждым мелким сайтом никто (Google/Facebook) заморачиваться не станет. Подобная практика будет, да, но она будет существовать в рамках партнёров между собой, а не со всеми подряд. А партнёры даже при наличии GDPR без сторонних cookies вполне могут делиться.

                                          Ещё нюанс. Если пользователь не авторизован, то вообще не понятно каким образом его связывать с аналитикой (т.е. какое «имя»/идентификатор передавать). Сейчас же это возможно банальными cookies аналитики без какого-либо взаимодействия сайта с аналитикой.
                                            0
                                            Я это всё рассматривал только только в кейсе «нормально авторизоваться для сервиса» (через OAuth, например), отвечая на комментарий wmgeek. В этом случае, если OAuth выполняется через facebook или ГосУслуги, логин facebook/ГосУслуг и будет передаваться в аналитику как идентификатор.

                                            Понятно, что при желании сохранить анонимность для сервиса, можно быть анонимным и для аналитики.
                                              +1
                                              Когда я писал «нормально авторизоваться для сервиса» я не имел ввиду OAuth от вендора аналитики. Использовать вход по OAuth от Facebook'а и одновременно прятаться от его же аналитики на этом же сайте — бред, я считаю. Если человек выбирает такой способ входа, то он явно соглашается на передачу данных этой третьей стороне.

                                              Но возможность «войти» на сайт «в принципе» и не попасть под аналитику Facebook'а всё таки должна быть. Это я и описывал.

                                              Также могу добавить, что лично для меня вход через сторонние сервисы уже является большой проблемой, как и хранение паролей в облаках без e2e-шифрования. Таким образом человек потенциально:
                                              1) даёт возможность зайти под его аккаунтами
                                              2) теряет доступ при бане в сервисе (баны в Facebook уже бывали).
                                                0
                                                А если войти через facebook, а прятаться от гугла?
                                                А если войти через ГосУслуги, а прятаться от гугла/фейсбука?
                                +1

                                Интересно, а кто первый придумал обычный HTTP‐заголовок «Set-Cookie» называть файлом? И почему по этой аналогии файлами не называют другие HTTP‐заголовки, например: файл User-Agent или файл Content-Length?

                                  +3

                                  Тот, кто делал реализацию, в которой кукие писались в файл

                                    +1
                                    Может потому, что эта информация записывается именно в файл?
                                      +2
                                      Насколько я знаю, куки первым реализовал браузер Netscape, став стандартом де-факто. И у него действительно был файл (формат которого до сих пор используется), в котором он хранил куки.
                                      0
                                      Это ещё автор оригинала про режим инкогнито не знает)
                                        +1
                                        А под TOR и Onion всё это работает?
                                          +5
                                          Скорее всего, нет. И есть ещё и куча других способов, уже предложенных в комментариях к этой статье, чтобы обнулить слежку с помощью ETag.

                                          Но такой способ действенен для отслеживания основной массы посетителей. Этим посетителям можно честно говорить, что «наш сайт не следит за Вами с помощью coockies», но шпионить за ними с помощью других методов.
                                            +2

                                            Строго говоря, в EU отслеживание пользователя для его профилирования и таргетинга должно быть явно указано и согласие получено обязательно. Знаменитый Cookies Law совсем не про куки, а про любые средства отслеживания — его стоит прочитать. Просто куки стали широко известны как самое используемое средство.

                                              0
                                              Было бы интересно проверить.
                                            0

                                            Автор, их больше, тестируйте http://test.noleaks.eu/

                                              0

                                              Работают только Cookie и Redirect. Firefox 79.0b1

                                              +1
                                              И вполне вероятно, что подобные методы будут всё чаще использоваться перепуганной рекламной индустрией, которая наблюдает за тем, как рушится один из её столпов: coockie
                                              А какая, собственно, разница? Или они считают, что E-Tag, LocalStorage и другие технологии, которые могут быть использованы для идентификации, не регулируются GDPR? Если они так считают, то они ошибаются.

                                              Штраф таки прилетит, если «перепуганная рекламная индустрия» будет идентифицировать пользователей без их согласия любым из возможных методов. При этом согласие должно быть явным.
                                                0
                                                Ещё одним вариантом защиты от отслеживания по E-Tag может быть популярное расширение с открытым исходным кодом — ClearURLs, рекомендуемое Mozilla. Также более «локально» могут помочь uMatrix, Decentraleyes, Facebook Container, Firefox Multi-Account Containers.
                                                  0

                                                  Подтверждаю, uMatrix по дефолту так:

                                                  0

                                                  Все это красиво — но что придумали ребята из плеер.ру если при захоже на их сайт даже чер ТОР браузер и меняя личночности у меня постоянный ID?
                                                  Ради эксперимента посмотрите сами, это верхний левый угол, набор цифр прямо под логотипом.

                                                    0
                                                    ID разные. Если у вас включён JavaScript, то различные техники цифровых отпечатков наверняка смогут определить.
                                                      0

                                                      ради эксперимента все выключено — ID один и тот же.
                                                      PS ТОР браузер последней актуальной версии

                                                      0
                                                      Это точно ID вообще? У меня одинаковый из локального браузера и по RDP с работы. Думаю, это уже слишком сложная магия XD

                                                      Сейчас там 2890439
                                                        +1

                                                        Кстати у меня тоже 2890439
                                                        значит что то сломалось :)

                                                          0

                                                          Id анонимуса :)

                                                      0
                                                      CTRL+F5 нам в помощь
                                                        +6
                                                        В Web много интересных вещей. Например, сейчас весьма популярен безопасный HTTPS. В этом стеке протоколов есть штуки, которые похожи по смыслу на Cookie и ETag, про которые говорится в статье, с теми же по сути проблемами.

                                                        Я имею ввиду SSL Session Id и TLS Session Tickets. Технически они предназначены для того, чтобы уменьшить время установки соединения. Но их так же можно использовать и трекинга пользователей www.ssl.com/article/tracking-users-with-tls.

                                                        В этом плане доступ к инфраструктуре открывает большие возможности. Например, Cloudflare писали еще в 2015, что сделали Seesion Id глобальным с ротацией примерно через каждые 18 часов ( blog.cloudflare.com/tls-session-resumption-full-speed-and-secure ). На то были технические причины. Но это так же означает, что если в такой промежуток времени вас как-то получится определить (например, вашу учётку на Facebook), то можно будет замапить и все остальные запросы в этом периоде от других сайтов, которые используют Cloudflare. Сейчас набирает популярность еще более безопасный DNS over TLS, где сервису так же отводится не последняя роль.
                                                          0
                                                          Я вот удивляюсь, почему в браузере до сих пор не существует глобальный флажок: «Я согласен со всеми существующими и будущими методами отслеживания моих действий, пожалуйста больше не спрашивайте меня об этом»

                                                          Only users with full accounts can post comments. Log in, please.