Fuwari Banner
지니제스트Tech Archive
MacOS7분 소요

macOS TCC 권한 문제와 SQLite 데이터베이스 재구성

•
ggeniezst

macOS에서 애플리케이션 권한 문제가 반복될 때, TCC(Transparency, Consent, and Control) 데이터베이스의 손상 원인을 분석하고 `tccutil` 및 SQLite 직접 접근을 통한 해결 방법을 제시합니다.

Sponsored

macOS 환경에서 개발 및 시스템 관리 업무를 하다 보면, 특정 애플리케이션이 분명 시스템 설정에서 필요한 권한(예: 화면 기록, 전체 디스크 접근, 손쉬운 사용)을 부여받았음에도 불구하고 제대로 동작하지 않거나, 계속해서 권한 요청 팝업을 띄우는 황당한 상황에 직면할 때가 있습니다. 특히 원격 지원 도구, 가상화 소프트웨어, 특정 보안 에이전트 또는 개발용 스크립트 등 시스템 깊숙이 접근해야 하는 도구에서 이러한 문제가 빈번하게 발생합니다. 사용자는 이미 권한을 허용했다고 생각하지만, 시스템은 이를 인지하지 못하는 것처럼 보입니다. 이는 단순히 시스템 설정을 몇 번 다시 클릭하는 것으로 해결되지 않는, macOS의 핵심 보안 메커니즘인 TCC(Transparency, Consent, and Control) 데이터베이스의 미묘한 손상이나 잘못된 상태 때문일 가능성이 큽니다.

이러한 문제는 작업 흐름을 심각하게 방해하며, 해결책을 찾기 위해 불필요한 시간을 소모하게 만듭니다. 이번 포스트에서는 macOS TCC 권한 문제가 발생하는 근본적인 원인을 파악하고, tccutil 명령어를 넘어 SQLite 데이터베이스에 직접 접근하여 문제를 해결하는 심층적인 방법을 다루겠습니다.


macOS TCC 아키텍처 이해와 권한 관리 메커니즘

macOS의 TCC는 사용자의 개인 정보와 시스템의 민감한 데이터에 대한 애플리케이션의 접근을 투명하게 관리하고 통제하기 위한 핵심 보안 프레임워크입니다. 마이크, 카메라, 위치 서비스, 연락처, 캘린더, 사진, 화면 기록, 전체 디스크 접근, 손쉬운 사용 등 다양한 서비스에 대한 접근 권한을 사용자의 명시적인 동의하에 부여하고 관리합니다.

TCC는 tccd라는 데몬 프로세스에 의해 관리되며, 이 데몬은 TCC.db라는 SQLite 데이터베이스에 모든 권한 부여 기록을 저장합니다. 이 데이터베이스는 주로 두 곳에 위치합니다:

  • 사용자별 권한: ~/Library/Application Support/com.apple.TCC/TCC.db
  • 시스템 전체 권한: /Library/Application Support/com.apple.TCC/TCC.db (이 파일은 root 권한으로 관리되며, 일반적인 앱 권한 문제보다는 시스템 서비스 관련 문제에서 더 중요합니다.)

애플리케이션이 특정 보호된 리소스에 접근을 시도하면, tccd는 TCC.db를 조회하여 해당 애플리케이션에 권한이 부여되었는지 확인합니다. 만약 기록이 없거나 deny 상태인 경우, 사용자에게 권한 요청 팝업을 띄우고, 사용자의 결정(허용 또는 거부)을 TCC.db에 기록합니다. 문제는 이 TCC.db 파일이 손상되거나, 특정 애플리케이션의 번들 ID가 변경되거나, 시스템 업데이트 과정에서 데이터가 올바르게 마이그레이션되지 않을 때 발생합니다. tccd 데몬이 TCC.db의 상태를 잘못 캐싱하거나, 데이터베이스의 무결성이 깨지면 시스템 설정에 표시되는 정보와 실제 애플리케이션의 동작 간에 불일치가 발생하게 됩니다.


