AI 기반 패킷 이상 탐지로 스피드핵과 치트를 막는 서버 설계
멀티플레이 게임에서 이동 패킷의 시간·거리·입력 패턴을 서버 기준으로 검증하고 Isolation Forest 기반 이상 점수로 스피드핵을 탐지하는 실전 설계를 설명합니다.

핵심 요약
스피드핵은 클라이언트가 보낸 시간이나 위치를 신뢰할 때 발생한다. 해결의 중심은 서버 권위 이동 검증이며 AI 기반 이상 탐지는 검증을 우회하려는 비정상 패턴을 점수화해 추가 제재 근거를 제공한다.
즉시 차단은 이동 거리·속도·가속도 같은 결정적 규칙으로 처리하고 Isolation Forest 같은 비지도 학습 모델은 누적 행동을 분석해 검토 대상과 단계적 제재 대상을 찾는 데 사용한다.
스피드핵은 왜 발생하는가?
클라이언트는 신뢰할 수 없는 실행 환경이다. 메모리 변조, 타이머 조작, 패킷 재전송으로 이동 빈도나 이동량을 바꿀 수 있다. 서버가 클라이언트의 deltaTime, 좌표, 속도를 그대로 적용하면 공격자는 더 짧은 실제 시간에 더 많은 거리를 이동한다.
서버는 수신 시각과 마지막으로 승인한 상태를 기준으로 허용 이동량을 계산해야 한다.
여기서 p_last는 마지막 승인 위치, t_server는 서버 수신 시각, epsilon은 0 나눗셈을 피하는 최소 시간이다. v_observed가 버프와 지형 효과를 반영한 최대 속도를 넘으면 해당 이동을 승인하지 않는다.

AI 기반 패킷 이상 탐지는 어떻게 구현할까?
1. 서버에서 이동 패킷을 먼저 검증한다
AI 모델보다 앞에 결정적 검증을 둔다. 이 단계는 지연이나 모델 오류와 관계없이 즉시 동작하며 잘못된 좌표가 게임 상태에 반영되는 것을 막는다.
public static bool IsReachable(
Vector3 lastPosition,
Vector3 requestedPosition,
double elapsedSeconds,
float maxSpeed,
float toleranceMeters = 0.25f)
{
if (elapsedSeconds <= 0 || elapsedSeconds > 1.0)
return false;
var distance = Vector3.Distance(lastPosition, requestedPosition);
var allowedDistance = maxSpeed * elapsedSeconds + toleranceMeters;
return distance <= allowedDistance;
}
toleranceMeters는 패킷 지연, 부동소수점 오차, 서버 틱 간격을 흡수하기 위한 여유값이다. 값이 너무 크면 치트 허용 범위가 넓어지고 너무 작으면 정상 사용자를 되돌릴 수 있으므로 게임의 틱률과 이동 속도에 맞춰 측정해 결정한다.
2. 이동 이벤트에서 특징량을 만든다
모델에는 원본 패킷 전체보다 짧고 해석 가능한 특징량을 전달한다. 예를 들어 .NET 8 게임 서버에서 사용자별 최근 10~30초 이동 이벤트를 집계해 다음 값을 저장할 수 있다.
| 특징량 | 계산 방식 | 탐지하는 패턴 |
|---|---|---|
| 평균 속도 | 승인 이동 거리 / 서버 경과 시간 | 지속적인 속도 증가 |
| 최대 속도 | 윈도 내 최고 관측 속도 | 순간 이동, 텔레포트 |
| 속도 표준편차 | 윈도 내 속도의 표준편차 | 인위적으로 반복되는 이동 |
| 거절 패킷 비율 | 거절 수 / 전체 이동 요청 수 | 검증 우회 시도 |
| 시퀀스 역전 수 | 감소한 시퀀스 번호의 횟수 | 재전송, 패킷 조작 |
| 패킷 간격 분산 | 수신 간격의 분산 | 타이머 조작, 자동화 |
속도 표준편차는 다음처럼 계산한다.
특징량에는 맵 이동 제한, 탈것, 가속 버프, 넉백처럼 정상적인 예외를 반영한 컨텍스트도 함께 둔다. 예외 상태를 누락하면 모델은 정상 플레이를 이상으로 학습한다.
3. 이상 점수로 단계적 제재를 적용한다
Isolation Forest는 정상 데이터가 많은 환경에서 드문 패턴을 짧은 분리 경로로 찾는 비지도 학습 알고리즘이다. 처음에는 최근 정상 계정의 특징량으로 학습하고 의심 계정과 제재 확정 계정은 학습 데이터에서 제외한다.
flowchart LR
A[이동 패킷 수신] --> B{서버 이동 검증}
B -->|실패| C[이동 거절 및 위반 카운트]
B -->|통과| D[승인 상태 반영]
C --> E[특징량 집계]
D --> E
E --> F[Isolation Forest 이상 점수]
F --> G{점수와 위반 이력}
G -->|낮음| H[로그 보관]
G -->|중간| I[추가 관찰]
G -->|높음| J[제한 또는 검토]
점수 하나로 영구 정지하지 않는 편이 안전하다. 결정적 규칙 위반 횟수, 이상 점수, 계정 연령, 서버 로그를 함께 보고 다음처럼 처리한다.
- 규칙 위반 패킷은 즉시 거절하고 승인 위치를 유지한다.
- 이상 점수가 임계값을 넘으면 매치메이킹 제한이나 관찰 대상으로 전환한다.
- 반복 위반과 관리자 검토 기록이 함께 확인되면 시간 제한 또는 영구 제재를 적용한다.
패킷 이상 탐지 데이터는 어디에 저장해야 할까?
원본 패킷은 비용과 개인정보 측면에서 오래 보관할 이유가 적다. 운영에 필요한 필드만 남기고 원본은 짧은 보존 기간을 적용하는 방식이 실용적이다.
CREATE TABLE movement_anomaly_window (
player_id BIGINT NOT NULL,
window_started_at TIMESTAMP NOT NULL,
avg_speed REAL NOT NULL,
max_speed REAL NOT NULL,
rejected_ratio REAL NOT NULL,
sequence_regressions INTEGER NOT NULL,
anomaly_score REAL NULL,
PRIMARY KEY (player_id, window_started_at)
);
실시간 판정은 메모리 또는 스트림 처리 계층에서 수행하고 이 테이블에는 집계 결과와 제재 근거를 저장한다. 모델 재학습용 데이터는 제재 결과가 확정된 뒤 라벨을 덧붙여 별도 보관한다.

