iPhone이 어떤 정보를 앱에 노출하는지 직접 확인해본 적 있는가. iOS는 사용자 프라이버시를 위해 권한 요청 UI를 잘 만들어뒀지만, 프롬프트 없이도 모든 앱이 읽을 수 있는 값이 실제로는 수십 가지 넘게 존재한다. 2026년 6월, mysk-research가 공개한 iOS·iPadOS 앱 Loupe는 그 보이지 않는 표면을 한 화면에 펼쳐 보여준다. 공개 iOS API에서 실제 값을 읽어 원시 형태로 출력하고, 명시적으로 내보내지 않는 한 기기를 떠나지 않는다. 이 글에서는 Loupe가 무엇인지, 어떻게 설치하고, 어떤 신호를 어떤 방식으로 노출하는지 정리한다.

도입 — 트래커는 이름·이메일 없이도 사용자를 다시 인식한다
광고·분석 SDK는 사용자의 이름, 이메일, 위치를 알기 전에 이미 기기를 식별한다. locale, time zone, screen size, battery level 같은 수치들은 그 자체로 고유하지 않지만, 여러 값이 함께 모이면 사용자를 가리키는 핑거프린트가 형성된다. Loupe는 이 사실을 직접 보게 해준다. 세 단계로 묶인 신호 목록을 화면에 펼침으로써, "내가 평소 무심코 허용한 설정"이 어떤 조합을 이루는지 눈으로 확인할 수 있다.
핵심 가치 한 줄: iOS가 모든 앱에 무허가로 노출하는 신호가 정확히 무엇인지, 그리고 iOS가 권한을 요구하는 신호가 또 무엇인지 한 화면에서 비교할 수 있다.
Loupe가 노출하는 세 단계 신호
Loupe는 모든 신호를 접근 비용에 따라 세 단계로 묶는다. 단계가 낮을수록 사용자가 인지하지 못한 사이에 노출되는 값이다.
| 단계 | 노출 메커니즘 | 대표 신호 | 사용자 인지 |
|------|----------------|------------|--------------|
| Passive | iOS 프롬프트 없이 모든 앱이 즉시 읽기 가능 | locale, time zone, screen, battery | 불가 (백그라운드) |
| Needs Permission | iOS 시스템 권한 다이얼로그가 트리거됨 | contacts, photos, location, calendars | 가능 (허용/거부 선택) |
| Advanced | 공개 API의 사이드채널 사용 | canOpenURL URL-scheme probing, 재설치 후에도 남는 Keychain persistence | 사실상 불가 |
이 분류가 흥미로운 이유는 Passive 단계가 의외로 많다는 점이다. Loupe를 직접 실행해보면 프롬프트 한 번 없이도 locale, time zone, screen, battery 외에도 다양한 메타데이터가 노출된다는 사실을 확인할 수 있다. Needs Permission 단계는 비교적 익숙한 iOS 권한 다이얼로그가 뜨는 신호라 거부할 수 있지만, Advanced 단계는 URL-scheme probing이나 Keychain persistence 같은 영리한 우회로 사용자를 다시 인식한다.
GitHub raw README 핵심 — 빌드와 구조
Loupe는 mysk-research의 GitHub 저장소에 공개되어 있다. raw README 기준으로 빌드 조건과 구조는 다음과 같다.
- 필수 환경: Xcode 26 이상
- 빌드 절차:
code/Loupe.xcodeproj열기code/Config/Signing.local.xcconfig.example을code/Config/Signing.local.xcconfig로 복사 후 본인의DEVELOPMENT_TEAM과 bundle identifier 채우기 (이 파일은 gitignore 대상, 공개 저장소에 올라가지 않음)- 기기 또는 시뮬레이터에서 빌드·실행
- 프로젝트 구조: Xcode의 buildable folders(folder references)를 사용하므로, 새 Swift 파일이 추가되면 프로젝트 파일 수정 없이 자동으로 반영된다
- macOS 빌드: macOS용으로도 빌드되지만 Mac 버전은 polished 상태가 되기 전 몇 가지 작업이 더 필요함
신호 등급별 실제 사례
Passive 단계 — 무허가 노출의 실체
Passive 단계 신호는 iOS가 어떤 앱이든 별도 프롬프트 없이 읽을 수 있도록 허용한 값이다. 대표적인 Passive 신호는 다음과 같다.
- Locale / Time Zone: 사용자가 어디에 사는지, 어느 시간대에 있는지 직접 추정
- Screen size / Scale: 기기 모델과 세대 추정
- Battery level / State: 충전 상태와 잔량
- System version / Build: iOS 버전과 빌드 번호
Loupe를 실행하면 이런 값들이 한 화면에 모여 있다. 각 값은 그 자체로 사용자를 고유하게 식별하지 못하지만, 10~20개가 합쳐지면 충분히 고유한 핑거프린트가 된다.
Needs Permission 단계 — 친숙한 iOS 다이얼로그

