컨테이너 데이터, 샌드박스와 서명 신원
핵심 내용
~/Library/Containers/와 ~/Library/Group Containers/의 데이터는 샌드박스 앱의 데이터입니다. ‘바로가기’(심볼릭 링크)로 외장 드라이브에 옮기면 앱이 읽지 못합니다. 예전 AppPorts는 재서명으로 우회했지만 그 결과 macOS 27에서 앱이 열리지 않거나 로그인 상태를 잃을 수 있습니다.
1.9.0부터 컨테이너 데이터는 마운트 마이그레이션을 사용하며 서명을 한 바이트도 변경하지 않습니다. 이미 재서명한 앱은 재설치해야 합니다. macOS 27 업그레이드 안내를 참고하세요.
이 문서는 배경을 설명합니다. 이미 앱이 열리지 않는다면 macOS 27 업그레이드 안내의 복구 단계로 바로 이동하세요.
컨테이너란 무엇인가요?
대부분의 macOS 앱은 샌드박스에서 실행됩니다. 시스템이 앱마다 ~/Library/Containers/<Bundle ID>/라는 전용 폴더를 배정하며 앱은 그 안에서만 읽고 쓸 수 있습니다. App Store 앱은 필수이며 공식 사이트에서 받는 WeChat, QQ Music 같은 앱도 대부분 그렇습니다. 여러 앱이 공유하는 데이터는 ~/Library/Group Containers/에 저장합니다.
앱의 권한 정보에 com.apple.security.app-sandbox가 있는지 보면 샌드박스 앱인지 알 수 있습니다.
codesign -d --entitlements - --xml /Applications/WeChat.app 2>/dev/null | grep -c app-sandbox
# 输出 1 就是沙盒应用놓치기 쉬운 점이 있습니다. 주 프로그램이 샌드박스가 아니어도 컨테이너를 마음대로 옮겨도 된다는 뜻은 아닙니다. Chrome과 Edge의 주 프로그램은 샌드박스 밖에 있지만 위젯과 확장 프로그램은 각각 자신의 컨테이너를 가지며, 그 소유자는 샌드박스 프로세스입니다. 따라서 AppPorts는 주 프로그램을 기준으로 삼지 않고 Containers 아래 모든 디렉토리를 동일하게 취급합니다.
컨테이너 데이터를 옮기는 세 가지 방법
| 방법 | 결과 | 이유 |
|---|---|---|
| 외장 드라이브에 복사하고 원래 위치에 심볼릭 링크 남기기 | 앱은 열리지만 데이터를 읽지 못함. WeChat은 저장 위치를 사용할 수 없다고 표시 | 샌드박스가 확인하는 것은 링크의 대상입니다. 컨테이너 밖이면 거부하므로 외장 드라이브와 데스크탑 모두 같은 결과 |
| 심볼릭 링크 + Ad-hoc 재서명 | macOS 26 이하에서는 사용 가능. 27에서는 이중 클릭 직후 종료될 수 있음. WeChat에서 확인했으며 QQ Music은 아직 열림 | 재서명이 샌드박스 신원을 제거해 링크가 작동하게 하지만, 앱과 컨테이너의 소유 관계도 지웁니다. 27부터 시스템이 그 관계를 확인 |
| 외장 드라이브의 APFS 볼륨을 원래 디렉토리에 마운트 | 정상 동작하며 서명 유지 | 경로가 컨테이너를 벗어나지 않아 샌드박스가 허용. 외장 데이터 접근 권한 창이 한 번 뜨면 허용하면 됨 |
세 방법 모두 macOS 27에서 직접 검증했습니다. 원본 로그는 실험 기록: 심볼릭 링크와 실험 기록: 마운트 지점에 있습니다.
재서명이 실제로 바꾸는 것
Ad-hoc 재서명(codesign --force --deep --sign -)은 앱에서 다음을 제거합니다.
| 사라지는 항목 | 결과 |
|---|---|
com.apple.security.app-sandbox | 앱이 더 이상 샌드박스 신원으로 실행되지 않음 |
com.apple.security.application-groups | Group Containers의 공유 데이터를 읽지 못함 |
keychain-access-groups | 키체인의 로그인 상태와 데이터베이스 키를 읽지 못함 |
| Team ID | 시스템이 컨테이너 소유자를 확인할 때 일치하지 않음 |
앱이 즉시 고장 나는 것은 아닙니다. 일반 프로세스로 자신의 컨테이너를 읽으면 macOS 26 이하는 허용합니다. 27에서는 이전 서명에 대한 권한 기록이 시스템에 남아 있으면 코드 요구 사항 불일치로 거부합니다.
sandboxd rejected approval request from WeChat for kTCCServiceSystemPolicyAppData
(/Users/<user>/Library/Containers/com.tencent.xinWeChat/Data/Documents/xwechat_files): denied
runningboardd: termination reported by launchd (0, 0, 65280)같은 컴퓨터의 동일하게 재서명된 WeChat에서 확인한 결과입니다.
| 시스템 | 동작 |
|---|---|
| macOS 26.6.2 | 이틀 반 동안 계속 정상 사용 |
| macOS 27.0 | 실행할 때마다 약 0.4초 후 종료 |
‘지금까지 괜찮았다’는 안전의 증거가 아닙니다
재서명 후 몇 주나 몇 달 정상 사용하다가 다음 주요 시스템 업그레이드에서 문제가 발생할 수 있습니다. 업그레이드 전후에 별도 경고도 없습니다. 원 개발자의 인증서가 이 Mac에 없으므로 제거한 권한을 다시 서명해 되돌릴 수 없고 재설치해야 합니다.
터미널에서는 왜 열리나요?
문제 해결 중 이 점에 속기 쉽습니다. 시스템은 ‘책임 프로세스’를 기준으로 권한을 판단합니다. Finder나 Dock에서 이중 클릭하면 앱 자신이 책임 프로세스이며 자신의 신원으로 권한을 요청하다 거부됩니다. 터미널이나 이미 전체 디스크 접근 권한이 있는 프로그램에서 시작하면 호스트가 책임 프로세스로 취급되어 앱이 그 권한을 빌려 쓰게 됩니다.
따라서 터미널에서 열린다고 해결된 것이 아닙니다. 기준은 Finder / Dock에서 이중 클릭해 여는 것입니다.
직접 확인
/Applications/WeChat.app을 확인할 앱으로 바꾸세요.
# 1. 签名身份
codesign -dv --verbose=4 /Applications/WeChat.app 2>&1 | grep -E "Authority|TeamIdentifier|Signature"
# 2. 授权(正常输出一段 XML;只有 Executable= 一行说明已被抹掉)
codesign -d --entitlements - /Applications/WeChat.app
# 3. 容器里有没有指向外置盘的符号链接
find ~/Library/Containers/<Bundle ID> -maxdepth 6 -type l -exec readlink {} \; 2>/dev/null
# 4. 复现一次,看系统有没有拒绝
open -a /Applications/WeChat.app; sleep 3
log show --last 1m --style compact 2>/dev/null | grep -iE "rejected approval request|deny\(1\) file-read-data"| 확인 결과 | 의미 |
|---|---|
Signature=adhoc이며 TeamIdentifier=not set | 재서명된 상태. 열리지 않으면 앱 재설치 필요 |
3단계 출력이 /Volumes/...를 가리킴 | 컨테이너에 이전 심볼릭 링크가 남아 있으므로 먼저 복원 필요 |
로그에 kTCCServiceSystemPolicyAppData ... denied | 재서명 때문에 자신의 컨테이너 접근이 거부됨 |
로그에 deny(1) file-read-data /Volumes/... | 외장 데이터로 향하는 심볼릭 링크를 샌드박스가 거부함 |
두 로그가 동시에 나타날 수도 있습니다. 서로 독립된 문제이므로 각각 해결해야 합니다.
복구
순서를 바꾸면 재설치한 앱도 여전히 심볼릭 링크를 보게 되어 재설치가 소용없는 것처럼 보입니다.
- 컨테이너 데이터 복원: AppPorts의 ‘앱 데이터’에서 해당 앱의 ‘연결됨’ 상태 컨테이너 디렉토리를 하나씩 ‘복원’하여 이 Mac으로 돌려놓습니다.
- 앱 재설치: 공식 경로에서 덮어 설치해 원본 서명과 샌드박스를 복구합니다. 컨테이너 데이터는 삭제되지 않습니다.
- 필요하면 마운트 마이그레이션: 재설치 후 컨테이너 디렉토리에 ‘마운트 마이그레이션’이 표시됩니다. 계속 외장 드라이브에 두고 싶으면 이 방식으로 다시 옮깁니다.
새 AppPorts의 ‘원본 서명 복원’은 개발자 개인 키 없이 전체 백업에서 원래 앱을 복원할 수 있습니다. 신원 이름만 남은 이전 기록은 같은 버전의 공식 원본 앱을 선택하거나 공식 경로에서 재설치해야 합니다. 서명 백업과 복원을 참고하세요. 서명을 복원하기 전에 클래식 모드로 옮긴 컨테이너 디렉토리를 먼저 복원해야 합니다.
자세한 단계와 이미 외장 드라이브로 옮긴 앱 처리 방법은 macOS 27 업그레이드 안내를 참고하세요.
실제 사례
2026년 9월 실제 컴퓨터에서 발생한 전체 과정입니다.
| 시각 | 사건 |
|---|---|
| 9/15 04:46 | AppPorts가 WeChat 채팅 디렉토리를 외장 드라이브로 옮기고 원래 위치에 심볼릭 링크 생성 |
| 9/15 04:47 | AppPorts가 WeChat을 Ad-hoc 재서명 |
| 9/16~9/18 | macOS 26.6.2에서 이틀 반 정상 사용 |
| 9/18 04:46 | macOS 27.0으로 업그레이드 |
| 9/18부터 | 실행할 때마다 약 0.4초 후 종료 |
| 9/18 05:04 | 사용자가 데이터를 복원하고 다시 재서명했지만 동일한 문제 발생 |
| 9/18 | 데이터 복원 후 공식 사이트에서 WeChat 재설치. 정상 복구되었으며 채팅 기록 온전 |
데이터는 처음부터 끝까지 손상되지 않았습니다. 실제 문제의 씨앗은 재서명이었으며 업그레이드 전에는 증상이 없었습니다.
관련 문서
- macOS 27 업그레이드 안내: 업그레이드 전 확인과 복구 단계
- 마운트 마이그레이션: 새 방식 사용법
- 외장 드라이브가 APFS여야 하는 이유
- 재서명과 충돌 방지: 현재 재서명 기능의 범위
