요약
브라우저 핑거프린트가 서드파티 쿠키를 대신해 사람을 추적하는 수단이 되고 있습니다.
royfish.dev에 실린 이 글은 읽는 사람의 기기에 별명을 붙여 보여 주는 체험으로 시작합니다. 새로고침하거나 쿠키를 지우고 VPN이나 시크릿 모드를 써도 별명이 바뀌지 않습니다. 쿠키 없이 기기 특성만으로 추적할 수 있다는 점을 직접 보여 주는 장치입니다.
왜 중요한가
- 쿠키 삭제, VPN, 시크릿 모드처럼 흔히 쓰는 개인정보 보호 수단이 핑거프린팅에는 통하지 않습니다.
- 글은 구글이 쿠키 폐지 약속을 거둔 뒤 2025년 자사 광고 상품에 핑거프린팅을 허용한 흐름을 짚었습니다.
- 제대로 막을 수 있는 곳은 브라우저 엔진뿐이어서, 결국 어떤 브라우저를 쓰느냐가 관건이 됩니다.
핵심 내용
- 오디오 처리, WebGL, 캔버스, 시간대, CPU 코어 수 같은 값은 권한 요청 없이 읽을 수 있고, 합치면 기기가 사실상 하나로 특정됩니다.
- 흔한 특성도 여럿 겹치면 고유해지는 원리를 엔트로피(특성 하나가 주는 정보량을 비트로 잰 값)로 설명했습니다.
- 128명 중 1명꼴인 특성은 7비트이고, 100만 명 가운데 한 명을 가려내는 데는 약 20비트면 됩니다.
- VPN은 IP 위치를 바꿔도 시간대는 그대로 남겨 오히려 단서가 됩니다.
- 대책으로 값에 잡음을 섞는 Brave와 모든 사용자를 똑같이 보이게 하는 Tor, Mullvad Browser를 권했습니다.
HN 반응
- 오디오나 WebGL처럼 정보량이 큰 API를 사용자 동의 뒤로 숨기자는 의견이 많았지만, 권한 창이 잦으면 결국 습관처럼 허용하게 된다는 반론이 맞섰습니다.
- 자바스크립트만 막으면 된다는 주장에는 CSS만으로도 글꼴 검사 같은 핑거프린팅이 가능하다는 반박이 나왔습니다.
엔트로피가 가장 높은 API들을 왜 브라우저 동의 뒤에 두지 않는지 저는 아직도 이해가 안 됩니다.
뉴스 사이트가 제 기기에서 오디오를 처리하고 그 버퍼를 다시 읽어 갈 필요가 있습니까? 오프스크린 버퍼에 삼각형을 그리려고 webgl을 쓸 필요가 있습니까?
대략적인 지역 타기팅은 문제가 아닐 겁니다. 오히려 너무 쉬운 일이라서, 사용자가 직접 동의하고 쓰는 광고 타기팅 API를 새로 만들면 된다고 생각합니다. 광고주에게 제 위치, 성별, 연령대, 사용 언어, 관심사 세 가지를 알려줄 수 있다면, 그걸로 광고를 보여 줘도 사생활 침해라고 느끼지 않을 겁니다. 샴푸 광고 대신 잔디깎이 광고를 보게 될 뿐이고, 그 정도는 괜찮습니다.
문제는 그들이 그런 타기팅을 쓰고 싶어 하지 않는다는 점입니다. 동료가 5분 전에 다른 동료에게 메신저로 말한 여행지 광고를 저에게 띄우고 싶어 합니다. 하지만 우리는 그걸 받아들여서는 안 됩니다.
가장 많이 쓰는 브라우저는 가장 큰 광고 네트워크를 운영하는 회사가 만들었습니다.
이런 API 가운데 상당수를 처음 도입한 것도 그 브라우저입니다.
그러면 답이 되겠죠.
(브라우저가 기기의 코어 수를 물리 코어와 논리 코어까지 다 알려줘야 하느냐고 묻는다면, 저는 언제나 절대 안 된다고 답할 겁니다. 그런데 모두가 그렇게 생각하지는 않더군요. https://developer.mozilla.org/en-US/docs/Web/API/Navigator/hardwareConcurrency )
사용자가 하려던 일을 관련 없는 동의 팝업으로 끊어 봐야 소용이 없다는 건 이미 알려진 사실이기 때문입니다.
나이 드신 분들은 Java J2ME가 이 방식이었다는 걸 기억하실 겁니다. 사용자가 API 권한마다 "항상 허용", "이번만 허용" 같은 거대한 팝업에 먼저 답해야 해서 매끄러운 사용자 경험을 만들 수가 없었죠.
충분히 알고 내린 결정이 아니라면 사실상 결정이 아닙니다. 그리고 대다수 사람은 대부분의 경우 알고서 결정하고 싶어 하지 않습니다. 그저 사이트에 온 목적인 뉴스, 게임, 가족 사진 같은 걸 원할 뿐입니다.
귀여운 조카가 침 방울 부는 걸 보려고 Facebook에 들어갑니다. 그 사이트가 카메라와 캔버스에 접근하는 게 신경 쓰일까요? 캔버스가 뭔데요? 카메라 접근이야 당연히 허용하죠, 사진을 올리고 싶으니까요!
근본적으로 망가진 구조입니다. 저들은 다크 패턴을 피하려고 연구한 게 아니라, 가장 잘 써먹으려고 연구했습니다.
맞습니다. 전직 Meta 직원과 이야기해 봤는데, 이런 문제에 그 사람이 내놓은 답은 "사실 프라이버시에 좋은 겁니다. 데이터가 값지니까 제3자가 접근하는 걸 원치 않거든요"가 전부였습니다.
API와 사이트당 한 번만 묻는다면 그렇게 나쁘지 않을 것 같은데요?
믿는 사이트이고 오디오가 정말 필요해 보이면 오디오를 허용해 줍니다. 잘 모르고 그냥 모두 허용하는 사람은 그 팝업을 다시 볼 일도 없겠죠(그리고 광고가 수상할 만큼 정확하게 따라붙겠고요).
카메라와 마이크에는 이미 이런 동의 팝업이 있습니다. 오디오 버퍼에서 바이트를 읽어 가는 일은 워낙 드물 테니, 아예 사라지기를 기대합니다.
기대하시는 것만큼 드물지는 않습니다. 밝혀 두자면 저는 Friendly Captcha에서 개발자 관계를 맡고 있고, 저희 위젯도 오프라인에서 생성한 오디오(마이크 녹음은 없습니다)를 쓰고 그 버퍼를 읽어 오는 스크립트 중 하나입니다. 오디오가 필요 없는 사이트에서도 마찬가지입니다.
저희가 이렇게 하는 건 브라우저가 자기가 주장하는 그대로의 브라우저인지 확인하기 위해서이지, 사용자가 누구인지 추적하려는 게 아닙니다. 폰트 렌더링, 부동소수점 연산 결과, WebGL 렌더러 문자열, 내장 함수가 변조되었는지 여부도 같은 이유로 보는데, 이런 것들은 훨씬 위조하기 어렵습니다. 이런 요소로 작업 증명(proof-of-work) 퍼즐의 난이도를 정하고, 사이트 운영자는 이를 위험 점수로 확인할 수 있습니다. 저희는 쿠키도 브라우저 저장소도 쓰지 않고, IP도 저장하지 않으며, 다른 사이트나 이후 방문에서 사용자를 알아보는 데 쓰는 것도 전혀 없습니다. 자동화 트래픽 방지 분야의 큰 업체들은 자동 봇 탐지와 다른 제품(광고 판매나 IP 프로파일링 등) 사이에 이해충돌이 있어서 이 정도로 말할 수 없고(보통은 말하지도 않고요).
그래도 말씀하신 예는 정말 타당합니다. 이 글타래를 계기로 엔지니어들과 이야기해 봤는데, 저희가 수집하는 오디오 해시를 현재 탐지에 쓰는 곳은 없었습니다. 그래서 그 수집을 없애는 방안을 논의하기 시작했습니다.
"사람임을 증명하는 것"은 갈수록 중요해질 거라고 생각합니다. 다만 연령 인증은 포기하고, 영지식 증명이나 무결성을 지키는 방식의 연령·사람 인증을 만들어야 한다고 봅니다.
그리고 IT 쪽 사람이 아니면 동의 팝업이 무엇을 뜻하는지 대체로 이해하지 못합니다.
예를 들어 제 배우자는 블루투스로 연결되는 기기용 앱이 "위치 권한"을 요구하면 여러 번 거부했고, 그러고는 기기가 불량이라고 탓하곤 했습니다.
"이 스마트 도어락 앱 안 돼."
"이 권한을 켜야 해."
"도어락 앱한테 내가 왜 위치 권한을 줘야 하는데?"
"블루투스를 충분히 큰 회사가 몰래 임시 GPS처럼 쓸 수 있다"는 건, 블루투스 접근이 필요한 앱이 정작 GPS 위치는 필요 없더라도 사람들한테는 전혀 당연하지 않습니다.
배우자분이 틀린 게 아닙니다. 그렇게까지 하나하나 정확히 알아야 쓸 수 있다면 형편없는 제품이고 형편없는 생태계입니다.
더 나아가야 합니다. 정적인 콘텐츠가 대부분인 웹사이트는 사용자 쪽 스크립트(Javascript)를 아예 쓰지 말아야 합니다. 그런 곳엔 필요하지 않으니까요. 사이트가 사실상 애플리케이션이라 JS가 필요한 드문 경우에만, 그런 애플리케이션을 열 때마다 사용자가 직접 켜게 해야 합니다.
그 배는 이미 떠났고, 저는 그걸 받아들일 만큼은 현실적입니다. 웹은 애플리케이션 플랫폼이지 하이퍼텍스트 문서의 웹이 아닙니다. 그건 바뀌지 않을 거고, 저는 "돌아가자"는 생각은 아예 접었습니다. 그게 통한다고 해 봐야 웹사이트의 절반은 JS 없이 도는 "사이트"가 되고, 나머지 절반은 JS를 켜야 하는 "앱"이 되겠죠? 웹이 이만큼 커진 이유가 바로 "웹 앱"과 "웹 사이트"의 구분을 없앴기 때문입니다. 지니를 다시 병 속에 넣을 수는 없습니다.
그러면 추적하려는 사이트는 JS를 조금 더 넣을 뿐입니다. 도움이 될 것 같지 않네요.
가장 정적인 사이트라면 그렇죠. 하지만 JavaScript가 없으면 길이가 가변적인 입력란 목록이 있는 폼이나 맞춤형 입력값 검증 같은 기본적인 일조차 클라이언트 쪽에서 할 수 없습니다.
그런 클라이언트 쪽 동작까지 "사실상 애플리케이션"으로 친다면, "애플리케이션"의 범위가 쓸모 있어 보이는 수준보다 너무 넓어집니다.
테마 전환기요! "문서 전용" 사이트에도 JS가 필요할 수 있는 이유로 제가 가장 좋아하는 예입니다. 기본값은 @media prefers-color-scheme으로 정하고 체크박스/라디오 버튼 꼼수로 전환 가능하게 만들 수는 있지만, JS 없이는 정적 사이트에서 그 설정을 유지할 방법이 없습니다.
사이트가 정적이어야 한다는 데 집착하지 않는다면 서버 쪽에서 추적할 수도 있지만, 그러면 사이트를 운영하는 방식에 큰 영향이 생깁니다. 이념적 순수성만 내려놓을 수 있다면, localStorage에 작은 플래그를 하나 두는 게 정말 최선입니다.
대부분의 사이트는 폼 자체가 필요 없기도 합니다. 적어도 일반 사용자에게는요.
문제는 Javascript와 그 구현입니다. 순수 HTML은 핑거프린팅 기회가 그렇게 많지 않습니다. 사실상 IP와 user agent뿐인데, 둘 다 위조할 수 있습니다. Javascript는 웹사이트에 사용자 브라우저에 대한 지나치게 큰 권한을 줍니다. 선택/붙여넣기를 막고, 하드웨어, 시간대, 언어 등을 알아내는 것까지 가능합니다. 이런 건 기본적으로 허용되어서는 안 되고, 하드웨어 가속 같은 것도 사이트별로 명시적으로 허용해야 합니다.
이 댓글이 지금 2위 댓글인 게 참 대단하네요. 폰트 지원 여부를 검사하는, 가장 유명한 핑거프린팅 방법 중 하나를 포함해 CSS만으로 하는 핑거프린팅 기법이 수없이 많다는 건 완전히 무시했는데도요. 그저 반사적으로 "JS=나쁨"에 추천을 누른 덕분입니다.
https://en.wikipedia.org/wiki/CSS_fingerprinting
브라우저가 사용자의 동의도, 그렇게 한다는 표시도 전혀 없이 넘겨주는 정보의 범위와 양이 터무니없습니다.
게다가 기록도 남기지 않습니다. document.getEyeColor() 호출 하나하나마다 동의 팝업이 뜨는 건 원치 않더라도, 나중에 누가 어떤 질의를 했는지 돌아보거나 Firefox가 집계 통계를 모아 줬으면 좋겠습니다. 나쁜 놈들의 이름을 공개해서 망신을 준다고 그들이 멈추지는 않겠지만, 대형 상업 업체들의 나쁜 행태를 억제하는 데는 효과가 있을지도 모릅니다.
그 아이디어 정말 마음에 듭니다. macOS가 배터리 메뉴 막대 항목에서 배터리를 많이 먹는 앱을 알려 주며 망신을 주는 것과 원리가 비슷하네요.
UX 면에서의 트레이드오프입니다. 악의 없는 웹사이트라면 사이트마다 권한 팝업을 줄줄이 거치지 않고도 그냥 동작하니 사용자에게 아주 편리하지만, 물론 그 때문에 이런 정보가 누군가를 핑거프린팅하려는 쪽에는 군침 도는 표적이 됩니다.
트레이드오프가 아니라 설계가 형편없는 겁니다.
그래도 설계상의 트레이드오프는 맞습니다. 반대 경우는 알림을 보내도 되냐고 묻는 수많은 웹사이트와 갖가지 쿠키 안내문에서 볼 수 있습니다. 뭐든 하나하나 사용자에게 허락을 구하면 사용자는 짜증을 내고 무뎌집니다. 다 허용해 버리기 시작하고(제 브라우저는 기회만 주면 알림이 허용된 웹사이트를 수십 개씩 모읍니다), 허락을 구하는 의미가 사라집니다.
왜 그렇죠? 기본적으로 그냥 동작하게 하는 것과 핑거프린팅 표면을 권한 팝업 뒤에 숨기는 것 사이에는 꽤 본질적인 긴장이 있어 보입니다. 예를 들어 지도 웹사이트에 들어갔다고 합시다. 사용자의 위치를 사이트에 공유할지 어떻게 정합니까? 화면에 화려한 레이아웃을 그리려고 WebGL 기능을 켤지는요? 사용자 입장에서는 그 모든 걸 사이트마다 켜야 하는 게 귀찮습니다.
제가 놓친 다른 방법이 있을까요?
정말 그럴까요?
Google의 사업 모델은 처음부터 광고였습니다. 검색, Gmail, 드라이브, 오피스, 크롬, 그들이 하는 모든 일은 광고 수익을 더 키우기 위한 겁니다.
그들은 사용자를 신경 쓰지 않습니다. 예전에도 그랬고, 앞으로도 그럴 겁니다.
그리고 지금 우리가 보는 결과는 제 기능을 못 하는 국가가 시민을 거대 기업으로부터 지키지 못할 때 벌어지는 일입니다. 그걸 하라고 있는 게 독일 연방카르텔청이나 미국 FTC입니다.
아니요. 적어도 2008년까지는 저도 신경 썼고 래리와 세르게이도 꽤 신경 썼습니다.
맞습니다. 처음 "사악해지지 말자"는 말을 했을 때는 진심이었다고 저도 믿습니다.
회사 전체가 어느 시점부터 정말로 신경을 끊었고, 지금은 "사악해지자" 패러다임을 따르고 있죠.
그러면 "예전에도 그랬다"는 말은 틀렸을 수 있겠네요. 그런데 나머지 부분은 어떻습니까?
이 댓글을 위선 말고 다른 걸로 볼 수가 없네요. 돈 받는 쪽에 서면 늘 쉬운 법이죠, 안 그렇습니까? 악성 광고(malvertisement)라는 말이 어떻게 생겼다고 생각하세요?
AdMob은 피할 수 없는 감시 자본주의의 정의 그 자체이고, 정부가 규제해야 하는 대표적인 사례입니다.