- CLAUDE.md: Claude-Gemini 교차 토론 프로토콜 추가 - CLAUDE.md: 존재하지 않는 디렉토리 3개 제거 - analysis/fix-plan: 4 Phase 수정 계획 (Claude-Gemini 합의) - .claude/agents/: dev 리뷰 에이전트 9개 복사 - .claude/skills/: 프로젝트 스킬 4개 복사
176 lines
7.5 KiB
Markdown
176 lines
7.5 KiB
Markdown
# asciineverdie Supply Chain Review
|
|
|
|
> 검토일: 2026-03-27
|
|
> Flutter 3.35.3 / Dart 3.9.2
|
|
> Claude-Gemini Cross-Debate 완료 (합의 도달)
|
|
|
|
## Supply Chain Score: 6 / 10
|
|
|
|
| 항목 | 점수 | 비고 |
|
|
|------|------|------|
|
|
| 보안 (CVE) | 8/10 | 알려진 CVE 없음 |
|
|
| 라이선스 | 6/10 | GPL 오염 없음, 폰트 라이선스 파일 누락 |
|
|
| 유지보수 건강도 | 5/10 | google_mobile_ads 2 메이저 뒤처짐, build_runner 전이 의존성 중단 |
|
|
| 최신성 | 4/10 | 직접 의존성 7개 중 5개 메이저 버전 뒤처짐 |
|
|
| 의존성 비대화 | 7/10 | 직접 11개, 프로덕션 전이 포함 ~62개 (합리적 수준) |
|
|
|
|
---
|
|
|
|
## 1. 취약점 (Vulnerabilities)
|
|
|
|
| 패키지 | 버전 | CVE | 심각도 | 수정 버전 |
|
|
|--------|------|-----|--------|-----------|
|
|
| (해당 없음) | - | - | - | - |
|
|
|
|
**결론:** OSV(Open Source Vulnerabilities) 데이터베이스 및 GitHub Advisory Database 기준, 현재 사용 중인 의존성 버전에서 알려진 CVE는 발견되지 않음.
|
|
|
|
다만 `google_mobile_ads` 5.x는 최신 iOS Privacy Manifest 및 UMP(User Messaging Platform) 요구사항을 완벽히 지원하지 않을 가능성이 있어, App Store 심사 거절 리스크 존재.
|
|
|
|
---
|
|
|
|
## 2. 라이선스 이슈
|
|
|
|
| 패키지/자산 | 라이선스 | 리스크 | 필요 조치 |
|
|
|------------|---------|--------|-----------|
|
|
| 모든 Dart 패키지 | BSD-3 / MIT / Apache-2.0 | 없음 | GPL 오염 없음 -- 상업적 사용 안전 |
|
|
| JetBrainsMono (폰트) | OFL-1.1 (추정) | 중간 | 라이선스 파일 미포함. `assets/fonts/`에 OFL.txt 추가 필요 |
|
|
| PressStart2P (폰트) | OFL-1.1 (추정) | 중간 | 라이선스 파일 미포함. `assets/fonts/`에 OFL.txt 추가 필요 |
|
|
|
|
**폰트 라이선스 상세:**
|
|
- JetBrains Mono: JetBrains 배포, Apache 2.0 라이선스
|
|
- Press Start 2P: Google Fonts 배포, OFL 라이선스
|
|
- 두 폰트 모두 상업적 사용 가능하나, 라이선스 텍스트를 앱에 포함해야 하는 의무(attribution) 존재
|
|
- 현재 `assets/fonts/` 디렉토리에 LICENSE 파일이 **전혀 없음**
|
|
- App Store / Play Store 심사에서는 보통 문제되지 않으나, 법적 리스크는 존재
|
|
|
|
---
|
|
|
|
## 3. 유지보수 건강도
|
|
|
|
| 패키지 | 현재 버전 | 상태 | 리스크 |
|
|
|--------|----------|------|--------|
|
|
| cupertino_icons | 1.0.8 | 정상 유지보수 | 낮음 (단, 미사용) |
|
|
| intl | 0.20.2 | Dart 팀 관리 | 없음 |
|
|
| path_provider | 2.1.5 | Flutter 팀 관리 | 없음 |
|
|
| shared_preferences | 2.5.3 | Flutter 팀 관리 | 없음 |
|
|
| just_audio | 0.9.46 | 활발한 커뮤니티 (ryanheise) | 단일 메인테이너 리스크 |
|
|
| freezed_annotation | 2.4.4 | 활발한 커뮤니티 (rrousselGit) | 단일 메인테이너 리스크 |
|
|
| json_annotation | 4.9.0 | Google/Dart 팀 관리 | 없음 |
|
|
| google_mobile_ads | 5.3.1 | Google 관리 | **v5.x 지원 종료 임박** |
|
|
| in_app_purchase | 3.2.3 | Flutter 팀 관리 | 없음 |
|
|
| package_info_plus | 8.3.1 | FlutterCommunity 관리 | 낮음 |
|
|
| build_runner | 2.5.4 | Google/Dart 팀 관리 | **전이 의존성 중단됨** |
|
|
|
|
**중단된 전이 의존성 (Discontinued transitive deps):**
|
|
- `build_resolvers` 2.5.4 -- 공식 중단 선언
|
|
- `build_runner_core` 9.1.2 -- 공식 중단 선언
|
|
- 이 패키지들의 기능은 최신 `build_runner`(2.10+)에 내재화됨
|
|
- 즉각적인 빌드 실패를 일으키진 않으나, 향후 Dart SDK 업데이트 시 호환성 문제 발생 확실
|
|
|
|
---
|
|
|
|
## 4. 메이저 버전 뒤처짐 (Outdated - Major Behind)
|
|
|
|
### 직접 의존성 (Direct)
|
|
|
|
| 패키지 | 현재 | 최신 | 뒤처짐 | 비고 |
|
|
|--------|------|------|--------|------|
|
|
| google_mobile_ads | 5.3.1 | 7.0.0 | **2 메이저** | iOS Privacy Manifest, UMP 지원 필수 |
|
|
| freezed_annotation | 2.4.4 | 3.1.0 | 1 메이저 | freezed 3.x와 짝 맞춰야 함 |
|
|
| package_info_plus | 8.3.1 | 9.0.0 | 1 메이저 | |
|
|
| just_audio | 0.9.46 | 0.10.5 | 1 마이너 (pre-1.0) | 0.x 시맨틱에서는 마이너 = 메이저 |
|
|
| json_annotation | 4.9.0 | 4.11.0 | 2 마이너 | |
|
|
|
|
### 개발 의존성 (Dev)
|
|
|
|
| 패키지 | 현재 | 최신 | 뒤처짐 | 비고 |
|
|
|--------|------|------|--------|------|
|
|
| build_runner | 2.5.4 | 2.13.1 | 8 마이너 | 중단된 전이 의존성 해소 위해 업데이트 필요 |
|
|
| freezed | 2.5.8 | 3.2.5 | **1 메이저** | freezed_annotation 3.x와 함께 업데이트 |
|
|
| json_serializable | 6.9.5 | 6.13.1 | 4 마이너 | |
|
|
| flutter_lints | 5.0.0 | 6.0.0 | 1 메이저 | |
|
|
|
|
---
|
|
|
|
## 5. 불필요한 의존성
|
|
|
|
| 패키지 | 사용 여부 | 판정 | 근거 |
|
|
|--------|----------|------|------|
|
|
| cupertino_icons | 미사용 | **제거 권장** | `lib/` 전체에서 `CupertinoIcons` import 0건. ~280KB 바이너리 낭비 |
|
|
| json_annotation | 간접 사용 | 유지 | freezed_annotation이 re-export하지만, .g.dart 생성 파일이 직접 import함. 제거 시 빌드 깨질 수 있음 |
|
|
|
|
---
|
|
|
|
## 6. 의존성 트리 통계
|
|
|
|
| 항목 | 수치 |
|
|
|------|------|
|
|
| 직접 프로덕션 의존성 | 11개 (SDK 포함) |
|
|
| 직접 개발 의존성 | 6개 (SDK 포함) |
|
|
| 프로덕션 전이 포함 총 패키지 | ~62개 |
|
|
| 개발 포함 총 패키지 (pubspec.lock) | 122개 |
|
|
| 코드 생성 대상 파일 (.freezed.dart + .g.dart) | 8개 |
|
|
|
|
---
|
|
|
|
## 권장 조치 사항
|
|
|
|
### [CRITICAL] 즉시 조치
|
|
|
|
1. **폰트 라이선스 파일 추가**
|
|
- `assets/fonts/JetBrainsMono-LICENSE.txt` (Apache 2.0)
|
|
- `assets/fonts/PressStart2P-OFL.txt` (OFL 1.1)
|
|
- 앱 내 오픈소스 라이선스 화면에 표시 필요
|
|
- Google Fonts 및 JetBrains 공식 사이트에서 다운로드
|
|
|
|
2. **google_mobile_ads 7.x 업데이트 계획 수립**
|
|
- iOS Privacy Manifest 대응 필수 (App Store 심사 거절 리스크)
|
|
- v7.0.0 마이그레이션 가이드: https://developers.google.com/admob/flutter/migration
|
|
|
|
### [HIGH] 단기 조치 (1-2주)
|
|
|
|
3. **cupertino_icons 제거**
|
|
```yaml
|
|
# pubspec.yaml에서 삭제
|
|
# cupertino_icons: ^1.0.8
|
|
```
|
|
|
|
4. **build_runner 체인 업데이트**
|
|
```bash
|
|
flutter pub upgrade build_runner json_serializable
|
|
```
|
|
- 중단된 `build_resolvers`, `build_runner_core` 전이 의존성 해소
|
|
- 빌드 성능 개선 기대
|
|
|
|
5. **freezed 2.x -> 3.x 마이그레이션**
|
|
- freezed_annotation + freezed 동시에 메이저 업데이트
|
|
- 코드 생성 파일 전체 재생성 필요: `dart run build_runner build --delete-conflicting-outputs`
|
|
|
|
### [MEDIUM] 중기 조치 (1개월)
|
|
|
|
6. **just_audio 0.10.x 업데이트**
|
|
- Android 최신 버전 호환성 개선
|
|
- 단일 메인테이너(ryanheise) 패키지이므로 대안(audioplayers) 검토도 병행
|
|
|
|
7. **package_info_plus 9.x 업데이트**
|
|
|
|
8. **flutter_lints 6.x 업데이트**
|
|
- 최신 lint 규칙 적용으로 코드 품질 향상
|
|
|
|
### [LOW] 장기 고려
|
|
|
|
9. **win32 전이 의존성** -- package_info_plus가 Windows 지원에 사용. 모바일 전용이면 무시 가능
|
|
|
|
---
|
|
|
|
## Claude-Gemini Cross-Debate 결과
|
|
|
|
| 항목 | Claude 의견 | Gemini 초기 의견 | 합의 |
|
|
|------|------------|-----------------|------|
|
|
| 종합 점수 | 6/10 | 3.5/10 | **6/10** (Gemini 수정 동의) |
|
|
| CVE-2023-48220 | 해당 없음 (Nextcloud 취약점) | package_info_plus 관련 주장 | **해당 없음** (Gemini 철회) |
|
|
| json_annotation 제거 | 위험 (빌드 깨짐 가능) | 제거 권장 | **유지** (Gemini 수정 동의) |
|
|
| build_runner 긴급도 | 중기 과제 (당장은 동작) | 즉시 수술 필요 | **단기 과제** (절충) |
|
|
| 보안 리스크 수준 | Low | Medium-High | **Low** (Gemini 수정 동의) |
|
|
| 폰트 라이선스 | 중간 리스크 | 중간 리스크 | **합의** |
|