iOS 앱이 조용히 보는 것: Loupe가 드러낸 디바이스 핑거프린팅의 실체
iOS 앱이 조용히 보는 것: Loupe가 드러낸 디바이스 핑거프린팅의 실체
사용자가 “허용”을 누르지 않았는데도 앱이 당신을 식별할 수 있다면, 동의 기반 프라이버시 모델은 무엇을 보호하고 있는 것인가?
도입
Apple은 수년간 프라이버시를 플랫폼의 핵심 가치로 내세워왔다. “프라이버시는 인간의 기본권입니다”라는 문구는 WWDC 키노트와 iPhone 광고에 반복적으로 등장한다. 2021년 iOS 14.5에서 도입된 ATT(App Tracking Transparency) 프레임워크는 그 선언의 가장 구체적인 제도적 표현이었다. 앱이 광고 식별자(IDFA)에 접근하려면 사용자에게 명시적 동의를 구해야 한다는 규칙은 애드테크 산업 전체를 흔들었고, Meta는 해당 분기에만 수십억 달러 규모의 매출 손실을 공개적으로 경고했다.
그러나 2026년 6월, 프라이버시 연구 조직 Mysk가 공개한 iOS 앱 Loupe는 그 선언과 현실 사이의 균열을 조용하지만 선명하게 드러낸다. Loupe는 악성 앱이 아니다. App Store에서 무료로 내려받을 수 있는 교육용 애플리케이션이다. 이 앱이 하는 일은 단순하다. 사용자의 기기에서 임의의 앱이 수집할 수 있는 데이터가 무엇인지 실시간으로 열거하고 시각화해 보여준다. 그 목록을 마주한 사용자들은 대체로 당혹스러워한다.
Hacker News에 공개된 직후 Loupe는 546점을 기록하며 당일 상위권에 올랐고, 243개의 댓글이 달렸다. 개발자와 보안 연구자들이 남긴 반응은 “이미 알고 있었다”와 “이렇게까지 많은 줄은 몰랐다”로 나뉘었다. 두 반응 모두 이 앱이 제기하는 문제의 본질을 가리킨다. 핑거프린팅은 존재한다. 그리고 그 규모는 대부분의 사용자가 인식하는 것보다 훨씬 넓다.
이 글은 Loupe가 공개한 3계층 데이터 접근 구조를 해부하고, ATT 이후에도 광고 추적이 어떻게 지속되는지를 기술적으로 분석하며, 플랫폼·개발자·사용자 각각에게 이 상황이 무엇을 의미하는지를 짚는다.
Loupe가 드러낸 3계층: 수동 신호부터 API 우회까지
Loupe의 핵심 기여는 앱이 기기 데이터에 접근하는 방식을 세 층위로 체계화했다는 데 있다. 이 분류는 기술적 정확도와 직관적 이해 가능성 사이에서 균형을 잘 잡고 있다.
1계층: 수동적 신호 — 권한 없이 수집되는 데이터
첫 번째 계층은 iOS가 어떤 앱에도 자유롭게 노출하는 기기 정보다. 사용자의 동의가 필요하지 않다. 시스템 API를 호출하면 즉시 반환되는 값들이다.
대표적인 항목을 나열하면 다음과 같다. 로케일 설정(언어, 지역, 숫자 포맷, 통화 기호), 타임존, 화면 해상도와 픽셀 밀도, 배터리 잔량과 충전 상태, 기기 모델 식별자(iPhone16,1 등의 내부 코드), 운영체제 버전, 시스템 언어 목록, 접근성 설정(굵은 텍스트, 고대비 모드, 글자 크기 배율), 설치된 키보드 목록, 현재 연결된 네트워크의 타입(Wi-Fi/셀룰러), 기기가 처음 설정된 이후의 부팅 횟수 등이다.
이 항목들 각각은 무해해 보인다. 로케일 정보는 앱이 올바른 언어로 콘텐츠를 표시하기 위해 필요하다. 배터리 상태는 에너지 집약적인 작업을 조율하기 위한 것이다. 그러나 핑거프린팅의 논리는 개별 데이터 포인트의 무해함이 아니라 조합의 고유성에 있다. 로케일이 ko-KR이고, 타임존이 Asia/Seoul이며, 화면이 2796×1290 픽셀이고, 배터리가 73%이며, 접근성에서 굵은 텍스트가 활성화된 기기는 수백만 대 중에서 상당히 좁은 범위로 특정된다. 여기에 두 번째 계층의 데이터가 더해지면 식별 정밀도는 급격히 올라간다.
2계층: 권한 기반 신호 — 사용자가 허용한 데이터의 이면
두 번째 계층은 iOS의 표준 권한 시스템을 통해 수집되는 데이터다. 사용자가 앱에 연락처, 사진, 위치, 캘린더 접근을 허용했다면, 해당 앱은 그 데이터 전체를 읽을 수 있다. 이것은 사용자가 명시적으로 동의한 것이므로 제도적으로는 문제가 없다.
그러나 Loupe가 지적하는 문제는 사용자의 동의가 어떤 조건에서 이루어지는지다. “앱이 카메라에 접근하도록 허용하시겠습니까?”라는 문구는 사진을 찍기 위한 용도로 읽힌다. 그러나 카메라 접근 권한을 가진 앱은 동시에 기기의 하드웨어 특성(카메라 센서 노이즈 패턴, 렌즈 왜곡 프로파일)을 측정해 식별자로 활용할 수 있다. 위치 권한을 가진 앱은 정확한 위치뿐 아니라 이동 패턴, 자주 방문하는 장소, 집과 직장의 추정 좌표를 축적한다.
더 중요한 것은, 이 계층의 데이터가 첫 번째 계층과 결합될 때 발생하는 시너지다. 위치 데이터는 그 자체로도 강력한 식별자다. 그런데 여기에 수동 신호로 얻은 기기 모델과 OS 버전, 언어 설정이 더해지면, 설령 사용자가 나중에 위치 권한을 철회하더라도 이미 구축된 프로파일은 남는다.
3계층: 고급 신호 — 합법적 API의 추적 전용
세 번째 계층이 Loupe의 가장 핵심적인 폭로다. 기술적으로는 완전히 합법적인 iOS API가 사용자 추적을 위해 전용되는 방식을 보여준다.
canOpenURL() API는 원래 기기에 특정 URL 스킴을 처리할 수 있는 앱이 설치되어 있는지 확인하기 위한 것이다. 예를 들어 “spotify://“라는 스킴이 열리면 Spotify가 설치된 것이다. 이 기능은 딥링크 처리나 소셜 공유 기능 구현에 정당하게 쓰인다. 그러나 광고 SDK는 이 API를 사용해 수십, 수백 개의 URL 스킴을 순차적으로 탐침한다. 어떤 앱들이 설치되어 있는지의 조합은 사용자마다 다르기 때문에, 이것만으로도 상당히 정밀한 핑거프린트가 만들어진다. Apple은 iOS 9에서 Info.plist에 쿼리할 스킴 목록을 미리 선언하도록 제한을 두었지만, 그 목록 자체가 식별자로 기능한다.
Keychain은 더 직접적인 문제를 제기한다. iOS Keychain은 앱이 삭제되어도 데이터가 지워지지 않는다. 광고 SDK가 첫 실행 시 Keychain에 고유 식별자를 저장하면, 사용자가 앱을 삭제하고 재설치하거나 심지어 iOS를 초기화해도(iCloud 백업 없이) 그 식별자는 살아남는다. 이는 “반영구적 디바이스 식별자”를 사실상 구현하는 방식이다. Apple이 IDFA 접근을 동의 기반으로 전환한 것을 무력화하는 메커니즘이다.
Loupe는 이 모든 신호가 자신의 기기에서 실시간으로 어떻게 수집될 수 있는지를 사용자가 직접 볼 수 있도록 설계되어 있다. 그리고 Mysk는 앱 설명에 명시한다. “Loupe가 읽는 정보 중 어떤 것도 사용자가 명시적으로 내보내기를 선택하지 않는 한 기기를 벗어나지 않는다.”
ATT의 사각지대: 핑거프린팅이 번성하는 회색지대
ATT 프레임워크는 iOS 14.5 도입 당시 애드테크 업계에 충격을 주었다. Meta, Snap, Twitter(현 X)는 일제히 광고 수익 감소를 경고했다. 실제로 IDFA 동의율은 플랫폼에 따라 20~40% 수준에서 형성되었다. 적극적으로 추적에 동의하는 사용자보다 거부하는 사용자가 훨씬 많다는 의미다.
그러나 애드테크 산업은 적응했다. 그 적응의 핵심이 핑거프린팅이다.
ATT의 법적·기술적 범위는 “기기 또는 사용자를 추적하기 위해 제3자와 공유되는 데이터”를 다른 회사의 앱, 웹사이트, 오프라인 활동과 연결하는 것에 한정된다. Apple의 ATT 가이드라인은 명시적으로 “기기 핑거프린팅은 사용자 동의 여부와 관계없이 허용되지 않는다”고 밝히고 있다. 그러나 이 규정의 집행은 기술적으로 어렵다.
핑거프린팅은 단일 API를 사용하지 않는다. 여러 합법적 API에서 데이터를 수집해 서버 측에서 조합하는 방식이다. 각 API 호출은 그 자체로 정당한 용도가 있다. Apple이 앱 심사 과정에서 이를 탐지하려면 앱 코드뿐 아니라 서버와의 통신 패턴까지 분석해야 한다. 실제로 애플의 앱 심사는 이 수준의 동적 분석을 수행하지 않는다.
결과적으로 IDFA가 차단된 이후 광고 업계에서 부상한 것은 두 가지다. 첫째는 SKAdNetwork — Apple이 공식적으로 제공하는 프라이버시 보호형 어트리뷰션 시스템이지만, 측정 정밀도가 낮고 실시간 데이터를 제공하지 않아 업계의 불만이 높다. 둘째가 바로 핑거프린팅이다. IDFA 대비 정밀도는 떨어지지만, 동의 없이 작동하고 ATT 프레임워크의 기술적 적용 범위 밖에 있다는 점에서 더 안정적인 추적 수단으로 부상했다.
canOpenURL() 프로빙은 이 회색지대의 전형적인 예다. Apple은 iOS 9에서 쿼리 가능한 스킴 목록을 Info.plist에 선언하도록 요구했다. 그러나 이 제한은 앱이 선언한 스킴만 쿼리할 수 있다는 것이지, 선언한 스킴 자체를 추적에 활용하는 것을 막지 않는다. 서로 다른 앱들이 서로 다른 스킴 목록을 선언하는 패턴 자체가 식별자가 된다.
Keychain 지속성 문제는 더 직접적인 정책 위반처럼 보이지만, Apple은 이를 Keychain API의 정책 남용으로 다루기보다는 개별 앱 심사 문제로 접근해왔다. 결과적으로 이 관행은 광범위하게 지속되고 있다.
iOS 18에서 Apple이 도입한 앱 프라이버시 리포트는 이 상황의 일부를 사용자에게 가시화한다. 어떤 앱이 어떤 센서와 API에 접근했는지를 기록한다. 그러나 이 리포트는 사후적이고, 데이터가 어떤 목적으로 사용되었는지는 표시하지 않으며, 수동 신호의 수집 자체는 기록하지 않는다. Loupe가 실시간으로 보여주는 것과는 다른 수준의 가시성이다.
플랫폼과 개발자의 딜레마: 기능과 프라이버시 사이
이 문제를 단순히 “나쁜 앱”의 문제로 환원하면 본질을 놓친다. 핑거프린팅에 사용되는 API들은 대부분 합법적이고 유용한 목적을 위해 존재한다.
canOpenURL()은 딥링크 처리의 근간이다. 소셜 앱에서 “Spotify에서 열기” 버튼이 작동하는 것은 이 API 덕분이다. Keychain은 보안 자격증명 저장의 표준 메커니즘이다. 앱 삭제 후에도 데이터가 유지되는 것은 사용자가 앱을 재설치했을 때 로그인 상태가 복원되는 편의 기능의 기반이기도 하다. 로케일과 타임존 정보는 다국어 앱의 기본 동작에 필수적이다.
이 API들을 추적 목적으로 사용하는 주체는 대부분 앱에 통합된 제3자 광고 SDK다. 앱 개발자가 직접 핑거프린팅 로직을 구현하는 경우는 드물다. Firebase Analytics, Adjust, AppsFlyer, MMP 같은 SDK를 통합하면, 그 SDK 내부에서 이 신호들을 수집하고 서버로 전송하는 코드가 실행된다. 개발자 입장에서는 어트리뷰션과 분석을 위해 표준 SDK를 사용한 것이지만, 그 SDK가 실제로 무엇을 수집하는지를 완전히 파악하고 있는 개발자는 많지 않다.
Apple의 딜레마는 이 API들을 제한하거나 제거하면 수많은 합법적 기능이 깨진다는 것이다. canOpenURL()을 완전히 차단하면 딥링크 생태계가 타격을 받는다. Keychain의 앱 삭제 이후 지속성을 없애면 사용자 편의성이 떨어진다. 수동 신호를 차단하거나 노이즈를 추가하면 다국어 지원과 접근성 기능에 영향이 생긴다. 이것이 프라이버시 강화 조치가 항상 점진적이고 선택적으로 이루어지는 이유다.
향후 전망을 보면, Apple은 iOS 17에서 링크 추적 보호(Link Tracking Protection)를 도입해 일부 UTM 파라미터를 자동 제거하기 시작했다. Safari의 ITP(Intelligent Tracking Prevention)는 브라우저 수준의 핑거프린팅 대응을 지속적으로 강화해왔다. 그러나 앱 내 핑거프린팅에 대한 iOS 차원의 대응은 아직 충분하지 않다는 평가가 지배적이다.
Loupe를 만든 Mysk는 이 앱을 “인식 도구”로 포지셔닝한다. 그들은 또한 Psylo라는 프록시 기반 프라이버시 브라우저를 운영하는데, 이는 그들이 단순히 문제를 제기하는 것을 넘어 실용적 대안을 모색하는 방향으로 움직이고 있음을 보여준다. Loupe의 소스코드가 MIT 라이선스로 공개되어 있다는 사실도 의미 있다. 이 코드베이스는 보안 연구자, 학생, 그리고 자신이 사용하는 SDK가 실제로 무엇을 수집하는지 알고 싶은 개발자들에게 참고 자료가 된다.
흥미로운 맥락이 하나 더 있다. Mysk는 Loupe가 “거의 전적으로 AI 코딩 도구로 작성되었다”고 밝혔다. 이는 2026년 시점에서 보안 연구 도구의 개발 방식 자체가 변화하고 있음을 시사한다. 프라이버시 공격 도구와 방어 도구 모두 AI 보조 개발의 혜택을 받고 있다는 점에서, AI가 보안 지형에 미치는 영향은 양면적이다.
결론
Loupe가 드러낸 것은 기술적으로 새로운 사실이 아니다. 보안 연구자들은 iOS의 핑거프린팅 공격 면적을 수년간 문서화해왔다. 그러나 이를 사용자가 자신의 기기에서 실시간으로 직접 볼 수 있게 만든 것은 다른 차원의 의미를 갖는다.
동의 기반 프라이버시 모델은 사용자가 어떤 데이터가 어떤 목적으로 수집되는지 실질적으로 이해할 수 있다는 전제 위에 서 있다. 그러나 Loupe가 보여주듯 수동적 신호는 동의 요청 자체가 없고, 고급 신호는 API의 원래 목적과 실제 사용 사이의 간극에 숨어 있다. 사용자는 무엇에 동의하고 있는지를 제대로 알 수 없다.
Apple이 마케팅으로 내세우는 “프라이버시는 기본권”이라는 문구가 실질적 의미를 갖추려면, 제도적 조치는 IDFA 제한 수준을 넘어야 한다. 수동 신호에 대한 노이즈 삽입, canOpenURL() 쿼리에 대한 프라이버시 보고서 통합, Keychain 데이터의 앱 삭제 시 기본 삭제 정책 — 이런 조치들은 기술적으로 가능하지만 생태계 마찰을 수반한다. 그 마찰을 감수할 의지가 있는지가 Apple의 프라이버시 약속이 마케팅인지 정책인지를 가를 것이다.
Loupe는 앱 하나다. 그러나 사용자가 자신의 기기에서 무슨 일이 일어나고 있는지를 직접 볼 수 있게 해준다는 점에서, 이 앱이 제기하는 질문은 개발자와 플랫폼 모두에게 유효하게 남는다.
출처
- Mysk Research — Loupe GitHub 저장소: https://github.com/mysk-research/loupe
- Hacker News 토론 (2026-06-20): https://news.ycombinator.com/item?id=44316234
- Apple ATT 개발자 문서: https://developer.apple.com/documentation/appsflyer/app-tracking-transparency
- Apple App Privacy Report (iOS 15.2+): https://support.apple.com/en-us/102151
- Apple SKAdNetwork 문서: https://developer.apple.com/documentation/storekit/skadnetwork
- iOS Link Tracking Protection (iOS 17): https://webkit.org/blog/14374/webkit-features-in-safari-17-0/