- CLAUDE.md: Claude-Gemini 교차 토론 프로토콜 추가 - CLAUDE.md: 존재하지 않는 디렉토리 3개 제거 - analysis/fix-plan: 4 Phase 수정 계획 (Claude-Gemini 합의) - .claude/agents/: dev 리뷰 에이전트 9개 복사 - .claude/skills/: 프로젝트 스킬 4개 복사
7.5 KiB
7.5 KiB
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_resolvers2.5.4 -- 공식 중단 선언build_runner_core9.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] 즉시 조치
-
폰트 라이선스 파일 추가
assets/fonts/JetBrainsMono-LICENSE.txt(Apache 2.0)assets/fonts/PressStart2P-OFL.txt(OFL 1.1)- 앱 내 오픈소스 라이선스 화면에 표시 필요
- Google Fonts 및 JetBrains 공식 사이트에서 다운로드
-
google_mobile_ads 7.x 업데이트 계획 수립
- iOS Privacy Manifest 대응 필수 (App Store 심사 거절 리스크)
- v7.0.0 마이그레이션 가이드: https://developers.google.com/admob/flutter/migration
[HIGH] 단기 조치 (1-2주)
-
cupertino_icons 제거
# pubspec.yaml에서 삭제 # cupertino_icons: ^1.0.8 -
build_runner 체인 업데이트
flutter pub upgrade build_runner json_serializable- 중단된
build_resolvers,build_runner_core전이 의존성 해소 - 빌드 성능 개선 기대
- 중단된
-
freezed 2.x -> 3.x 마이그레이션
- freezed_annotation + freezed 동시에 메이저 업데이트
- 코드 생성 파일 전체 재생성 필요:
dart run build_runner build --delete-conflicting-outputs
[MEDIUM] 중기 조치 (1개월)
-
just_audio 0.10.x 업데이트
- Android 최신 버전 호환성 개선
- 단일 메인테이너(ryanheise) 패키지이므로 대안(audioplayers) 검토도 병행
-
package_info_plus 9.x 업데이트
-
flutter_lints 6.x 업데이트
- 최신 lint 규칙 적용으로 코드 품질 향상
[LOW] 장기 고려
- 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 수정 동의) |
| 폰트 라이선스 | 중간 리스크 | 중간 리스크 | 합의 |