WebGL 렌더러 문자열과 하드웨어 신호: GPU는 나에 대해 얼마나 말해 줄까

브라우저가 실행되는 하드웨어는 여러 작은 경로로 페이지에 새어 나갑니다. 어느 것도 기기의 이름을 알려 주지는 않지만, 합치면 대부분의 다른 기기와 구별할 수 있을 만큼 기기를 가깝게 묘사합니다.
렌더러 문자열
WebGL은 WEBGL_debug_renderer_info라는 확장을 제공하며, 마스킹되지 않은 벤더와 마스킹되지 않은 렌더러라는 두 가지 값이 들어 있습니다. Windows의 Chromium에서 렌더러는 보통 ANGLE (NVIDIA, NVIDIA GeForce RTX 2060 SUPER (0x00001F06) Direct3D11 vs_5_0 ps_5_0, D3D11) 같은 형태로 읽힙니다. 이 한 줄에는 GPU 벤더, 정확한 모델, PCI 장치 ID, 그래픽 API, 셰이더 모델이 담겨 있으며, 그 문자열은 Windows에만 존재하므로 운영 체제에 대한 강력한 단서이기도 합니다.
Firefox와 Safari는 때때로 이 문자열을 마스킹하거나 일반화했지만 Chromium은 그대로 노출합니다. 마스킹하는 브라우저는 일반적인 값을 반환하며, 진단 페이지는 추측하는 대신 “렌더러 정보 마스킹됨”이라고 표시합니다.
개수와 크기
navigator.hardwareConcurrency는 논리 CPU 스레드 수를 반환합니다. navigator.deviceMemory는 대략적인 RAM 용량을 작은 값 집합으로 반올림하여 반환하며 Chromium에서는 8로 상한이 걸려 있으므로, 32GB 기기는 8을 보고합니다. screen.width와 screen.height는 디스플레이 크기를 주고, availWidth와 availHeight는 작업 표시줄을 뺀 값이며, devicePixelRatio는 배율을 드러냅니다. screen.colorDepth는 거의 항상 24입니다. navigator.maxTouchPoints는 터치 기기를 나머지와 구분합니다.
이 중 일부는 겉보기에 무해한 것에 비해 식별력이 이례적으로 높습니다. 스레드 수는 흔한 값이 몇 개밖에 없지만, 잘 알려진 상용 핑거프린팅 서비스가 높은 가중치를 두는 필드 중 하나입니다. 저렴하고 안정적이기 때문입니다. 화면 크기를 픽셀 비율 및 사용 가능한 높이와 결합하면 사용자 에이전트보다 기기를 더 좁게 특정할 수 있습니다.
미디어 장치
navigator.mediaDevices.enumerateDevices()는 시스템에 있는 카메라, 마이크, 스피커를 반환합니다. 권한이 없으면 최신 브라우저는 장치의 종류와 개수만 반환하고 레이블은 비워 두므로, 페이지는 “카메라 하나, 마이크 하나, 출력 하나”만 알 뿐 그 이상은 알 수 없습니다. 어느 사이트에든 접근을 허용하면 레이블이 드러납니다. 개수만 보여 주는 진단은 권한이 없는 페이지가 보는 것과 같은 방식으로 동작하는 것입니다.
다시 일관성의 관점에서
하드웨어 신호는 스푸핑이 가장 자주 잘못되는 곳입니다. NVIDIA Direct3D 렌더러, 24 스레드, 1366×768 화면을 가진 MacBook을 주장하는 프로필은 존재하지 않는 기기를 묘사하고 있습니다. 사이트는 그것을 알아차리는 데 데이터베이스가 필요 없습니다. 몇 가지 규칙이면 걸러집니다. 프로필이 이 값들 중 하나를 바꾼다면, 모두를 실제 기기가 출시되는 조합으로 바꿔야 하고, 방문할 때마다 그대로 유지해야 합니다.
무엇을 확인할 것인가
렌더러 문자열을 읽고 그것이 사용자 에이전트의 운영 체제와 일치하는지 물어보십시오. 화면 크기를 읽고 그것이 픽셀 비율 및 사용 가능한 높이와 맞는지 물어보십시오. 스레드 수와 메모리를 읽고 그 GPU에 그 조합이 그럴듯한지 물어보십시오. 진단 페이지는 바로 이 목적을 위해 이것들을 나란히 보여 주며, 판단은 여러분의 몫입니다.


