5.3 KiB
5.3 KiB
서버 연동 현황 분석 — 수상한 잡화점
작성일: 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)
- Key:
- 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) 전 필수
- IAP 서버 검증 재구현 — PlayFab ValidateXXXReceipt API 사용, 블로커 해제
- 전투 결과 서버 재연산 — 최소한 스테이지 클리어 판정·보상 지급은 서버 검증
- AES 키 분리 — 런타임 유도(디바이스ID 해시 혼합) + 서버 전송 페이로드에 HMAC 서명
🟠 P1 — 소프트 론칭 직후
- ACTk 적용 확대 — 모든 재화·레벨·카드 보유 수량
Obscured*전환 - SpeedHackDetector / TimeCheckDetector 활성화
- Firebase Crashlytics 재활성화 —
google-services.json주입, 크래시 수집 시작
🟡 P2 — 정식 출시 전
- INetworkService 추상화 레이어 (BurningTimesCore 누락 모듈) → PlayFab 의존 제거
- 세이브/로드 구조화 — PlayerPrefs → 암호화 JSON 구조로 전환
- 서버 재연산 범위 확대 — 덱 드래프트, 가챠 없음이지만 카드 획득 검증 필요
기획실 연관 (선행 인수인계 대조)
- Q-P1 (터치 방어 쿨다운) / Q-P2 (몬스터 배치 비율) — 클라 전적 권한이므로 서버는 해당 데이터 검증 불가. 기획·개발 모두 클라 코드가 SOT.
- Q-P3 (보스 10002 클리어 가능성) — 클라 전투 SOT 확인 →
MobActor.cs+table_MonsterList.json실제 수치로 검증 가능