이 단계 신호는 iOS 시스템 권한 다이얼로그가 트리거되는 값이다. 사용자가 허용/거부를 선택할 수 있다.
- Contacts: 주소록 접근
- Photos: 사진 라이브러리 접근
- Location: 정밀/대략 위치
- Calendars: 캘린더 이벤트 접근
이 단계는 iOS가 사용자에게 한 번 더 묻는 단계라 비교적 안전해 보이지만, 일부 앱은 "권한을 허용하지 않으면 핵심 기능을 막는" 압박을 가한다. Loupe는 이 단계 신호도 동일하게 보여주므로, "내 앱이 실제로 어디까지 접근하는가"를 정확히 알 수 있다.
Advanced 단계 — 사이드채널의 세계
Advanced 단계는 Loupe에서 가장 흥미로운 부분이다. 공개 iOS API를 정석으로 사용하지 않고, 부수 효과(side effect)를 통해 정보를 추출하는 패턴이다.
canOpenURLURL-scheme probing: 앱이 설치된 다른 앱 목록을 URL scheme으로 추측. iOS가 2009년경부터 설치된 앱 목록 직접 조회를 차단했지만, URL-scheme probing은 우회로로 살아남았다- Keychain persistence: 키체인 데이터는 앱 삭제 후에도 일정 기간 남아 있어, 재설치된 같은 앱이 이전 사용자의 흔적을 인식할 수 있다
- Identifier for Vendor (IDFV): 같은 벤더의 다른 앱이 공유하는 식별자. 앱 삭제 후에도 동일 벤더 앱이 남아 있으면 보존된다
이런 Advanced 신호는 Loupe의 가장 큰 가치다. "내 iPhone이 어떻게 식별되는가"를 사이드채널 단위로 알 수 있다.
Loupe vs 일반 iOS 설정 — 무엇이 다른가
| 비교 항목 | Loupe | 일반 iOS 설정 |
|-----------|-------|----------------|
| 신호 가시성 | 한 화면에 모든 값 표시 | 앱별 권한만 표시 |
| 단계 분류 | Passive / Needs Permission / Advanced | 권한 다이얼로그만 |
| 사이드채널 노출 | Keychain / URL-scheme 등 가시화 | 내부 동작이라 비공개 |
| 데이터 외부 유출 | 없음 (원시 값만 표시) | iOS 시스템 차원 |
핵심 차이는 Loupe는 "권한 다이얼로그가 뜨지 않는 신호"까지 가시화한다는 점이다. 일반 iOS 설정은 앱이 권한을 요청할 때만 사용자에게 알림을 주지만, Loupe는 백그라운드에서 무허가로 읽히는 값까지 사용자가 인지하게 만든다.
Loupe의 한계와 주의사항
Loupe는 공개 iOS API에서 실제로 읽을 수 있는 값만 보여준다. 비공개 API, jailbreak 환경, 시스템 수준 해킹 등은 다루지 않는다. 또한 다음 사항을 명심해야 한다.
- macOS 버전은 아직 polished 상태가 아님: 빌드는 되지만 몇 가지 작업이 더 필요하다
- Loupe 이름·로고·앱 아이콘·이미지·디자인 소스 파일은 MIT License 적용 대상이 아님: 소스 코드만 MIT로 배포된다
- 읽은 값을 명시적으로 내보내지 않으면 기기를 떠나지 않음: 집계나 해싱 없이 원시 값으로만 표시되고, 업로드·동기화·공유되지 않는다
- AI 코딩 도구로 대부분 작성됨: Loupe는 거의 전적으로 AI 코딩 도구로 작성된 프로젝트다
추천 대상
Loupe는 다음과 같은 사용자에게 특히 유용하다.
- iOS 개발자: 내 앱이 어떤 신호를 노출하는지 점검하고, 불필요한 정보 수집을 줄이고 싶을 때
- 보안/프라이버시 연구자: iOS 핑거프린팅 표면을 실측으로 확인하고 싶을 때
- 일반 사용자: "내 iPhone이 어떤 정보를 어디까지 노출하는가"를 직접 보고 싶을 때
- App Store 심사·QA: 권한 다이얼로그 외에 노출되는 신호까지 점검하고 싶을 때
결론
Loupe는 iOS가 모든 앱에 무허가로 노출하는 신호, 권한을 요구하는 신호, 사이드채널로 추출 가능한 신호를 한 화면에 펼쳐 보여주는 오픈소스 도구다. 2026년 6월 현재, iOS 26 이상에서 빌드 가능하며 raw README는 mysk-research GitHub 저장소에 공개되어 있다. macOS 버전은 아직 미완이지만, iOS·iPadOS에서의 사용성은 충분히 검증된 상태다. 트래커가 어떻게 사용자를 다시 인식하는지, 그리고 그 신호의 출처가 어디인지 직접 확인하고 싶은 개발자·연구자라면 Loupe를 설치해보기 권한다.
'자동화&툴 리뷰' 카테고리의 다른 글
| bigset - 세상의 모든 데이터를 가지고 있다면? 한 문장으로 만드는 라이브 데이터셋 (0) | 2026.06.24 |
|---|---|
| Show GN: Peck - PR을 쉽게 설명하고 리뷰 초안과 상태를 보여주는 macOS 메뉴바 앱 (0) | 2026.06.24 |
| Show GN: 모두의 사과문 — 사고 전에 미리 써두는 사과문 비상 키트 (ModuSorry) (0) | 2026.06.23 |
| MCP용 Zero-Touch OAuth — 기업 MCP 배포의 새로운 기준 (1) | 2026.06.22 |
| DiffsHub — GitHub PR diff를 수백만 줄까지 부드럽게 보는 도구 (0) | 2026.06.22 |