#1 - 어설픈 위장은 오히려 더 튄다

브라우저 지문을 가리는 확장의 시작, 일관성이 핵심인 이유, best-effort라는 정직한 포지셔닝

Masque는 브라우저가 내보내는 지문(fingerprint) 표면을 하나의 일관된 가짜 정체성으로 갈아끼우는 Chrome 확장이다. navigator·screen·WebGL·canvas·타임존 같은 JavaScript 값부터 User-Agent 같은 HTTP 헤더까지, 한 페르소나에서 함께 바꿔서 “JS에서 읽히는 값"과 “실제로 나가는 헤더"가 서로 맞물리게 한다. 한 줄로 줄이면, 어설프게 한 군데만 가리는 게 아니라 전부 같이 가리는 도구다.

지문 수집은 한 군데만 보지 않는다

브라우저 정보나 화면 크기를 가린다고 하면 흔히 User-Agent 한 줄 바꾸는 확장을 떠올린다. 그런데 지문 수집은 그렇게 한 군데만 보지 않는다. 화면 해상도, CPU 코어 수, 메모리, 그래픽카드 이름, 타임존, 폰트, 캔버스 렌더링 결과까지 수십 개 신호를 모아 한 사람을 특정한다. 그래서 목표는 “정보를 지운다"가 아니라 “일관된 다른 사람으로 보이게 한다"가 됐다.

어설픈 위장은 오히려 더 튄다

여기서 가장 중요한 깨달음이 나왔다. 한 군데만 바꾸면 더 특이해진다.

navigator.userAgent는 Windows라고 말하는데, HTTP User-Agent 헤더는 진짜 OS를 흘리고, 타임존은 서울인데 언어는 미국이고, WebGL 렌더러는 실제 노트북 GPU를 그대로 노출한다면 — 그 모순들의 조합 자체가 세상에 거의 없는 희귀한 신호가 된다. 가리려다 오히려 도장을 찍는 꼴이다.

그래서 원칙을 박았다. 관련된 모든 표면을 하나의 페르소나 프로필에서 함께 바꾼다. 교차 검증을 당해도 정체성이 무너지지 않게.

숨기는 게 아니라 갈아끼운다

방향은 “노이즈로 흩뿌리기"가 아니라 “그럴듯한 실재 기기로 위장하기"였다. 값을 무작위로 흔들면 그 무작위 조합이 또 나만의 지문이 된다. 같은 모습을 쓰는 군중이 있어야 숨는데, 혼자 무작위면 군중이 없다.

그래서 Windows·Chrome, macOS·Chrome, Android·Chrome 같은 흔하고 내부적으로 앞뒤가 맞는 프로필을 미리 만들어 두고, 그중 하나를 통째로 입는 방식으로 갔다. UA·플랫폼·화면·GPU·타임존·코어 수가 한 벌로 일관되게 묶인 “사람"을 제시하는 것이다.

best-effort라고 먼저 말한다

확장은 페이지와 같은 JavaScript 세계 안에서 돌면서 그 세계를 속인다. 그래서 아무리 잘해도 작정한 수집기는 위장이 켜져 있다는 사실 자체를 눈치챌 수 있다. 이건 한계가 아니라 구조다.

그걸 숨기는 안티-핑거프린팅 도구가 제일 나쁘다고 봤다. 그래서 처음부터 best-effort, 즉 “지문 수집의 비용을 높이고 흔한 누수를 막지만 완전한 은폐는 아니다"라고 못 박고 시작했다. 정직하게 한계를 적는 걸 설계 원칙으로 삼았다.

돌아보면

결국 첫날 정한 세 가지가 이후 모든 선택을 지배했다. 한 군데가 아니라 전부 일관되게 바꾼다, 무작위가 아니라 실재하는 페르소나를 입는다, 그리고 완전하지 않다는 걸 먼저 인정한다. 이 세 줄이 이후의 주입 방식과 표면 하나하나의 선택을 전부 미리 정해 둔 셈이었다.