Device fingerprinting
몇개월 전에 Hacker News 에서 전세계 Top website가 fingerprinting을 하는지를 조사한 자료가 올라와서 보게 되었습니다. 흥미로운 점은 Google, Youtube, Amazon, Yahoo, Facebook, Reddit 등과 같은 가장 인기있는 웹사이트들이 WebGL fingerprinting을 하고 있다는 점이었습니다. 사실 어찌보면 이런 큰 규모의 서비스들은 당연히 할 것 같긴 하네요.ㅎㅎ
일반적으로 웹 기반 서비스를 운영한다고 할 때, 인증을 원하는 주체는 사용자입니다. 그렇기 때문에 사용자가 로그인 등을 할 때 토큰 등을 발급하고 이 값을 이용하여 서버의 값을 적절하게 호출 가능하죠. 그리고 일반적인 브라우저에는 쿠키 값을 저장해 놓아서 이를 활용하여 stateless 하더라도 동일한 사용자인지 알 수 있습니다.
그럼 만일 인증이 필요 없고, 사용자가 자신을 노출하고 싶지 않을 땐 어떻게 할까요? 보통은 익명 브라우징 (예를 들어 크롬 시크릿 탭) 을 통해 동일한 사용자가 아닌 척 할 수 있습니다. 이렇게 되면 서버 입장에서는 브라우저 정보가 다르기 때문에 동일 사용자인지 알 수가 없겠죠. 하지만 IP address 등은 여전이 노출이 되고, 이것까지 노출하기 싫으면 VPN 등을 사용하게 될 것입니다.
그렇다면 만일 우리가 DDOS attack 처럼 서버에 reqeust를 많이 넣고 싶은 악의적 사용자라고 생각 해 봅시다. 다량의 request 를 보내고 싶을 때 어떻게 할까요? 일단 캐시를 무력화 하기 위해서 요청을 조금씩 변형 할 것이고, 하나의 PC에서 요청을 많이 보내더라도 한계가 있을 것이니 VM을 여러 개 만들어서 익명 요청을 보낼 것 같습니다. 그러지 않으면 서버에서 금방 동일 사용자로 판단하고 요청을 막을 테니까요. 그럼 이렇게 VM 등을 활용해서 익명화된 요청을 하면 서버에서 어떻게 알 수 있을까요? 이럴 때 사용하는 것이 Device fingerprinting 입니다.
위의 예시에서는 Device fingerprinting의 필요성으로 공격자를 판별하기 위한 방법을 예시로 들었는데, 사실 그것보다 이 기능을 더 필요로 하는 회사들이 있습니다. 애널리틱스 서비스 제공을 하는 회사나, 광고 및 마케팅 관련 회사들이 이 기능을 유용하게 잘 사용합니다. 애널리틱스 회사들이나 마케팅 회사들은 자신들의 SDK를 심도록 하는데 이를 통해 사용자를 판별하고 정보를 수집할 수 있죠. 또한 광고가 주 수입인 기업들은 사용자 판별을 통해 최적의 광고를 노출할 수 있습니다. 그래서 fingerprinting 기술은 꽤 중요하고 이것만 연구하는 분들도 있습니다.
Fingerprinting을 위해서는 여러 방법이 존재합니다만, 여기서는 WebGL fingerprinting만 살펴보겠습니다. 다양한 fingerprinting 방법에 대해서 잘 정리해놓은 블로그 글도 있어서 관심있다면 이걸 읽어보는 것도 좋겠네요.
이 방법은 HTML5 표준에 포함된 Canvas의 WebGL 기능을 활용하는 것입니다. Canvas에서 WebGL 기반으로 entropy 가 비교적 높은 이미지를 렌더링 할 때 다양한 텍스트를 렌더링 하기 위한 폰트 정보, 이미지 렌더링 시의 패턴 정보들이 약간의 차이가 있게 됩니다. 이 값을 hash 값으로 뽑아낸 것이 바로 WebGL fingerprinting 입니다.
그냥 단순히 생각해 보면 이걸로 어떻게 fingerprinting을 하지? 라는 생각이 들 수도 있습니다. 사실 맞는 말입니다. 동일한 이미지 데이터 렌더링을 하는 패턴으로 hash를 뽑는 것이기 때문에 다른 디바이스더라도 동일하게 나오는 케이스가 분명 있습니다. 다만 그럴 확률이 낮은 편이기 때문에 (대략 1% 이하?) 사용 가능한 수준인 것이죠. 혹시 이런 기능들을 직접 사용해 보고 싶다면, WebGL fingerprinting 뿐 아니라 다양한 fingerprinting 기법을 모아 놓은 라이브러리도 있습니다. 꽤 인기있는 라이브러리라서 실서비스에 적용하는 것도 전혀 무리가 없을 것입니다.
많은 회사들이 최적의 성능 (속도가 빠르고, 디바이스별 차이가 다양하게 나는) 을 보이는 렌더링 패턴을 찾아서 활용하고 있는 것 같습니다. 여기 코드를 통해 어떤 방식으로 알고리즘이 돌아가는지 참고할 수 있습니다.
앞으로를 생각 해 보면, 현재는 속도 문제로 사용하기 어려울 수 있는 비교적 복잡한 패턴 등도 디바이스들의 전체적인 성능 향상으로 가능하지 않을까 싶고, 머신러닝 기술 등을 활용하여 최적 성능 (속도와 정확도 면에서) 을 보이는 렌더링 패턴을 계속해서 찾아 나가면 fingerprinting 기술의 성능이 계속해서 높아지지 않을까 싶은 생각이 드네요.
물론 그만큼 해당 기술을 막는 방법들도 여러가지 연구가 되어서 이러한 추적을 막기 위해서는 Tor browser 를 사용하거나, 해당 기능을 무력화하는 플러그인을 설치하는 방법도 있습니다.
최근 iOS의 업데이트 버전에서는 앱에서 추적금지가 default 가 되었습니다. 이로 인해 많은 마케팅 관련 회사들이 타격을 받았구요. 페이스북 같은 회사는 광고 수입이 매우 중요하기 때문에 애플의 이런 결정에 대해서 최근까지 계속 티격태격하는 모습을 보이고 있는 것 같습니다.
해당 사건은 위의 내용과는 상관이 없기는 하지만, 이렇게 사용자 판별은 광고에 있어서 굉장히 중요한 이슈이고, 인터넷 기업들의 대부분의 수익은 광고인 것을 생각 해 보면 Fingerprinting 기술에 엄청나게 많은 돈이 걸려있다는 것을 알 수 있습니다.
결과적으로 한쪽에서는 Fingerprinting 기술의 성능을 높이며 다양한 방법들을 연구하고 있고, 다른 한쪽에서는 이를 막을 기술들을 열심히 연구하고 있습니다. 이렇게 창과 방패가 대결하며 기술이 발전하는 거겠죠. 앞으로 또 어떤 흥미진진한 기술들이 나올지 기대됩니다.