← 블로그로 돌아가기

브라우저 음성 핑거프린트란? SpeechSynthesis 음성 목록이 드러내는 환경 특성

핵심 요약: 음성 핑거프린트가 읽는 것은 기기에 설치된 합성 음성의 목록입니다. 운영체제를 따라다니는 설정 목록이라서, 프록시를 바꾸거나 쿠키를 지워도 변하지 않습니다. 여러 계정 환경의 신호 일관성을 점검할 때는 Canvas와 AudioContext 다음으로 놓치기 쉬운 항목입니다.

"프록시도 바꾸고 쿠키도 지웠는데, 환경 판정이 왜 계속 어긋날까?" 계정을 점검할 때 답은 기기 층의 파라미터에 숨어 있는 경우가 많습니다. 음성은 그중에서도 가장 쉽게 간과되는 항목입니다. 웹사이트는 마이크 접근도, 소리 재생도 필요로 하지 않습니다. API를 한 번 호출하는 것만으로 시스템 설정과 관련된 목록을 가져올 수 있습니다.

이 목록은 운영체제와 언어 팩이 정하고, 기기를 따라다닙니다. IP가 바뀌어도 그대로입니다. MostMate는 바로 이런 문제를 위해 만들어진 안티디텍트 브라우저로, 계정마다 독립된 브라우저 환경을 준비해 줍니다. 기기 층 파라미터도 관리 대상이며, 음성은 그중 하나입니다.

음성 핑거프린트란? 녹음 기반 성문 인식과의 차이

재료는 음성 합성의 설정 정보입니다. 성문과는 별개입니다.

먼저 세 가지 개념을 나눠 보겠습니다. 음성 합성은 브라우저가 텍스트를 음성으로 바꾸는 기능, 곧 웹페이지 읽어주기 뒤에 있는 체계를 가리킵니다. 음성 목록은 현재 환경에서 이 기능이 쓸 수 있는 목소리 옵션이고요. MDN 문서의 설명대로 getVoices()를 호출하면 기기에서 사용할 수 있는 음성 객체 목록이 반환됩니다. 음성 핑거프린트는 사이트가 이 목록의 특징을 환경 식별 신호로 삼는 것을 말합니다. 세 개념은 한 층씩 구체화됩니다.

성문 인식과 비교하면 그림이 선명해집니다. 성문 인식에는 녹음과 권한, 실제로 내는 소리까지 필요합니다. 음성 핑거프린트는 처음부터 끝까지 무음이고 권한도 없습니다. 사이트가 읽는 것은 소리가 아니라 메뉴판입니다. 차이는 바로 여기에 있고, 동시에 간과되기 쉬운 이유이기도 합니다. 팝업도, 느낌도 없는데 데이터는 이미 넘어가 있는 것입니다.

SpeechSynthesis는 어떻게 음성 목록을 사이트에 넘길까?

사이트의 읽기 입구는 speechSynthesis.getVoices()입니다. 호출 한 번으로 목록 전체가 나옵니다.

필드는 다섯 가지입니다. 아래 표에서 확인하세요.

필드의미값 예시
name음성 이름Microsoft David, Samantha
lang언어 태그en-US, zh-CN
localService로컬 합성 여부true는 로컬, false는 온라인
default기본 음성 여부언어별 최대 1개
voiceURI음성 서비스 식별자시스템 내부 식별자 포함 가능

이름은 사람 이름에 지나지 않는 경우가 많고, 하층 정보를 실어 나르는 것은 voiceURI입니다. Firefox가 macOS에서 반환하는 값은 urn:moz-tts:osx: 뒤에 시스템 내부 식별자가 붙는 형태입니다. 운영체제 비공개 음성 등록 정보가 공개 API를 통해 그대로 밖으로 나가는 셈입니다.

읽기 결과에 영향을 주는 세부 동작도 하나 더 있습니다. Chrome, Edge, Firefox에서는 첫 호출이 빈 배열을 반환하는 일이 잦습니다. 목록은 voiceschanged 이벤트가 발생한 뒤에야 채워집니다. 이 로딩 시점 자체가 신호가 됩니다. 바로 발생시키는 브라우저가 있는가 하면 늦어지는 것도 있고, 이미 로딩이 끝나 두 번 다시 발생하지 않는 것도 있습니다. 이 API는 Web Speech API 규격에서 아직 초안 단계라, 세부 동작은 각 브라우저 구현을 따릅니다.

음성 목록은 어떤 환경 특성 네 가지를 드러낼까?

음성 이름 하나로는 아무것도 알 수 없습니다. 식별력을 만드는 것은 목록의 조합입니다.

첫 번째: 운영체제와 기기 단서. 음성은 운영체제의 음성 서비스가 제공합니다. Windows에서는 Microsoft David, Zira 같은 이름이 흔하고, macOS에서는 Samantha, Daniel이 자주 보입니다. 안드로이드 폰에는 Google 음성 서비스 한 세트가 들어 있습니다. 리눅스 데스크톱은 음성 서비스를 설치하지 않으면 목록이 비어 있는 경우가 많습니다.

