WebGL 핑거프린트 — GPU 모델을 직접 알려주는 위험한 API
WebGL이 그래픽 카드 모델·드라이버 버전을 그대로 노출하는 원리와, 핑거프린트 우회 도구들이 이를 어떻게 가린지 설명합니다.
Canvas 핑거프린트가 "GPU 렌더링 결과의 미세한 차이"를 잡아낸다면, WebGL은 더 직접적으로 GPU 모델 이름 자체를 텍스트로 노출합니다.
WebGL_debug_renderer_info
const gl = canvas.getContext('webgl');
const ext = gl.getExtension('WEBGL_debug_renderer_info');
gl.getParameter(ext.UNMASKED_VENDOR_WEBGL); // "Google Inc. (NVIDIA)"
gl.getParameter(ext.UNMASKED_RENDERER_WEBGL); // "ANGLE (NVIDIA, NVIDIA GeForce RTX 3060 Direct3D11 vs_5_0 ps_5_0, D3D11)"위 두 값은 그래픽 카드 제조사 + 모델명 + 렌더링 백엔드를 그대로 알려줍니다. 사용자가 어떤 PC를 쓰는지 거의 정확히 파악할 수 있습니다.
왜 위험한가
- "NVIDIA GeForce RTX 3060"은 전 세계 사용자의 약 0.5% 이하가 사용하는 카드
- "AMD Radeon RX 7900 XTX"는 약 0.1% 이하
- 이 정보 + 화면 해상도 + 시간대 조합만으로 사용자를 거의 unique하게 식별 가능
핵심 파라미터들
WebGL이 노출하는 정보 중 핑거프린트에 사용되는 주요 항목:
1. VENDOR / RENDERER: 위 예시
2. VERSION: WebGL 버전 + 드라이버 버전
3. SHADING_LANGUAGE_VERSION: GLSL 버전
4. Aliased line/point range: GPU별 미세한 차이
5. Max texture size: GPU 메모리 한계
6. Supported extensions: 약 50개 익스텐션, GPU마다 지원 목록 다름
이걸 다 모으면 수만 가지 unique한 조합이 만들어집니다.
우회 도구의 접근 방식
1. UNMASKED_* 값 차단
일부 안티디텍트 브라우저는 WEBGL_debug_renderer_info 익스텐션 자체를 비활성화해서 GPU 정보 노출을 막습니다. 단점: 정상 브라우저는 이 익스텐션을 모두 지원하므로, 비활성화가 곧 봇 신호가 됩니다.
2. 가짜 GPU 가장
프로필마다 고정된 가짜 GPU 정보를 반환 (예: 모든 사용자가 Intel HD Graphics 4000을 쓰는 척). 단점: 다른 사람과 똑같은 값이라 collision 위험. 그리고 화면 해상도가 4K인데 GPU는 HD 4000이면 모순.
3. 일관된 랜덤 GPU 풀
실제 시장 점유율에 비례한 GPU 풀(NVIDIA RTX 3060, AMD RX 6700, Intel UHD 770 등 수십 개)에서 프로필마다 하나씩 고정 배정. 가장 자연스러움.
4. Chromium 플래그 직접 변경
--use-angle=d3d11, --force-color-profile 같은 플래그로 렌더링 백엔드를 진짜로 바꾸는 방식. 가장 강력하지만 구현 난이도 높음.
결론
WebGL 핑거프린트는 핑거프린트 30가지 중 가장 직접적이고 강력한 식별자입니다. 안티디텍트 브라우저가 어떻게 우회하는지 보려면 BrowserLeaks/WebGL Report 같은 사이트에서 직접 확인해보세요.