TCC 데이터베이스 손상 진단 및 일반적인 증상 분석

TCC 데이터베이스 손상으로 인한 권한 문제는 다양한 형태로 나타나지만, 공통적인 특징이 있습니다. 가장 흔한 증상은 다음과 같습니다.

  • 반복적인 권한 요청 팝업: 특정 애플리케이션을 실행할 때마다 이미 허용한 권한임에도 불구하고 "앱이 화면 기록에 접근하려고 합니다"와 같은 팝업이 계속해서 나타납니다.
  • 시스템 설정과의 불일치: 시스템 설정 > 개인정보 보호 및 보안 섹션에서 해당 애플리케이션에 권한이 분명히 부여된 것으로 표시되지만, 애플리케이션은 여전히 권한이 없다고 보고하거나 기능이 제대로 작동하지 않습니다. 예를 들어, iTerm2나 Terminal에 전체 디스크 접근 권한을 주었음에도 불구하고 특정 경로 접근 시 Operation not permitted 오류가 발생합니다.
  • 특정 기능 마비: 화면 기록 앱이 화면을 캡처하지 못하거나, 원격 제어 앱이 키보드/마우스 이벤트를 전달하지 못하거나, 가상화 소프트웨어가 USB 장치에 접근하지 못하는 등, 권한이 필요한 핵심 기능이 작동하지 않습니다.
  • tccutil reset All 명령의 무용성: 일반적인 해결책으로 알려진 tccutil reset All 명령을 실행하여 모든 권한을 초기화한 후 다시 부여해도 문제가 해결되지 않습니다. 이는 tccutil이 데이터베이스의 논리적인 상태를 초기화할 뿐, 물리적인 데이터베이스 손상이나 특정 '고착된' 상태를 복구하지 못하기 때문입니다.

이러한 증상이 나타난다면 TCC.db 파일 자체의 무결성 문제나 잘못된 엔트리 때문일 가능성이 높으며, 보다 근본적인 접근이 필요합니다. 시스템 로그(log stream --predicate 'subsystem == "com.apple.TCC"' --info)를 통해 tccd의 동작을 관찰할 수 있지만, 대부분의 경우 명확한 오류 메시지보다는 단순히 권한 거부(deny) 상태를 반복적으로 기록할 뿐입니다.


tccutil 명령어를 이용한 권한 초기화와 한계

macOS는 TCC 권한을 관리하기 위한 커맨드라인 유틸리티인 tccutil을 제공합니다. 이 도구는 특정 서비스 또는 모든 서비스에 대한 애플리케이션의 권한을 초기화하는 데 사용됩니다.

BASH
# 특정 서비스의 모든 권한을 초기화합니다. (예: 화면 기록)
# 이 명령은 'ScreenCapture' 서비스에 대한 모든 앱의 권한을 초기화하여,
# 해당 앱들이 다음에 화면 기록을 시도할 때 다시 권한 요청 팝업을 띄우게 만듭니다.
tccutil reset ScreenCapture

# 특정 애플리케이션의 특정 서비스 권한을 초기화합니다.
# 애플리케이션의 번들 ID (Bundle ID)를 정확히 알아야 합니다.
# 번들 ID는 'osascript -e 'id of app "앱이름"'' 명령으로 찾을 수 있습니다.
# 예를 들어, iTerm2의 전체 디스크 접근 권한을 초기화합니다.
tccutil reset SystemPolicyAllFiles com.googlecode.iterm2

# 모든 서비스의 모든 권한을 초기화합니다. (매우 주의: 모든 앱의 권한을 다시 설정해야 함)
# 이 명령은 사용자 TCC.db에 기록된 모든 권한을 삭제합니다.
# 시스템 전체 TCC.db에는 영향을 미치지 않습니다.
tccutil reset All

