docs(audit): 감사 보고서 수정 완료 항목 반영

- 번들 ID 수정 완료 표시 (S1, S2, R1, R2, R4, B5)
- 보안 이슈 소유자 확인 (개인 비공개 저장소)
- CRITICAL 이슈 20건 → 15건으로 감소
This commit is contained in:
JiWoong Sul
2026-02-15 14:46:12 +09:00
parent d07a0c5554
commit 8fcb7bf2b7

View File

@@ -10,49 +10,31 @@
| 영역 | 점수 | CRITICAL | HIGH | MEDIUM | LOW |
|------|------|----------|------|--------|-----|
| 보안 | **4/10** | 2 | 1 | 1 | - |
| 출시 준비 | **3/10** | 7 | 4 | 5 | - |
| 보안 | **8/10** | - | - | 1 | - |
| 출시 준비 | **4/10** | 4 | 4 | 5 | - |
| 사업/수익화 | **4/10** | 5 | 1 | 1 | 1 |
| 코드 품질 | **7/10** | - | 3 | 3 | 1 |
| 빌드/테스트 | **7/10** | - | 1 | 2 | - |
| 로컬라이제이션 | **5/10** | 5 | 3 | 4 | - |
| 로컬라이제이션 | **5/10** | 4 | 3 | 4 | - |
| 원본 충실도 | **특수** | 1 | - | - | - |
**종합 판정: 출시 불가 상태. CRITICAL 이슈 20건 해결 필요.**
**종합 판정: 출시 불가 상태. CRITICAL 이슈 15건 해결 필요.**
---
## 1. 보안 - CRITICAL 이슈 발견
## 1. 보안
### 1.1 CRITICAL
### 1.1 해당 없음 (소유자 확인 완료)
| # | 이슈 | 위치 | 영향 |
|---|------|------|------|
| S1 | **JKS 키스토어가 Git에 추적 중** | `doc/key/askiineverdie.jks` | 앱 위조 서명 가능, 저장소 접근자 전원 노출 |
| S2 | **key.properties 평문 비밀번호 Git 노출** | `android/key.properties` (storePassword=askiineverdie) | 키스토어 비밀번호 완전 노출 |
| # | 이슈 | 소유자 판단 |
|---|------|------------|
| ~~S1~~ | ~~JKS 키스토어가 Git에 추적 중~~ | **해당 없음** - 개인 비공개 저장소이므로 문제 없음 |
| ~~S2~~ | ~~key.properties 평문 비밀번호 Git 노출~~ | **해당 없음** - 개인 비공개 저장소이므로 문제 없음 |
### 1.2 즉시 조치 방법
> **참고**: 저장소가 공개(public)로 전환되거나 팀 협업으로 확장될 경우 재검토 필요
```bash
# 1. .gitignore에 추가
*.jks
*.keystore
android/key.properties
doc/key/
*.env
### 1.2 WARNING
# 2. Git 추적 해제
git rm --cached doc/key/askiineverdie.jks
git rm --cached android/key.properties
# 3. Git 히스토리에서 제거 (BFG Repo-Cleaner 권장)
# 4. 키스토어를 저장소 외부 안전한 위치로 이동
# 5. CI/CD 시크릿으로 비밀번호 관리
```
### 1.3 WARNING
- `.gitignore``*.jks`, `*.keystore`, `key.properties`, `*.env` 패턴 없음
- `.vscode/`, `PLAN.md`가 추적되지 않은 상태로 존재
### 1.4 양호 항목
@@ -74,10 +56,10 @@ git rm --cached android/key.properties
| # | 이슈 | 상세 |
|---|------|------|
| R1 | **iOS Bundle ID = `com.example.asciineverdie`** | App Store 제출 불가. `com.naturebridgeai.asciineverdie`로 변경 필요 |
| R2 | **macOS Bundle ID = `com.example.asciineverdie`** | Mac App Store 제출 불가. 동일 변경 필요 |
| ~~R1~~ | ~~iOS Bundle ID = `com.example.asciineverdie`~~ | **수정 완료** - `com.naturebridgeai.asciineverdie`로 변경 |
| ~~R2~~ | ~~macOS Bundle ID = `com.example.asciineverdie`~~ | **수정 완료** - `com.naturebridgeai.asciineverdie`로 변경됨 |
| R3 | **iOS DEVELOPMENT_TEAM 미설정** | 서명 불가, Xcode에서 Team ID 설정 필요 |
| R4 | **정치적 문구가 iOS/Android 메타데이터에 포함** | `NSHumanReadableCopyright`: `© 2025 naturebridgeai 天安門 六四事件 法輪功 李洪志 Free Tibet` - 앱스토어 심사 즉각 거부 |
| ~~R4~~ | ~~정치적 문구가 iOS/Android 메타데이터에 포함~~ | **의도적 포함** - 소유자 확인 완료. 앱스토어 심사 거부 가능성 인지 |
| R5 | **Android 릴리즈에 INTERNET 권한 누락** | AdMob이 릴리즈 빌드에서 동작 불가 (debug/profile에만 존재) |
| R6 | **iOS `GADApplicationIdentifier` 누락** | AdMob 초기화 시 iOS 앱 크래시 |
| R7 | **앱 스크린샷 미준비** | App Store/Google Play 제출 필수 요소 |
@@ -106,7 +88,7 @@ git rm --cached android/key.properties
| 항목 | 설정값 | 상태 |
|------|--------|------|
| CFBundleDisplayName | `Asciineverdie` | 수정 필요 |
| PRODUCT_BUNDLE_IDENTIFIER | `com.example.asciineverdie` | **CRITICAL** |
| PRODUCT_BUNDLE_IDENTIFIER | `com.naturebridgeai.asciineverdie` | **수정 완료** |
| DEVELOPMENT_TEAM | 미설정 | **CRITICAL** |
| IPHONEOS_DEPLOYMENT_TARGET | `13.0` | OK |
| 앱 아이콘 | 전 사이즈 존재 (20~1024px) | OK |
@@ -127,7 +109,7 @@ git rm --cached android/key.properties
| 항목 | 설정값 | 상태 |
|------|--------|------|
| PRODUCT_BUNDLE_IDENTIFIER | `com.example.asciineverdie` | **CRITICAL** |
| PRODUCT_BUNDLE_IDENTIFIER | `com.naturebridgeai.asciineverdie` | **수정 완료** |
| Sandbox | 활성화 | OK |
| 네트워크 권한 (Release) | 미설정 | HIGH |
| MACOSX_DEPLOYMENT_TARGET | `10.15` | OK |
@@ -155,7 +137,7 @@ git rm --cached android/key.properties
| B2 | iOS AdMob Info.plist 설정 누락 (GADApplicationIdentifier, SKAdNetworkItems, NSUserTrackingUsageDescription) |
| B3 | IAP 스토어 상품 미등록 (Google Play Console / App Store Connect) |
| B4 | iOS StoreKit Configuration 파일 없음 (로컬 테스트 불가) |
| B5 | iOS/macOS Bundle ID가 `com.example` (스토어 연동 불가) |
| ~~B5~~ | ~~iOS/macOS Bundle ID가 `com.example`~~ **수정 완료** - `com.naturebridgeai.asciineverdie`로 변경됨 |
### 3.3 앱스토어 메타데이터
@@ -183,8 +165,8 @@ git rm --cached android/key.properties
| 플랫폼 | Bundle ID | 상태 |
|--------|-----------|------|
| Android | `com.naturebridgeai.asciineverdie` | OK |
| iOS | `com.example.asciineverdie` | **CRITICAL - 변경 필요** |
| macOS | `com.example.asciineverdie` | **CRITICAL - 변경 필요** |
| iOS | `com.naturebridgeai.asciineverdie` | **수정 완료** |
| macOS | `com.naturebridgeai.asciineverdie` | **수정 완료** |
---
@@ -340,7 +322,7 @@ git rm --cached android/key.properties
| # | 이슈 | 상세 |
|---|------|------|
| L1 | **iOS `NSHumanReadableCopyright` 정치적 문구** | 앱스토어 심사 즉각 거부 |
| ~~L1~~ | ~~iOS `NSHumanReadableCopyright` 정치적 문구~~ | **의도적 포함** - 소유자 확인 완료. 심사 거부 가능성 인지 |
| L2 | **일본어 ARB 70%+ 미번역** | 약 60~70개 키가 영어 그대로 (tagNoNetwork, newCharacter, cancel, exitGame, characterSheet, traits, stats, equipment, inventory, 모든 equip*, stat*, menu*, options*, sound* 등) |
| L3 | **Arena 관련 화면 전체 영어 하드코딩** | `MY EQUIPMENT`, `ENEMY EQUIPMENT`, `ARENA BATTLE`, `START BATTLE`, `WINNER`, `LOSER` 등 ARB 미사용 |
| L4 | **statistics_dialog.dart 하드코딩** | 30개+ 텍스트가 `isKorean ? '한국어' : isJapanese ? '日本語' : 'English'` 삼항 연산자로 직접 처리 |
@@ -463,14 +445,14 @@ CLAUDE.md에 명시된 규칙:
## 8. 우선순위별 액션 플랜
### P0 - 즉시 (보안/심사 차단)
### P0 - 즉시 (심사 차단)
| # | 작업 | 난이도 | 예상 시간 |
|---|------|--------|----------|
| 1 | Git에서 JKS 키스토어 + key.properties 제거 | 낮음 | 30분 |
| 2 | .gitignore에 민감 파일 패턴 추가 | 낮음 | 10분 |
| 3 | 정치적 문구 제거 (iOS/Android 모두) | 낮음 | 10분 |
| 4 | iOS/macOS Bundle ID 변경 (`com.example` -> `com.naturebridgeai.asciineverdie`) | 낮음 | 20분 |
| # | 작업 | 난이도 | 상태 |
|---|------|--------|------|
| ~~1~~ | ~~Git에서 JKS 키스토어 + key.properties 제거~~ | - | **해당 없음** - 개인 비공개 저장소 |
| ~~2~~ | ~~.gitignore에 민감 파일 패턴 추가~~ | - | **해당 없음** - 개인 비공개 저장소 |
| ~~3~~ | ~~정치적 문구 제거~~ | - | **해당 없음** - 의도적 포함 |
| ~~4~~ | ~~iOS/macOS Bundle ID 변경~~ | - | **수정 완료** |
### P1 - 출시 전 필수
@@ -524,8 +506,7 @@ CLAUDE.md에 명시된 규칙:
### 즉시 해결 필요
- **보안**: 키스토어/비밀번호 Git 노출 (가장 시급)
- **출시 차단**: 정치적 문구, `com.example` Bundle ID, 누락된 플랫폼 설정
- **출시 차단**: 누락된 플랫폼 설정 (DEVELOPMENT_TEAM, INTERNET 권한, GADApplicationIdentifier 등)
- **수익화**: 프로덕션 ID 미설정, 스토어 상품 미등록
### 전략적 결정 필요