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