두 번째: 언어와 지역 설정. lang 태그 조합은 이 기기에 어떤 언어 팩이 설치됐는지를 보여줍니다. 일본어, 아랍어, 힌디어 음성이 한 목록에 섞여 있다면, 다국어 사용 배경이 그대로 사이트에 보고되는 셈입니다. 본인도 기억하지 못하는 경우가 많습니다.

세 번째: 브라우저 구현 차이. Chrome은 시스템 음성 위에 Google의 클라우드 음성을 얹어 반환합니다. localService 항목으로 로컬 합성과 온라인 서비스를 구분할 수 있습니다. 같은 기기라도 Chrome과 Firefox가 돌려주는 목록의 구성은 달라질 수 있습니다.

네 번째: 기본값과 전체 조합. 개수, 순서, 언어 태그, 기본 음성. 이것들이 모이면 식별력이 상당히 높은 환경 신호가 됩니다. 여기서 경계선 하나 짚겠습니다. 이것은 여러 신호 중 하나일 뿐이며, 사이트는 여러 신호를 종합해야 결론을 냅니다. 음성 목록 하나로 특정 개인을 알아보지는 못합니다.

사이트가 음성 목록에서 읽어내는 네 가지 환경 특성 도식

음성 핑거프린트는 AudioContext, Canvas 핑거프린트와 무엇이 다를까?

셋은 자주 함께 거론되지만, 관찰 대상은 전혀 다릅니다. 먼저 표로 비교해 보겠습니다.

탐지 방식관찰 대상과정 특징
SpeechSynthesis 음성 핑거프린트사용 가능한 음성 목록과 필드설정 목록을 읽음, 전 과정 무음
AudioContext 핑거프린트오디오 처리 연산의 결과연산을 실행하고 출력 차이를 비교
Canvas 핑거프린트그래픽 렌더링 출력의 특징이미지를 렌더링해 픽셀 비교
폰트 핑거프린트시스템에 설치된 폰트와 렌더링폰트 가용성을 탐색

음성 목록 열거와 오디오 렌더링은 서로 다른 두 경로입니다. 하나는 정적인 목록을 읽고, 다른 하나는 동적인 결과를 계산합니다. 둘을 섞어 말해서는 안 됩니다. AudioContext 핑거프린트 편에서는 뒤쪽 경로의 원리와 설정을 다룹니다. 폰트 핑거프린트는 음성 목록과 마찬가지로 정적 목록 유형으로, 기기에 무엇이 설치됐는지의 직접적인 판독값입니다.

내 브라우저가 어떤 음성 정보를 드러내는지 확인하려면?

확인에 필요한 것은 개발자 도구뿐입니다. 5분이면 사이트가 볼 수 있는 목록을 그대로 꺼낼 수 있습니다.

  1. 개발자 도구의 Console을 열고 speechSynthesis.getVoices()를 입력한 뒤 Enter를 누릅니다. 반환 내용을 확인합니다.
  2. 목록의 음성 객체를 펼쳐 name, lang, localService, voiceURI 값을 기록합니다.
  3. 페이지를 새로고침한 직후 다시 조회합니다. 첫 조회가 빈 배열이었는지 비교해 비동기 로딩 동작을 확인합니다.
  4. 다른 PC나 다른 운영체제에서 같은 절차를 반복합니다. 차이가 운영체제 음성 서비스에서 오는지, 브라우저 구현에서 오는지 가립니다.
  5. 프록시를 붙이고 다시 조회합니다. 목록은 보통 그대로입니다. 이것이 기기 층 신호라는 점을 그대로 검증해 줍니다.

결과 해석에는 두 가지 분수령이 있습니다. 목록이 비어 있다고 음성 핑거프린트가 없는 뜻은 아닙니다. 비어 있다는 사실 자체가 하나의 정보입니다. 음성 서비스가 없는 리눅스와 일부 자동화 환경은 빈 배열을 반환하는 일이 잦습니다. 목록이 길다고 더 쉽게 식별되는 것도 아닙니다. 판단은 개별 파라미터를 세는 것이 아니라, 환경 전체가 모순 없는지로 내려야 합니다.

MostMate는 음성 환경 특성을 어떻게 관리할까?

음성 목록은 기기 층 파라미터입니다. 핑거프린트 브라우저의 대응은 방치가 아니라 환경 설정에 넣는 것입니다.

MostMate에서 환경을 만들거나 편집할 때의 「지문 설정(핑거프린트 설정)」에는 SpeechVoices가 독립 파라미터로 들어 있습니다. Canvas, AudioContext, ClientRects, WebGL 이미지와 나란히 놓여 있죠. 단계는 Real과 Noise 두 가지이며, Noise는 노이즈 모드를 뜻합니다.

