콘텐츠로 이동

게임 개발자를 위한 보안 기초

같은 키로 암호화/복호화합니다. 속도가 빠르고 대용량 데이터에 적합합니다.

평문 + 키 → AES-256-GCM → 암호문 + 인증 태그
암호문 + 키 + 인증 태그 → AES-256-GCM → 평문

게임에서 사용: 세이브 파일 암호화, 패킷 페이로드 암호화

공개키로 암호화, 개인키로 복호화합니다. 키 교환, 서명에 사용됩니다.

클라이언트 → 서버 공개키로 세션 키 암호화 → 서버
서버 → 개인키로 세션 키 복호화
이후 → 세션 키(AES)로 통신

단방향 변환. 무결성 검증, 패스워드 저장에 사용됩니다.

SHA-256("password") → 고정 길이 해시
bcrypt/Argon2id → 패스워드 해싱 (salt + 반복 적용)
Header.Payload.Signature
eyJhbGciOiJIUzI1NiJ9.eyJ1c2VySWQiOiIxMjMifQ.서명
// 서버: JWT 검증
bool VerifyJWT(const FString& Token, const FString& SecretKey) {
// 헤더.페이로드 부분의 서명을 SecretKey로 검증
// 만료 시간(exp) 확인
// claims 검증
return bValid;
}
- 최소 128비트 랜덤 토큰 (CSPRNG 사용)
- HTTPS 전용 (TLS 1.3)
- HttpOnly + Secure 쿠키 플래그
- 짧은 만료 시간 + 리프레시 토큰 분리
❌ 클라이언트가 결정: "나 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");
}
}
// 위험: 문자열 직접 연결
FString Query = FString::Printf(TEXT("SELECT * FROM users WHERE name='%s'"), *UserInput);
// 안전: Prepared Statement
auto Stmt = DB->Prepare("SELECT * FROM users WHERE name=?");
Stmt->BindText(1, UserInput);
- 모든 패킷에 HMAC 서명 추가
- 시퀀스 번호로 재전송 공격 방지
- 서버에서 모든 게임 상태 검증
게임 서버 배포 시 TLS 필수:
- REST API: HTTPS (TLS 1.3)
- WebSocket: WSS
- UDP 게임 패킷: DTLS 또는 QUIC
  • 중요 게임 로직은 서버가 최종 결정 (클라이언트 신뢰 금지)
  • 패스워드는 bcrypt/Argon2id, 세션 토큰은 CSPRNG
  • 이동/공격 등 모든 플레이어 액션을 서버에서 범위/속도 검증
  • 메모리 중요값 XOR 인코딩으로 치트 엔진 방지
  • SQL/네트워크 입력은 항상 파라미터화/검증