ONE QUESTION AT A TIME.

천천히 생각하고, 분명하게.

TODAY’S QUESTION903 / 1500
게임 서버난이도 중하5분 답변 목표 · 보강본

지연된 공격 입력을 서버가 과거 위치로 되감아 판정할 때 어떤 시간·충돌·공정성 한계가 생기나요?

잠깐, 답변을 보기 전에
먼저 내 말로 설명해 볼까요?

답변과 점검 포인트 펼치기답변 접기
01

구두 답변

정의를 외우기보다, 원리와 조건을 연결해 설명해 보세요.

지연된 공격을 서버가 현재 위치만 보고 판정하면, 공격자 화면에서는 조준점에 있던 대상이 서버에서는 이미 이동해 빗나갈 수 있습니다. 그래서 서버가 보관한 위치·상태 이력에서 입력이 발생했다고 인정할 수 있는 과거 시점을 찾아 판정하는 방식을 사용할 수 있습니다. 다만 클라이언트가 보낸 timestamp를 그대로 믿으면 임의의 과거 위치를 선택해 맞히게 할 수 있으므로, 서버 시계와 입력 수신 시각·RTT 추정, 허용 rewind 상한, 오래된 입력 거절 또는 가장 오래된 허용 시각으로의 절단이 필요합니다. 이 기법을 지연 보정 되감기(lag-compensation rewind)라고 부릅니다.

어느 상태를 되감을 것인가

틱별 위치를 저장할지 보간 위치를 저장할지 먼저 정합니다. 틱 상태를 사용하면 재현성이 좋고 보간은 화면 움직임과 맞을 수 있지만, 보간값이 당시 서버가 확정한 사실과 같다는 뜻은 아닙니다. hitscan 공격은 공격자·대상의 hitbox 이력을 짧게 조회할 수 있지만, 투사체 공격은 발사부터 이동한 투사체와 장애물도 시간에 맞게 고려해야 합니다. 캐릭터만 과거로 되감고 현재의 문·벽을 사용하면 당시에는 문 뒤였던 대상이 맞는 모순이 생길 수 있습니다. 모든 월드를 실제로 현재 상태에서 과거 상태로 덮어쓰지 말고 읽기 전용 snapshot/history에서 필요한 충돌 형상을 조회하겠습니다. 과거 판정의 기준 시각을 정할 때 서버가 관측한 입력 수신 시각에서 추정 지연을 빼되, 추정값의 오차와 지터를 감안한 상한을 둡니다. 클라이언트 시계가 서버보다 빠르거나 느려도 서버가 허용한 범위를 벗어난 timestamp는 보정하지 않습니다. 입력 번호·세션·발사 시각의 일관성, 한 초당 공격 수, 반복적으로 과거 상한에 붙는 패턴을 감사 로그로 남깁니다. 시간 보정은 신뢰 경계를 넓히는 기능이 아니라 지연으로 인한 판정 불일치를 제한적으로 줄이는 기능입니다.

공정성과 자원 비용

공격자에게 과거 위치를 맞춰 줄수록 공격자는 반응성이 좋아지지만, 피격자는 이미 엄폐했는데 맞았다고 느낄 수 있습니다. 따라서 최대 rewind, 공격 종류별 적용 범위, 엄폐·벽의 시간 일관성, 고지연 사용자의 보정 상한을 게임 정책으로 정해야 합니다. 과거 이력은 플레이어 수·보관 틱·hitbox 크기에 비례해 메모리를 쓰고, 요청마다 넓은 월드를 재구성하면 CPU가 폭발할 수 있으므로 관심 대상과 시간 범위를 제한합니다. 테스트는 RTT와 지터, 마감 경계, 패킷 지연·재전송, 움직이는 장애물, 즉시 명중·투사체, 과거 상한 초과, 양쪽 체감 결과를 포함합니다. 서버 현재 상태가 부수적으로 변경되지 않고 같은 입력 로그가 같은 판정을 재현하는지 확인하겠습니다. 좋은 rewind는 모든 화면을 맞추는 것이 아니라 시간 일관성과 공정성 사이의 명시적 경계(temporal fairness boundary)를 지키는 것입니다.

되감기 이력은 모든 프레임의 전체 월드를 복사하지 않고 캐릭터의 틱별 위치·방향과 상태 전환 시점을 저장한 뒤 필요한 두 샘플 사이를 보간할 수 있습니다. 하지만 보간이 벽을 관통할 수 있으므로 해당 시점의 충돌 규칙을 적용해야 합니다. 기록이 없는 시점은 임의로 보정하지 말고 상한 초과와 같은 정책으로 거절하거나 보수적으로 처리하겠습니다. 공정성은 지연 평균만으로 정할 수 없습니다. RTT 분포, 지터, 엄폐 직후 피격 비율, rewind 상한에 걸린 공격 비율을 보고 정책을 조정합니다. 판정에 사용한 기준 시각과 상태 버전을 감사 로그에 남기되, 클라이언트 입력 필드와 서버 내부 기록을 분리하겠습니다. 되감기 판정은 공격자의 입력을 받아 과거를 바꾸는 것이 아니라, 과거 상태의 읽기 전용 후보를 현재 서버의 확정 이벤트와 비교하는 과정이어야 합니다. 판정이 끝난 뒤 현재 체력·탄약·보상은 현재 권위 틱에서 한 번만 갱신하고, 과거 snapshot의 값을 다시 저장하지 않겠습니다.

외부 이벤트에는 발사 입력 ID와 판정 snapshot ID를 넣어 중복 재처리를 막겠습니다.

02

득점 포인트

이해가 드러나는 지점을 확인해 보세요.

  • 현재 판정과 과거 이력 판정의 목적·시간 신뢰 범위를 설명한다.
  • 캐릭터·장애물·투사체의 시간 일관성과 읽기 전용 이력을 구분한다.
  • rewind 상한·공정성·메모리·CPU 비용을 하나의 정책으로 연결한다.
03

감점 포인트

놓치기 쉬운 조건과 오해를 짚어 보세요.

  • 클라이언트 timestamp를 무제한 신뢰한다.
  • 공격자 화면과 일치하면 항상 공정하다고 말한다.
  • 과거 판정을 위해 현재 월드를 실제로 덮어쓴다.
04

더 파고들 거리

하나 더 질문하며 이해의 범위를 넓혀 보세요.

득점·감점 포인트는 학습용 자기 점검 기준이며, 특정 회사의 실제 채점표가 아닙니다.

원리부터 공부하고 싶다면

답변을 보충하는 개념·예제·슈도코드를 읽어 보세요.

← 전체 질문 보기