tccutil은 사용자가 실수로 잘못된 권한을 부여했거나, 특정 앱의 권한 상태를 깔끔하게 초기화하고 싶을 때 유용합니다. 그러나 이 명령은 TCC.db 파일 자체의 물리적인 손상이나 논리적인 일관성 문제를 해결하지 못합니다. tccutil은 단순히 데이터베이스 내의 특정 레코드를 삭제하거나 업데이트하는 방식으로 작동하며, 데이터베이스 파일 자체가 손상되어 tccd 데몬이 이를 제대로 읽거나 쓸 수 없는 경우에는 무용지물이 됩니다.

특히, tccutil reset All 명령을 실행한 후에도 문제가 해결되지 않는다면, 이는 TCC.db 파일 자체의 구조적 문제일 가능성이 높으며, 이 경우 SQLite 데이터베이스에 직접 접근하여 문제를 해결해야 합니다. 이는 더 깊은 수준의 트러블슈팅을 요구하며, 시스템에 대한 이해가 필요합니다.


SQLite 직접 접근을 통한 TCC 데이터베이스 재구성

tccutil로 해결되지 않는 TCC 권한 문제는 TCC.db SQLite 데이터베이스에 직접 접근하여 손상된 엔트리를 수정하거나 제거함으로써 해결할 수 있습니다. 이 방법은 강력하지만, 잘못 사용하면 시스템 보안 설정에 심각한 문제를 초래할 수 있으므로 반드시 백업을 먼저 수행하고 신중하게 진행해야 합니다.

아래 단계는 사용자별 TCC.db (~/Library/Application Support/com.apple.TCC/TCC.db)를 기준으로 설명합니다. 대부분의 권한 문제는 이 파일과 관련되어 있습니다.

  1. 영향받는 애플리케이션 종료: TCC 권한 문제가 있는 모든 애플리케이션을 완전히 종료합니다. tccd 데몬이 데이터베이스 파일을 사용 중일 수 있으므로, 가능하다면 관련 프로세스를 모두 종료하는 것이 좋습니다.

  2. TCC.db 파일 백업: 데이터베이스를 수정하기 전에 현재 상태를 백업하는 것은 필수입니다. 만약 문제가 발생하면 백업 파일로 복구할 수 있습니다.

    BASH
    # 사용자 TCC.db 백업 (필수!)
    cp ~/Library/Application\ Support/com.apple.TCC/TCC.db ~/Desktop/TCC.db.bak
    
    # (선택 사항) 시스템 전체 TCC.db 백업 (root 권한 필요)
    # sudo cp /Library/Application\ Support/com.apple.TCC/TCC.db /Library/Application\ Support/com.apple.TCC/TCC.db.bak
  3. SQLite3를 사용하여 TCC.db 열기: 터미널에서 sqlite3 명령어를 사용하여 데이터베이스 파일을 엽니다.

    BASH
    sqlite3 ~/Library/Application\ Support/com.apple.TCC/TCC.db
  4. 데이터베이스 내용 확인: sqlite3 프롬프트(sqlite>)에서 다음 명령어를 입력하여 데이터베이스의 테이블 구조와 access 테이블의 내용을 확인합니다. access 테이블은 어떤 서비스(service)에 어떤 클라이언트(client, 즉 애플리케이션의 번들 ID)가 어떤 상태(auth_value, 0은 거부, 1은 허용, 2는 부분 허용 등)로 기록되어 있는지 보여줍니다.

    SQL
    -- 데이터베이스 내 테이블 목록 확인
    .tables
    
    -- 'access' 테이블의 모든 내용 확인
    SELECT * FROM access;

    SELECT * FROM access; 명령의 결과에서 문제가 되는 애플리케이션의 번들 ID (예: com.microsoft.teams, com.apple.Terminal, com.googlecode.iterm2)와 해당 서비스(예: kTCCServiceScreenCapture, kTCCServiceSystemPolicyAllFiles, kTCCServiceAccessibility)를 찾아봅니다.

  5. 특정 애플리케이션의 특정 서비스 항목 삭제: 문제가 되는 애플리케이션의 TCC 엔트리를 삭제합니다. 이렇게 하면 macOS는 해당 앱이 다시 권한을 요청할 때 새로운 엔트리를 생성하게 됩니다.

    SQL
    -- 예시: Microsoft Teams의 화면 기록 권한을 삭제합니다.
    DELETE FROM access WHERE service = 'kTCCServiceScreenCapture' AND client = 'com.microsoft.teams';
    
    -- 예시: Terminal 앱의 전체 디스크 접근 권한을 삭제합니다.
    DELETE FROM access WHERE service = 'kTCCServiceSystemPolicyAllFiles' AND client = 'com.apple.Terminal';
    
    -- 예시: iTerm2의 손쉬운 사용 권한을 삭제합니다.
    DELETE FROM access WHERE service = 'kTCCServiceAccessibility' AND client = 'com.googlecode.iterm2';
    
    -- 모든 항목을 삭제하려면 (매우 주의: 모든 권한을 다시 설정해야 함)
    -- DELETE FROM access;

    삭제 명령 실행 후 SELECT * FROM access;를 다시 실행하여 해당 엔트리가 성공적으로 삭제되었는지 확인합니다. 작업이 완료되면 .quit를 입력하여 sqlite3 프롬프트를 종료합니다.

  6. tccd 데몬 재시작 또는 시스템 재부팅: tccd 데몬이 변경된 데이터베이스를 다시 로드하도록 해야 합니다. 가장 확실한 방법은 시스템을 재부팅하는 것입니다. 또는 tccd 데몬을 강제 종료하여 재시작을 유도할 수 있습니다.

    BASH
    # tccd 데몬 강제 종료 (시스템이 일시적으로 불안정해질 수 있음)
    sudo killall tccd
    
    # 또는 시스템 전체 TCC.db 문제가 의심되는 경우 (root 권한 필요)
    # sudo launchctl stop com.apple.tccd && sudo launchctl start com.apple.tccd

    재부팅이 가장 안전하고 권장되는 방법입니다.


