Server RPC 검증과 치팅 방지 기초
15강. Server RPC 검증과 치팅 방지 기초
1. 이번 강의에서 해결할 문제
Ownership을 가진 정상 클라이언트도 수정되거나 오작동할 수 있습니다. 클라이언트가 초당 수백 번 발사하거나 NaN 방향, 비정상 Sequence를 보내면 서버 큐와 게임 규칙이 무너집니다. RPC 도착 자체를 권한 승인으로 해석하면 안 됩니다.
2. 학습 목표
3. 핵심 개념
검증은 여러 층입니다.
- 형식: 유한한 수, 범위, Enum, Sequence가 기본 계약을 만족하는가.
- 소유·신원: 요청 Actor가 호출 연결의 소유인가.
- 게임 상태: 살아 있는가, 경기 중인가, 쿨다운·탄약이 충분한가.
- 공간: 서버 위치·시야·거리로 가능한가.
- 빈도: 서버 시간 기준 허용 요청 수를 넘지 않는가.
WithValidation의 _Validate가 false를 반환하면 연결에 강한 제재가 적용될 수 있으므로 단순 게임 규칙 실패와 악성 프로토콜 위반을 구분합니다. “쿨다운 중” 같은 정상 거절은 _Implementation에서 무시하거나 Client RPC로 안내하고, NaN·허용 범위 밖 Protocol 값은 Validation 대상으로 둡니다.
4. 단계별 실습
UFUNCTION(Server, Unreliable, WithValidation)
void Server_RequestFire(
FVector_NetQuantizeNormal AimDirection,
uint16 ClientSequence);
private:
double LastAcceptedFireTime = -DBL_MAX;
uint16 LastAcceptedSequence = 0;
float FireInterval = 0.2f;
bool ACaptureArenaCharacter::Server_RequestFire_Validate(
FVector_NetQuantizeNormal AimDirection,
uint16 ClientSequence)
{
return !AimDirection.ContainsNaN()
&& AimDirection.IsNormalized()
&& ClientSequence != 0;
}
void ACaptureArenaCharacter::Server_RequestFire_Implementation(
FVector_NetQuantizeNormal AimDirection,
uint16 ClientSequence)
{
const UWorld* World = GetWorld();
if (!World || !IsAlive() || !IsMatchPlaying()) return;
const double Now = World->GetTimeSeconds();
if (Now - LastAcceptedFireTime < FireInterval) return;
const uint16 Delta = static_cast<uint16>(ClientSequence - LastAcceptedSequence);
if (Delta == 0 || Delta > 1024) return;
if (!HasAmmoForShot()) return;
LastAcceptedFireTime = Now;
LastAcceptedSequence = ClientSequence;
ConsumeAmmoOnServer();
PerformServerFire(AimDirection);
}
Sequence wrap-around, 재접속과 Pawn 교체 정책을 명시해야 합니다. 예제의 단순 비교는 학습용이며 실제 제품에서는 입력 버퍼와 연결 세션 수명에 맞춘 검증을 설계합니다. 로그에는 원본 플랫폼 식별자 대신 서버가 부여한 짧은 테스트 Connection ID와 거부 이유 코드를 사용합니다.
5. 코드가 동작하는 이유
Validation은 직렬화된 요청의 최소 계약을 빠르게 검사합니다. Implementation은 서버가 보유한 경기 단계, 생존, 탄약, 서버 시간으로 합법적인 행동인지 판정합니다. 클라이언트 시계나 “마지막 발사 시각”을 믿지 않으므로 시간 변조와 빠른 반복 요청이 결과를 만들지 못합니다.
6. 자주 하는 실수와 해결법
7. 직접 실습
8. 이해 점검 질문 3개
9. 핵심 요약
Server RPC 검증과 치팅 방지 기초 미니 퀴즈
선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.
학습을 마쳤나요?
직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.