# 서버 연동 현황 분석 — 수상한 잡화점

> **작성일**: 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 추상화 레이어** (NerdNavisCore 누락 모듈) → PlayFab 의존 제거
8. **세이브/로드 구조화** — PlayerPrefs → 암호화 JSON 구조로 전환
9. **서버 재연산 범위 확대** — 덱 드래프트, 가챠 없음이지만 카드 획득 검증 필요

## 기획실 연관 (선행 인수인계 대조)

- Q-P1 (터치 방어 쿨다운) / Q-P2 (몬스터 배치 비율) — **클라 전적 권한**이므로 서버는 해당 데이터 검증 불가. 기획·개발 모두 **클라 코드가 SOT**.
- Q-P3 (보스 10002 클리어 가능성) — 클라 전투 SOT 확인 → `MobActor.cs` + `table_MonsterList.json` 실제 수치로 검증 가능