해결 후 검증 및 권한 재설정

위 단계를 통해 TCC.db를 재구성했다면, 이제 문제가 해결되었는지 확인하고 필요한 권한을 다시 설정해야 합니다.

  1. macOS 재부팅: TCC 데몬과 관련 시스템 서비스가 변경된 TCC.db 파일을 올바르게 로드하도록 시스템을 완전히 재부팅하는 것이 가장 중요합니다.
  2. 문제의 애플리케이션 실행: 재부팅 후, 이전에 TCC 권한 문제가 발생했던 애플리케이션을 실행합니다.
  3. 권한 재요청 확인: 애플리케이션이 실행되면서 필요한 권한에 대해 새로운 요청 팝업을 띄우는지 확인합니다. 이 팝업이 나타난다면 TCC 데이터베이스가 성공적으로 초기화되었거나 손상된 엔트리가 제거된 것입니다.
  4. 시스템 설정에서 권한 재설정: 팝업이 뜨면 시스템 설정 > 개인정보 보호 및 보안 섹션으로 이동하여 해당 애플리케이션에 필요한 권한을 다시 부여합니다. 예를 들어, 화면 기록 또는 전체 디스크 접근 목록에서 해당 앱의 체크박스를 다시 활성화합니다.
  5. 기능 검증: 권한을 부여한 후, 애플리케이션의 문제가 되었던 기능을 다시 테스트하여 정상적으로 작동하는지 확인합니다. 예를 들어, 화면 기록 앱으로 화면을 녹화해 보거나, Terminal에서 전체 디스크 접근이 필요한 명령어를 실행해 봅니다.
  6. 시스템 설정에서 권한 지속성 확인: 시스템 설정에 다시 방문하여 부여된 권한이 올바르게 반영되어 있고, 재부팅 후에도 유지되는지 확인합니다.

