macOS가 표시하는 프롬프트를 자동으로 거부합니다:
'Google Chrome'이 로컬 네트워크에서 장치를 찾도록 허용하시겠습니까? 이 기능은 앱이 사용자의 네트워크에 있는 장치를 검색하고, 연결하며, 데이터를 수집할 수 있도록 허용합니다.
매번 순식간에 **허용 안 함(Don't Allow)**을 눌러줍니다. 유휴 상태일 때 CPU를 전혀 사용하지 않으며, 재부팅 후에도 작동합니다. 의존성 없이 짧은 Swift 파일 두 개로 구성되어 있습니다.
macOS (Sequoia 및 이후 버전)는 앱이 로컬 네트워크에 접근할 때 처음으로 이 프롬프트를 표시합니다. 이 결정은 기억되도록 되어 있어야 합니다. 하지만 많은 앱의 경우 그렇지 못하여, 사용하지 않는 앱에 대해서도 매번 실행 시 프롬프트가 다시 나타납니다:
Chromium 브라우저(Chrome, Brave, Edge, Island, Arc)는 코드 서명(code signature)이 인플레이스 업데이트에서 유지되도록 실행 시 자체 앱 번들(app bundle)을 임의의 임시 폴더에 복사합니다. macOS는 로컬 네트워크 결정을 이 임의의 경로에 연결하기 때문에, 다음 실행은 마치 완전히 새로운 앱처럼 보입니다. 그 결과 사용자의 개인 정보 보호 설정에는 더 이상 아무것도 가리키지 않는 중복된 'Google Chrome.app' 항목이 쌓이게 됩니다.버전별 설치 경로를 가진 앱(설치되는 모든 것이 .../versions/1.2.3/와 같은 곳에 설치되는 경우)
업데이트가 있을 때마다 새로운 항목을 생성합니다.**잘못 할당된 프롬프트(Misattributed prompts).**macOS는 대화 상자를 '책임자'라고 판단한 앱에 고정시키기 때문에, 실제로 실행되고 있지 않은 앱에 대한 프롬프트를 보게 됩니다.
- 일부 앱은 이 권한을 합법적으로 사용합니다: 브라우저 및 미디어 플레이어에서의 Chromecast 및 AirPlay 검색, 게임에서의 LAN 멀티플레이, 프린터 및 스캐너 유틸리티. 만약 이러한 기능 중 하나를 사용하는 경우, 해당 앱에 대해 허용(Allow)을 선택해 주십시오 (지금 하는 동안
dontallow pause 10m 사용). 그러면 앱의 경로가 안정적인 한 계속 기억됩니다. 만약 이 기능을 전혀 사용하지 않는다면, 요청받을 일이 없습니다.
이 목록을 정리할 수 있는 지원되는 방법은 없으며, 사전에 권한을 거부하는 MDM 페이로드(MDM payload)도 없고, tccutil reset 명령어도 이를 해결해주지 못합니다. 그래서: 사용자 대신 '아니요'라고 답변해주는 작은 에이전트가 필요합니다.
brew install johncassil/tap/dontallow # 또는: make && make install
dontallow install
dontallow install
사용자별(per-user) launchd 에이전트를 작성하고, 이를 시작한 다음, 시스템 설정(System Settings) > 개인 정보 보호 및 보안(Privacy & Security) > 접근성(Accessibility)으로 이동하여 macOS가 경로를 요청하지 않는 경우 정확한 추가 경로를 출력합니다. 접근성은 이 에이전트가 버튼을 누를 수 있게 해주는 권한입니다. 이는 승인(grant)을 기다리고, 에이전트가 활성화되었음을 확인합니다. dontallow status
승인이 누락될 때마다 지침을 반복합니다.
| 명령어 | 기능 |
|---|
dontallow status | 에이전트 상태, 일시 중지 상태(pause state), 허용 목록(allowlist), 최근 거부 사항(recent dismissals) |
dontallow pause [1h] | 프롬프트를 일정 시간 동안 유지합니다 (30m, 2h, 1d, forever). |
dontallow resume | 다시 거부 처리합니다. |
dontallow rules | 시스템의 로컬 네트워크 규칙 저장소(Local Network rule store)를 디코딩하여, 고아 항목(orphans)을 포함해 각 개인 정보 보호 행이 실제로 무엇인지 보여줍니다. |
dontallow uninstall | 에이전트를 중지하고 제거합니다. |
dontallow run --dry-run | 포그라운드에서 실행되며, 어떤 작업을 할 것인지 로그로 기록하지만 아무것도 누르지 않습니다. |
각 거부(dismissal)는 앱 이름과 pause 명령어를 명시하는 알림을 게시하므로, 언제 설정을 꺼야 하는지 기억할 필요가 없습니다. 만약 알림이 보이는 것을 원치 않는다면 시스템 설정에서 음소거할 수 있습니다.
세 가지 옵션 중 적절한 것을 선택하세요:
dontallow pause 10m을 실행한 다음, 앱을 실행하고 '허용(Allow)'을 클릭합니다. 이후 해당 앱의 이름을 ~/.config/dontallow/allowlist에 추가합니다 (줄마다 하나씩, 대소문자 구분 없는 부분 문자열). 이 경우 프롬프트는 건드려지지 않습니다.
- 시스템 설정 > 개인 정보 보호 및 보안 > 로컬 네트워크(Local Network)에서 토글을 반전시킵니다. 거부된 프롬프트는 거부를 기록하며, 이곳에서 이를 되돌릴 수 있습니다.
- 에이전트가 작동하기 전에 '허용'을 클릭할 수 있는 시간 창을 원한다면
~/.config/dontallow/grace를 초 단위의 숫자로 설정합니다 (기본값은 0.25).
해당 프롬프트는 시스템 프로세스인 UserNotificationCenter가 소유한 창입니다. dontallow
해당 프로세스에서 창 생성을 위한 Accessibility observer를 등록하고, 이 이벤트가 발생할 때까지 대기합니다. 다이얼로그 텍스트를 읽고, 이것이 로컬 네트워크 프롬프트임을 확인하며 다른 것이 아닌지 검사하고, 일시 중지(pause) 및 허용 목록(allowlist)을 확인한 후, 허용 안 함 (Don't Allow) 버튼에 Accessibility 누름 동작을 수행합니다. 이 누름 동작이 거부되면 해당 버튼 위치에서 합성 클릭(synthetic click)으로 대체됩니다.
시스템 파일을 수정하지 않으며, 보호 기능을 비활성화하지 않고, 절대 허용(Allow)을 선택하지 않습니다.
Local Network는 MDM(Mobile Device Management)으로 사전 설정할 수 없지만, Accessibility는 가능합니다. 전체 기기군(fleet)의 경우: 한 번 빌드하고, Developer ID로 서명하며, PPPC(Privacy Preferences Policy Control) 프로파일을 포함하여 바이너리를 배포하여 코드 요구 사항에 Accessibility를 부여하고, 사용자별로 dontallow install을 실행합니다. 수동 설정 단계가 필요 없습니다.
macOS는 바이너리의 코드 서명에 Accessibility 권한을 연결하며, 모든 빌드(예: brew upgrade 포함)에서 새로운 서명을 생성합니다. 업그레이드 후에는 dontallow status를 실행해야 합니다. 만약 권한이 누락되었다고 표시되면, Accessibility 설정에서 dontallow 항목을 제거하고 출력된 경로에서 다시 추가합니다. 에이전트는 10초 이내에 스스로 재연결됩니다. 향후 Developer ID로 서명되는 릴리스에서는 이 단계를 제거할 예정입니다.
make test
단위 테스트(Unit tests)는 순수 로직(다이얼로그 텍스트 파싱, 지속 시간 및 일시 중지 파싱, 허용 목록 매칭, launchd plist 생성, 그리고 fixture 아카이브를 이용한 Local Network 규칙 디코더)을 다룹니다. 이들은 일반 swiftc로 빌드되며 Xcode나 SwiftPM이 필요 없습니다. 엔드투엔드 경로(실제 프롬프트, 실제 누름 동작)는 Accessibility가 부여된 Mac에서만 확인할 수 있으며, 수동 레시피는 Tests/INTEGRATION.md에 있습니다.
- Apple의 Command Line Tools만으로 빌드됩니다. Xcode는 필요하지 않습니다.
- Apple Silicon과 Intel 모두에서: Homebrew가 각 아키텍처에 네이티브로 컴파일됩니다.
- 빌드에는 macOS 13 이상이 필요하며, 해당 프롬프트 자체는 macOS 15 Sequoia 및 그 이후 버전에서만 존재합니다.
- 현재까지 테스트된 환경: Intel, macOS 26.6. 다른 버전의 보고를 환영합니다.
- 현재는 영어 로컬라이즈(English-localized)된 macOS만 지원됩니다. 다이얼로그 텍스트에 있는 매처 키와 "허용 안 함 (Don't Allow)" 버튼 제목에 대한 현지화 문자열은 계획 중입니다.
MIT 라이선스