replay-verification

1 개의 포스트

WOOWACON 2025 미니게임 WOOWA POP! | 우아한형제들 기술블로그 (새 탭에서 열림)

우아콘 2025에서 선보인 '우아팝(WOOWA POP!)'은 단순한 이벤트를 넘어 기술적 무결성을 증명하기 위한 도전의 결과물입니다. 대규모 인원이 참여하는 랭킹 시스템에서 발생할 수 있는 조작 가능성을 차단하기 위해, 단순히 보안 솔루션을 덧붙이는 대신 게임의 동작 원리 자체를 보안 메커니즘으로 활용했습니다. 서버에서 클라이언트의 플레이 과정을 결정론적으로 재현하여 검증함으로써, 기술 콘퍼런스에 걸맞은 투명하고 공정한 게임 환경을 구축했습니다. ### 게임 보안과 수학적 증명 * 폰 노이만의 게임 이론에 따르면 모든 게임은 수학적 구조로 환원될 수 있으며, 해커는 이를 역공학하여 최적해(조작)를 찾아내는 존재입니다. * 기존의 보안 방식이나 CAPTCHA는 게임의 재미를 반감시키거나 AI 기술의 발전으로 인해 점차 무력화되는 한계가 있었습니다. * 수박 게임과 같은 물리 기반 퍼즐 게임은 수학적으로 NP-난해(NP-hard) 문제에 속하며, 답을 찾기는 어렵지만 주어진 답이 맞는지 확인하는 것은 쉽다는 특성을 가집니다. * 이를 이용해 사용자가 보낸 최종 점수를 그대로 믿는 것이 아니라, 점수에 도달하기까지의 '과정'을 증명서처럼 제출받아 서버에서 검증하는 방식을 채택했습니다. ### 결정론적 물리 엔진의 구현 * 서버가 클라이언트의 플레이를 정확히 재현하기 위해서는 동일한 입력에 대해 항상 동일한 결과가 나오는 '결정론(Determinism)'이 보장되어야 합니다. * 웹 환경의 `Math.sin`이나 `Math.cos` 같은 함수는 브라우저나 OS 엔진에 따라 미세한 오차가 발생할 수 있어, 이를 대체할 결정론적 수학 라이브러리를 사용했습니다. * 물리 엔진인 Matter.js를 활용하여 물체의 생성 위치, 시간(프레임), 충돌 계산 등을 정수 기반 혹은 오차 없는 계산 방식으로 통일했습니다. * 클라이언트는 사용자의 조작 로그(아이템 투하 위치, 타이밍 등)를 기록하여 서버로 전송하고, 서버는 Node.js 환경에서 이 로그를 그대로 시뮬레이션하여 최종 점수의 일치 여부를 판단합니다. ### 14,570점의 등장과 검증의 실효성 * 행사 기간 중 약 2,000명의 사용자가 참여했으며, 서버 로그를 통해 모든 플레이 과정이 실시간으로 검증되었습니다. * 운영 도중 물리적으로 도달하기 어려운 14,570점이라는 비정상적인 점수가 전송되었으나, 서버의 재현 시뮬레이션 결과 클라이언트가 보낸 점수와 일치하지 않음을 감지하여 자동으로 랭킹에서 제외했습니다. * 이는 별도의 복잡한 보안 툴 없이도 게임 엔진의 결정론적 특성만으로 완벽한 부정행위 방지가 가능함을 입증한 사례입니다. 단순히 점수 데이터를 주고받는 방식에서 벗어나, 실행 과정을 서버에서 재현할 수 있도록 설계하는 것은 게임뿐만 아니라 높은 신뢰성이 필요한 다양한 웹 시스템에 응용될 수 있습니다. 특히 결정론적 설계를 통해 클라이언트와 서버의 상태를 동기화하는 기법은 복잡한 비즈니스 로직의 무결성을 확보하는 데 매우 강력한 도구가 됩니다.