오탐을 줄이려면 무엇을 확인해야 하는가?
모바일 네트워크, 패킷 손실, 서버 틱 지연은 치트와 비슷한 흔적을 만들 수 있다. 따라서 모델 배포 전에는 지역, 플랫폼, 핑 구간, 캐릭터 이동 수단별로 정상 분포를 확인해야 한다.
| 상황 | 잘못된 판정 원인 | 대응 |
|---|---|---|
| 높은 핑 | 패킷이 몰려 도착함 | 서버 수신 시간 기준 윈도와 허용 오차 적용 |
| 서버 지연 | 틱 처리 간격이 일시적으로 증가함 | 서버 부하 지표를 특징량에 포함하거나 해당 구간 제외 |
| 이동 버프 | 최대 속도가 정상적으로 증가함 | 버프별 서버 측 최대 속도 테이블 사용 |
| 넉백·점프 패드 | 짧은 시간에 큰 변위 발생 | 게임 이벤트 ID를 함께 기록 |
모델 품질은 정확도 하나로 판단하기 어렵다. 실제 운영에서는 제재 검토에서 정상으로 판명된 비율, 탐지 후 재발률, 패킷 거절로 인한 고객 문의량을 함께 추적하는 것이 좋다.
자주 묻는 질문 (FAQ)
AI 모델만으로 스피드핵을 막을 수 있나?
아니다. 서버 권위 검증이 먼저다. AI는 알려지지 않은 우회 패턴을 찾아 검토와 추가 제한에 활용하는 보조 계층이다.
Isolation Forest는 언제 재학습해야 하나?
이동 시스템, 탈것, 버프 규칙이 바뀌었거나 정상 사용자 분포가 달라졌을 때 재학습한다. 학습 데이터에는 제재 확정 계정과 운영 이벤트 구간을 제외한다.
이상 점수의 임계값은 얼마로 시작해야 하나?
고정값을 일반화할 수 없다. 먼저 제재 없이 점수 분포와 검토 결과를 수집하고 허용 가능한 오탐률에 맞춰 운영 환경별 임계값을 정한다.
정리
AI 기반 패킷 이상 탐지는 치트 방지의 출발점이 아니라 두 번째 방어선이다. 서버가 이동 가능 여부를 먼저 확정하고 집계 특징량과 Isolation Forest 이상 점수로 반복적·우회성 패턴을 식별하면 스피드핵을 더 안전하게 대응할 수 있다.



