게임 개발자를 위한 보안 기초
암호화 기초
섹션 제목: “암호화 기초”대칭 키 암호화 (AES)
섹션 제목: “대칭 키 암호화 (AES)”같은 키로 암호화/복호화합니다. 속도가 빠르고 대용량 데이터에 적합합니다.
평문 + 키 → AES-256-GCM → 암호문 + 인증 태그암호문 + 키 + 인증 태그 → AES-256-GCM → 평문게임에서 사용: 세이브 파일 암호화, 패킷 페이로드 암호화
비대칭 키 암호화 (RSA/ECC)
섹션 제목: “비대칭 키 암호화 (RSA/ECC)”공개키로 암호화, 개인키로 복호화합니다. 키 교환, 서명에 사용됩니다.
클라이언트 → 서버 공개키로 세션 키 암호화 → 서버서버 → 개인키로 세션 키 복호화이후 → 세션 키(AES)로 통신해시 함수
섹션 제목: “해시 함수”단방향 변환. 무결성 검증, 패스워드 저장에 사용됩니다.
SHA-256("password") → 고정 길이 해시bcrypt/Argon2id → 패스워드 해싱 (salt + 반복 적용)인증과 세션 관리
섹션 제목: “인증과 세션 관리”JWT (JSON Web Token)
섹션 제목: “JWT (JSON Web Token)”Header.Payload.SignatureeyJhbGciOiJIUzI1NiJ9.eyJ1c2VySWQiOiIxMjMifQ.서명// 서버: JWT 검증bool VerifyJWT(const FString& Token, const FString& SecretKey) { // 헤더.페이로드 부분의 서명을 SecretKey로 검증 // 만료 시간(exp) 확인 // claims 검증 return bValid;}세션 토큰 보안
섹션 제목: “세션 토큰 보안”- 최소 128비트 랜덤 토큰 (CSPRNG 사용)- HTTPS 전용 (TLS 1.3)- HttpOnly + Secure 쿠키 플래그- 짧은 만료 시간 + 리프레시 토큰 분리게임 치팅 방지
섹션 제목: “게임 치팅 방지”서버 권위(Server Authority)
섹션 제목: “서버 권위(Server Authority)”❌ 클라이언트가 결정: "나 100 데미지 줘"✅ 서버가 검증: "클라이언트 위치/범위 확인 → 데미지 계산"
// 서버에서 검증bool AMyGameMode::ValidateAttack(APlayerController* Attacker, ACharacter* Target, float ClaimedDamage) { float Distance = FVector::Distance( Attacker->GetPawn()->GetActorLocation(), Target->GetActorLocation());
// 무기 사거리 초과 → 거부 if (Distance > MaxWeaponRange * 1.1f) return false;
// 서버에서 실제 데미지 계산 ApplyServerDamage(Target, CalculateDamage(Attacker)); return true;}메모리 보호
섹션 제목: “메모리 보호”// 중요 값 XOR 인코딩 (메모리 스캔 방지)class ProtectedInt { int encoded_; int key_;public: ProtectedInt(int v) : key_(rand()), encoded_(v ^ key_) {} int Get() const { return encoded_ ^ key_; } void Set(int v) { encoded_ = v ^ key_; }};
ProtectedInt health(100);// 메모리에는 XOR된 값이 저장됨스피드핵 탐지
섹션 제목: “스피드핵 탐지”// 서버에서 이동 속도 검증void AMyGameMode::ValidateMovement(APlayerController* PC, FVector NewPos) { FVector OldPos = PC->GetPawn()->GetActorLocation(); float Delta = GetWorld()->DeltaTimeSeconds; float MaxDist = MaxMoveSpeed * Delta * 1.2f; // 20% 여유
if (FVector::Distance(OldPos, NewPos) > MaxDist) { // 텔레포트/스피드핵 탐지 PC->GetPawn()->SetActorLocation(OldPos); // 롤백 ReportCheatAttempt(PC, "SpeedHack"); }}네트워크 취약점
섹션 제목: “네트워크 취약점”SQL 인젝션 방지
섹션 제목: “SQL 인젝션 방지”// 위험: 문자열 직접 연결FString Query = FString::Printf(TEXT("SELECT * FROM users WHERE name='%s'"), *UserInput);
// 안전: Prepared Statementauto Stmt = DB->Prepare("SELECT * FROM users WHERE name=?");Stmt->BindText(1, UserInput);패킷 조작 방지
섹션 제목: “패킷 조작 방지”- 모든 패킷에 HMAC 서명 추가- 시퀀스 번호로 재전송 공격 방지- 서버에서 모든 게임 상태 검증HTTPS / TLS
섹션 제목: “HTTPS / TLS”게임 서버 배포 시 TLS 필수:- REST API: HTTPS (TLS 1.3)- WebSocket: WSS- UDP 게임 패킷: DTLS 또는 QUIC- 중요 게임 로직은 서버가 최종 결정 (클라이언트 신뢰 금지)
- 패스워드는 bcrypt/Argon2id, 세션 토큰은 CSPRNG
- 이동/공격 등 모든 플레이어 액션을 서버에서 범위/속도 검증
- 메모리 중요값 XOR 인코딩으로 치트 엔진 방지
- SQL/네트워크 입력은 항상 파라미터화/검증