완료일
September 2, 2023
태그
비즈니스
작성자
경쟁은 언제 의미를 가질까?
당신이 시험을 본다고 해보자.
누군가 답지를 볼 수 있다면, 점수를 조작할 수 있다면 결과를 인정할 수 있는가?
공평하지 않은 환경에서 경쟁한 결과는 인정하기 힘들다. 객관성을 잃었기 때문이다.
경쟁은 모두에게 동일한 환경이 주어질 때 비로소 의미를 가진다.
그래서 스낵게임은 점수의 객관성과 설득력을 확보하기 위해 ‘게임 검증 시스템’을 운영하고자 한다.
조작을 막으려면?
게임 특성 상 클라이언트에서 처리하는 내용이 많다.
따라서 클라이언트 조작이나 HTTP Request 조작으로 얼마든지 점수를 조작할 수 있다.
클라이언트 자체를 해킹하는 것은 막을 수 없더라도, 최소한 이런 일은 방지해야 한다.
하지만 웹 게임인 만큼, 별도의 보안 솔루션을 사용할 수는 없고, 덩치에도 맞지 않다.
따라서 게임을 서버-사이드로 돌리는 편이 이런 종류의 조작을 원천 방지할 수 있다.
하지만 서버-사이드로 게임을 하려면, 서버의 동시 처리 능력이 많이 요구된다.
비영리 목적의 게임을 실시간 서버까지 두고 돌리기엔 무리가 있다.
여러 방법을 고민해봤는데, 다음과 같은 방법으로 성능과 정확성을 최대한 챙길 수 있다.
해결 방안
전제
- 게임의 검증이 플레이와 실시간으로 이뤄져야 할 필요는 없다.
- 쌓인 기록들을 기반으로 게임을 마친 후에도 검증할 수 있기 때문이다.
Flow
- 게임판을 서버가 제공한다. (세션은 바로 시작된다)
- 마감 시간이 되면, 클라이언트는 서버에 마감 요청을 보내며 게임을 종료한다.
- 유저가 놓은 수를 서버에 전송한다. (마지막에)
- Q. 실시간 HTTP 요청 전송은 도착 순서를 보장할 수 있을까?
- 서버는 세션 마감 후 세션을 검증하며, 문제없다면 랭킹에 등록한다.
- 세션 마감은 시작으로부터 120초 + 1초(전송 시간 고려)로 한다.
- 게임을 직접 시뮬레이션하여 검증한다.
A. 보장할 수 없다. TCP의 전송 지연과 손실에 의한 재전송 때문이다.
따라서 클라이언트가 충분한 간격으로 모아서 보내는 것이 순서 오류 가능성을 낮춘다.