# 서버 연동 현황 분석 — 수상한 잡화점 > **작성일**: 2026-04-14 > **조사 범위**: PlayFab, Firebase, IAP, ACTk, 클라이언트-서버 권한 분배 > **목적**: C11(개발자 관점) 보안·안정성 점검 > > ⚠️ **Critical 3건 보류 중 (2026-04-14 PD님 지시)** > 서버 파트가 정비되기 전이므로 아래 "Critical 보안 이슈" 3건은 **일시 보류**. > 서버팀 정식 가동 후 **반드시 재기동하여 해결**해야 하는 블로커급 이슈임을 명시. > 메모리: `project_shop_security_pending.md` --- ## 요약 | 항목 | 상태 | |------|------| | **주 백엔드** | PlayFab (`Assets/Script/Server/ServerInfo.cs` 허브) | | **Firebase** | 초기화 코드만, `google-services.json` 부재 → **비활성** | | **전투 연산 권한** | 🔴 **100% 클라이언트** | | **AES 키 하드코딩** | 🔴 **소스에 평문 존재** | | **IAP 영수증 검증** | 🔴 **주석처리되어 미구현** | | **ACTk 적용 범위** | 🟡 필드 약 10개만 `Obscured*` | | **SpeedHack/TimeCheck Detector** | ❌ 미사용 | | **C11 보안 판정** | 🔴 **중대 보완 필요** | ## 백엔드 구성 ### PlayFab - **허브**: `Assets/Script/Server/ServerInfo.cs` (싱글톤, `DontDestroyOnLoad`) - **주요 기능**: - 로그인 (디바이스 ID 기반) - `LoginResult`, `ServerData`, `ServerTime` 관리 - **12시간마다 자동 재로그인** (세션 유지) - `ServerClass.cs`의 `FC_*` / `SC_*` 구조로 요청·응답 래핑 - **SOT 역할**: 플레이어 계정, 프로그레션 저장, 메일, 재시작 데이터 ### Firebase - 초기화 코드 파편만 존재 - `google-services.json` 없음 → Analytics / Crashlytics 모두 **미동작** - Package manifest에 Firebase 선언 없음 ## 🔴 Critical 보안 이슈 ### 1. 전투 데미지 연산이 100% 클라이언트 - `Actor.cs`, `PCActor.cs`, `MobActor.cs`에서 HP/Shield/Buff 전부 클라 계산 - 서버는 **결과만 받음** → 클라 변조 시 서버 검증 불가 - **영향**: 랭킹·이벤트 보상 악용 가능, 출시 전 서버 재연산 구조 필수 ### 2. AES 암호화 키 하드코딩 - `Assets/Script/My/CryptoUtil.cs` (추정)에 평문 키 존재 - Key: `7gT9KfL2xQ1bN4pV6sH8jD3zW0cR5mYq` (32byte) - IV: `aB3dE6gH9jK2mP5Q` (16byte) - IL2CPP 빌드도 메모리 덤프로 추출 가능 → 사실상 무의미 - **영향**: 데이터 변조 방어선 상실 ### 3. IAP 영수증 검증 미구현 - 영수증 서버 검증 코드가 **전부 주석처리** - 클라이언트만 IAP 성공 판단 후 재화 지급 → **결제 우회 가능** - **영향**: 매출 직접 손실, 오픈 블로커급 ## 🟡 보안 보완 현황 ### ACTk (AntiCheatToolkit) - 적용 범위: `ObscuredInt` / `ObscuredLong` 필드 약 10개 - 미사용 기능: - `SpeedHackDetector` (시간가속 탐지) - `TimeCheckDetector` (디바이스 시간조작 탐지) - `WallHackDetector` 등 - **개선 방향**: 전투 스탯·재화·레벨 전면 `Obscured*` 적용, Detector 활성화 ### 서버 권한 vs 클라이언트 권한 분배 | 영역 | 권한 | 위험도 | |------|------|--------| | 로그인/세션 | 서버 (PlayFab) | ✅ | | 재화·아이템 저장 | 서버 | ✅ | | 전투 결과 계산 | 🔴 클라이언트 | Critical | | 스테이지 보상 지급 | 🔴 클라이언트 기반 | Critical | | IAP 영수증 검증 | 🔴 미구현 | Critical | | 랭킹 점수 | 🔴 클라 제출 | High | | 시간 동기화 | 서버 시간 수신 | ✅ | ## C11 판정 | 기준 | 상태 | |------|------| | **자원 효율성** | 12시간 재로그인, PlayFab 배치 호출 등 적절 🟡 | | **코드 구조 직관성** | `ServerInfo` 단일 허브로 집중됨 ✅ | | **코드 범용성** | PlayFab 직접 의존 → 추상화 없음 🔴 (→ `04_코어_범용성_분석_v1.md` 누락 모듈과 동일, 신규 코어 `06_신규코어_설계안_v1.md`에서 해소 예정) | | **보안 건전성** | 위 3대 Critical 이슈 🔴 | ## 개발실 조치 제안 (우선순위) ### 🔴 P0 — 소프트 론칭(2026-06~07) 전 필수 1. **IAP 서버 검증 재구현** — PlayFab ValidateXXXReceipt API 사용, 블로커 해제 2. **전투 결과 서버 재연산** — 최소한 스테이지 클리어 판정·보상 지급은 서버 검증 3. **AES 키 분리** — 런타임 유도(디바이스ID 해시 혼합) + 서버 전송 페이로드에 HMAC 서명 ### 🟠 P1 — 소프트 론칭 직후 4. **ACTk 적용 확대** — 모든 재화·레벨·카드 보유 수량 `Obscured*` 전환 5. **SpeedHackDetector / TimeCheckDetector 활성화** 6. **Firebase Crashlytics 재활성화** — `google-services.json` 주입, 크래시 수집 시작 ### 🟡 P2 — 정식 출시 전 7. **INetworkService 추상화 레이어** (BurningTimesCore 누락 모듈) → PlayFab 의존 제거 8. **세이브/로드 구조화** — PlayerPrefs → 암호화 JSON 구조로 전환 9. **서버 재연산 범위 확대** — 덱 드래프트, 가챠 없음이지만 카드 획득 검증 필요 ## 기획실 연관 (선행 인수인계 대조) - Q-P1 (터치 방어 쿨다운) / Q-P2 (몬스터 배치 비율) — **클라 전적 권한**이므로 서버는 해당 데이터 검증 불가. 기획·개발 모두 **클라 코드가 SOT**. - Q-P3 (보스 10002 클리어 가능성) — 클라 전투 SOT 확인 → `MobActor.cs` + `table_MonsterList.json` 실제 수치로 검증 가능