Noise를 고르면 오른쪽 미리보기 패널의 SpeechVoices 항목에 여섯 자리 코드가 붙은 값이 표시됩니다. Canvas와 AudioContext는 각자 다른 코드를 쓰며, 서로 호환되지 않습니다. 코드는 노이즈 설정의 식별자일 뿐입니다. 실제로 노출되는 해시값은 환경을 열어 접근 탐지 페이지에서 확인해야 합니다.

MostMate 지문 설정의 SpeechVoices 파라미터

음성 파라미터를 따로따로 만지는 일은 없어야 합니다. 환경의 운영체제, 언어, 시간대가 음성 목록의 모습을 결정합니다. Windows 환경에 macOS 음성이 나열되면 눈에 띄는 모순입니다. 조정 순서는 운영체제와 프록시를 먼저 정한 뒤, 음성 같은 기기 층 파라미터를 대조하는 흐름을 권합니다. 항목을 하나씩 뒤져 보는 것보다 확실합니다.

항목별로 세밀하게 제어하고 싶다면 공식 사이트의 수동 지문 설정 목록대로 하나씩 조정하면 됩니다. 설정 시간을 아끼고 싶다면 환경 생성 시 추천 구성으로 이 파라미터들을 묶어 지정하고, 이후 개별 항목을 다시 점검하는 방법도 있습니다. 여기서도 한계는 분명히 해두겠습니다. 핑거프린트 브라우저가 관리하는 것은 환경 설정이며, 사이트가 환경을 식별하지 못하게 보장하거나 계정이 플랫폼 검증을 피하게 보장하지는 않습니다. 계정 운영 자체는 여전히 플랫폼 규칙을 따라야 합니다.

자주 묻는 질문

음성 핑거프린트는 내 목소리를 녹음하나요?

아니요. 읽기 과정에서 마이크에 손대지 않고 오디오도 재생하지 않습니다. 사이트가 받는 것은 시스템 음성 서비스의 설정 목록뿐입니다. 성문 인식에는 녹음 권한이 필요하지만, 음성 핑거프린트는 그 어떤 권한도 요구하지 않습니다.

두 대의 PC에서 음성 목록이 왜 다를까요?

음성은 운영체제, 언어 팩, 음성 서비스가 정합니다. Windows와 macOS는 내장 음성부터 다르고, 설치된 언어 팩도 다르며, 브라우저가 얹는 클라우드 음성도 다릅니다. 목록이 맞지 않는 것은 자연스러운 결과입니다.

음성 목록이 비어 있으면 음성 핑거프린트도 없는 건가요?

빈 목록 자체가 하나의 정보입니다. 음성 서비스가 없는 리눅스와 일부 자동화 환경은 빈 배열을 반환하는 일이 잦습니다. 사이트 눈에는 이것이 하나의 이질적인 특징으로 보입니다. 은신으로 쓸 수는 없습니다.

음성 핑거프린트와 AudioContext 핑거프린트는 같은 것인가요?

같은 유형이 아닙니다. 음성 핑거프린트는 정적인 설정 목록을 읽고, AudioContext는 동적인 오디오 처리 결과를 계산합니다. 탐지 경로가 다르므로 환경 점검 때는 따로따로 확인해야 합니다.

MostMate로 SpeechSynthesis 음성 목록만 따로 수정할 수 있나요?

제품에서는 지문 설정의 SpeechVoices 파라미터가 이 역할을 맡습니다. Real과 Noise 두 단계가 있으며, 어느 세밀함까지 조정할 수 있는지는 클라이언트 화면 기준입니다. 설정 후에는 환경 접근 탐지 페이지를 열어 실제 노출되는 목록을 대조해 보길 권합니다.

맺음말

음성 핑거프린트의 본질은, 이 기기에 무엇이 설치됐는지를 사이트에 넘겨주는 것입니다. 녹음하지 않고 권한도 요구하지 않으면서도 운영체제를 따라다닙니다. IP가 바뀌어도 그대로입니다. 그래서 흔한 방식들의 논리가 설명됩니다. 쿠키만 지우고 프록시만 바꿔서는 환경이 맞지 않으며, 기기 층 파라미터까지 맞춰야 합니다.

제품 측면에서 MostMate는 SpeechVoices를 Canvas, AudioContext와 함께 지문 설정에 넣어 두었습니다. 단계 조절은 Real과 Noise 두 가지입니다. 다른 기능의 전모는 MostMate 공식 사이트에서 직접 확인해 보세요.

내 환경이 지금 무엇을 노출하는지 보고 싶다면 5절의 절차대로 음성 목록을 한 번 확인해 보세요. 환경을 하나 만들어 비교해 보려면 MostMate 다운로드에서 시작할 수 있습니다.

MOSTMATE

안전한 다중 계정 관리, 더 간편하게

첫 계정부터 MostMate와 함께 더 안전하고 스마트하며 효율적인 다중 계정 운영을 시작하세요.

  • 독립적인 프로필. 일관된 식별 정보.
  • AI 자동화 · 계정 건전성 · 팀 운영
MostMate 다운로드