알리익스프레스를 열었더니 헤드폰이 끊겼다 — 무음 오디오로 당신을 알아보는 '웹오디오 지문'
블루투스 헤드폰으로 음악을 듣다가 쇼핑몰 페이지를 열었는데 갑자기 음질이 뚝 떨어진 적 있으신가요. 노트북에서 잘 나오던 소리가 끊기고 헤드폰이 멋대로 다른 기기로 넘어가기도 합니다. 정작 그 페이지에서 재생 버튼을 누른 적은 없는데 말이죠. 이 이상한 현상의 범인으로 웹오디오 지문(WebAudio fingerprinting)을 지목하는 사람들이 있습니다.
다만 미리 밝혀둘 게 있습니다. 이 주제는 최근 30일 커뮤니티 데이터에서 잡힌 논의량이 거의 없었습니다. 아래는 웹오디오 지문 기술 자체와, 개발자 커뮤니티에서 오래 반복돼온 관측을 묶은 내용입니다. 어느 회사가 무슨 의도로 뭘 했는지는 추정과 확인된 사실을 갈라서 읽어주시면 좋겠습니다.
소리가 안 나는데 오디오가 재생되고 있다
브라우저에는 Web Audio API라는 기능이 있습니다. 원래는 게임이나 음악 앱에서 소리를 정교하게 다루라고 만든 표준입니다. 오실레이터로 파형을 만들어 컴프레서 같은 필터에 통과시킨 뒤, 나온 결과를 숫자 배열로 받아올 수 있습니다.
지문 채취에 쓰이는 건 OfflineAudioContext입니다. 스피커로 소리를 내보내지 않고 처리 결과만 계산해서 돌려주는 모드죠. 귀에는 아무것도 안 들립니다. 그런데 브라우저 쪽에서는 이걸 두고 “오디오 세션이 시작됐다"고 보는 경우가 있습니다.
여기서부터 일이 꼬입니다. 운영체제가 오디오 세션 시작 신호를 받으면 블루투스 기기에 알립니다. 헤드폰은 “아, 이 기기에서 소리를 내려나 보다” 하고 연결 프로파일을 바꿉니다. 멀티포인트를 지원하는 모델이면 휴대폰에 있던 오디오 우선순위를 노트북으로 옮겨버리기도 하고요. 사용자 눈에는 그냥 페이지를 열었더니 헤드폰이 끊긴 것으로 보입니다.
왜 소리로 사람을 구분할 수 있을까
그럼 소리도 안 나는 오디오를 대체 왜 재생할까요. 그 결과값이 기기마다 미세하게 다르기 때문입니다.
같은 파형을 같은 필터로 돌려도 결과 숫자는 CPU 종류, 부동소수점 연산 방식, 오디오 드라이버, 브라우저 버전, 운영체제에 따라 소수점 아래에서 조금씩 어긋납니다. 사람 귀로는 절대 못 잡아내는 차이죠. 그런데 이 숫자들을 해시로 압축하면 짧은 식별자 하나가 나옵니다. 이게 오디오 지문입니다.
값 하나로 개인을 짚어내기는 어렵습니다. 여기에 화면 해상도, 설치된 폰트 목록, 그래픽카드 정보를 처리하는 캔버스 지문, 시간대, 언어 설정 같은 값을 수십 개 포개면 사정이 달라집니다. 항목이 늘수록 조합의 경우의 수는 곱셈으로 불어나고, 그러다 보면 브라우저 하나하나를 꽤 높은 확률로 갈라낼 수 있습니다.
전자프론티어재단(EFF)이 오래전 Panopticlick 실험에서 보여준 게 이겁니다. 개인정보를 한 줄도 입력하지 않은 브라우저가 수십만 명 가운데 사실상 혼자인 것으로 나오는 일이 흔했습니다.
쿠키를 지워도 소용없는 이유
흔한 광고 추적 쿠키는 지우면 그만입니다. 시크릿 모드를 켜면 새 방문자 취급을 받고요. 브라우저 쪽에서도 서드파티 쿠키를 계속 막아왔습니다.
지문은 다릅니다. 지울 게 없습니다. 쿠키처럼 내 기기에 뭘 저장해두는 게 아니라, 기기가 원래 지닌 특성을 읽어가는 쪽이니까요. 시크릿 모드를 켠다고 CPU가 바뀌지 않습니다. 브라우저를 지웠다 다시 깔아도 오디오 드라이버는 그대로고요.
그래서 이 기술은 광고 추적 말고 부정거래 탐지에도 많이 씁니다. 한 사람이 계정 수십 개를 파서 쿠폰을 긁어가는 걸 막거나, 도난 카드 결제 패턴을 잡는 데 요긴하죠. 덩치 큰 쇼핑몰이라면 이런 방어 장치를 안 쓰는 쪽이 오히려 이상합니다.
골치 아픈 대목이 여기입니다. 똑같은 기술이 보안 도구이면서 감시 도구입니다. 바깥에서 코드만 봐서는 어느 쪽인지 가려내기 어렵습니다. 게다가 사용자한테는 어느 쪽이라는 설명조차 거의 없습니다.
헤드폰이 끊기는 건 기술의 ‘증상’이다
지문 채취는 원래 완전히 조용한 기술입니다. 로딩 화면도, 알림도 없습니다. 사용자가 알아챌 방법이 사실상 없죠.
그걸 블루투스 헤드폰이 들통내버렸습니다. 멀티포인트 헤드폰이 오디오 세션 신호에 반응해 연결을 갈아타는 바람에, 안 보이던 동작이 귀에 들리는 증상으로 튀어나왔습니다. 개발자 도구를 열 줄 모르는 사람도 “얘가 뭔가 오디오를 만졌구나"를 몸으로 알게 된 셈입니다.
얻어걸린 감시 탐지기인 셈입니다. 뒤집어 말하면, 블루투스 헤드폰을 안 쓰는 사람은 여전히 아무것도 모른 채 지나간다는 얘기이기도 하고요.
그래서 뭘 할 수 있나
완벽하게 막기는 어렵습니다. 상대를 귀찮게 만들 수는 있습니다.
브라우저 선택이 제일 큰 변수입니다. Tor 브라우저는 오디오 지문 관련 API를 막거나 누구에게나 똑같은 값을 돌려주는 쪽을 택했습니다. 파이어폭스에도 지문 방지 옵션이 있습니다. 브레이브는 값에 미세한 잡음을 섞어 들어갈 때마다 지문이 달라지게 합니다. 사파리 역시 시스템 정보를 덜 흘리는 쪽으로 손봐왔고요.
확장 프로그램으로 특정 API 호출을 막는 방법도 있습니다. 대신 부작용을 감수해야 합니다. 지문 방지를 너무 세게 걸면 멀쩡한 웹 오디오 서비스가 깨집니다. 게다가 너무 특이한 방어 설정 자체가 또 하나의 지문이 됩니다. 아무도 안 쓰는 조합으로 무장하면 오히려 “그 특이한 사람"으로 눈에 더 잘 띕니다.
헤드폰 끊김 자체가 거슬린다면 헤드폰 앱에서 멀티포인트 자동 전환을 꺼두는 게 현실적입니다. 추적이 멈추는 건 아니지만 적어도 음악은 안 끊깁니다.
마무리
들리지 않는 소리가 재생됩니다. 그 계산 결과의 미세한 차이가 나를 가려냅니다. 쿠키를 지워도 그 값은 남습니다. 이런 걸 헤드폰 끊김이라는 사소한 불편 덕에 알게 됐다는 점이 오히려 씁쓸합니다.
브라우저 지문은 광고 업계와 보안 업계가 같이 붙들고 있는 기술입니다. 한쪽만 골라 끊어낼 방법이 마땅치 않습니다. 그러니 따져볼 대목은 기술을 어떻게 막느냐보다 언제 어떤 목적으로 쓰는지를 사용자에게 알릴 의무가 있는가 쪽입니다.
오늘 헤드폰이 까닭 없이 끊겼다면 한 번쯤 의심해볼 만합니다. 고장이 아닐 수도 있습니다.
댓글
댓글을 불러오는 중...