이 과정을 통해 대부분의 TCC 권한 문제는 해결될 것입니다. 만약 여전히 문제가 발생한다면, 애플리케이션 자체의 버그나 macOS 시스템 파일 손상 등 다른 원인을 고려해야 합니다.


TCC 권한 트러블슈팅 FAQ

Q. 시스템 설정에서 앱이 권한 목록에 아예 나타나지 않아요.

A. 애플리케이션이 아직 해당 권한을 요청하지 않았거나, 앱 번들 서명에 문제가 있을 수 있습니다. 먼저 해당 앱을 실행하여 권한 요청 팝업이 뜨도록 유도해 보세요. 그래도 나타나지 않는다면, 앱을 완전히 삭제하고 재설치하는 것이 좋습니다. 만약 앱이 권한을 요청하지 않는데도 특정 기능이 작동하지 않는다면, 해당 앱이 TCC 프레임워크를 제대로 사용하지 않거나, 시스템 권한이 아닌 다른 문제일 수 있습니다. 위에 설명된 SQLite 직접 접근 방식으로 해당 service와 client를 수동으로 access 테이블에 추가하거나, 기존 access 테이블을 비운 뒤 재부팅하여 앱이 처음부터 다시 요청하도록 유도해야 할 수 있습니다.

Q. 전체 디스크 접근 권한을 줬는데도 Operation not permitted 에러가 계속 나와요.

A. 전체 디스크 접근 권한은 TCC가 관리하는 중요한 권한이지만, macOS의 또 다른 강력한 보안 기능인 SIP (System Integrity Protection)에 의해 보호되는 일부 시스템 경로는 여전히 접근이 제한될 수 있습니다. SIP는 root 사용자조차도 특정 시스템 파일과 디렉토리에 대한 수정을 막습니다. 또한, Terminal이나 iTerm2 같은 셸 애플리케이션에 전체 디스크 접근 권한을 부여했는지 다시 확인해야 합니다. 만약 Finder 자체에서 접근 문제가 발생한다면, TCC 데이터베이스 손상 외에 파일 시스템 오류일 가능성도 있으므로, 복구 모드에서 디스크 유틸리티를 통한 응급 처치 또는 fsck 검사를 시도해 볼 수 있습니다.

Q. sudo killall tccd 명령 후 시스템이 불안정해졌어요.

A. tccd 데몬은 macOS의 핵심 보안 및 개인 정보 보호 구성 요소이므로, sudo killall tccd 명령으로 이를 강제 종료하는 것은 일시적인 시스템 불안정을 초래할 수 있습니다. 예를 들어, 일부 권한 요청 팝업이 사라지거나, 시스템 설정의 개인정보 보호 및 보안 섹션이 제대로 로드되지 않을 수 있습니다. 일반적으로 이러한 불안정은 시스템을 재부팅하면 해결됩니다. 이 명령은 단순히 tccd가 TCC 데이터베이스를 다시 로드하도록 유도하는 목적으로 사용되며, 가장 안전하고 권장되는 방법은 시스템을 재부팅하는 것입니다.

Q. TCC.db 파일을 백업하지 않고 삭제해버렸어요. 어떻게 해야 하나요?

A. TCC.db 파일을 백업 없이 삭제했다면, macOS는 다음 부팅 시 또는 tccd 데몬이 재시작될 때 새로운 빈 TCC.db 데이터베이스 파일을 자동으로 생성합니다. 이 경우 이전에 부여했던 모든 애플리케이션의 TCC 권한 설정이 초기화됩니다. 데이터가 손실되는 것은 아니지만, 필요한 모든 애플리케이션의 권한을 시스템 설정에서 처음부터 다시 부여해야 하므로 다소 번거로운 과정이 될 수 있습니다. 이는 사실상 tccutil reset All 명령을 실행한 것과 유사한 효과를 냅니다.

Sponsored