공정성은 어떻게 지키나
온라인 대결에서 가장 흔한 의심은 두 가지입니다. 상대가 뭔가 볼 수 있는 게 아닐까, 그리고 판정이 정말 맞는 걸까. 둘 다 설계로 답해야 하는 문제입니다.
브라우저는 절대 믿지 않는다
온라인 게임에서 승패를 유저의 웹 브라우저가 직접 계산하면, 그 결과는 언제든 해킹이나 조작에 노출됩니다. F12 개발자 도구를 열어 점수 변수를 바꾸거나, 조작된 승리 패킷을 서버로 쏴버리면 그만이니까요. 그래서 딴판은 승패와 관련된 모든 판단 권한을 100% 서버 엔진에만 맡깁니다.
내 차례, 남은 제한 시간, 점수 집계, 승패 판정, 젤리 정산까지 모든 것이 서버의 중앙 방 상태를 기준으로 흘러갑니다. 브라우저가 하는 역할은 서버가 보내준 안전한 게임판 데이터를 화면에 매끄럽게 그리고, 유저의 클릭이나 터치 입력을 서버로 전달하는 것뿐이에요. 화면상의 DOM 요소를 아무리 변조해도 서버의 진짜 판정은 절대 흔들리지 않습니다.
세부 규칙 검증도 마찬가지입니다. 오목의 금수 표시는 편의를 위해 화면에서도 계산해 ×표를 띄워주지만, 실제 돌을 놓는 요청이 들어오면 서버가 RIF 정통 알고리즘으로 한 번 더 철저하게 재검증합니다. 트리플 코드의 합 판정이나 단어 퀴즈 정답 여부도 모두 서버가 최종 도장을 찍죠. 화면의 그래픽은 편의일 뿐, 진짜 심판은 오직 서버입니다.
버튼을 마구 연타해도 꼬이지 않는 설계
이동 중인 지하철이나 엘리베이터처럼 통신이 불안정한 곳에서는 같은 클릭 요청이 서버에 두세 번 연속으로 들어갈 수 있습니다. 이때 점수가 두 번 오르거나 참가비 젤리가 중복으로 차감되면 억울하겠죠.
그래서 딴판의 모든 조작에는 고유한 요청 식별자(UUID)가 붙습니다. 서버는 이미 한 번 처리한 식별값을 정확히 기억하고 있다가, 똑같은 요청이 다시 밀려오면 새 판정 없이 직전 결과를 그대로 돌려줍니다(멱등성 보장). “반응이 느려서 버튼을 여러 번 눌렀다”고 해서 게임 데이터가 꼬이거나 손해를 보는 일은 없습니다.
방이 비정상적으로 터지거나 시작 전에 게임이 취소되는 경우도 마찬가지입니다. 서버가 방의 소멸을 확인하는 순간 걸어두었던 참가 젤리를 즉시 100% 자동 환급하며, 이 역시 중복 환급이나 누락 없이 단 한 번만 정확하게 처리됩니다.
보이면 안 되는 비밀 패는 아예 안 보낸다
심리전이나 추리 게임을 개발할 때 흔히 저지르는 초보적인 실수가 있습니다. 서버가 정답이나 상대방 카드를 미리 브라우저로 쏴놓고 CSS로 가려두는 방식이죠. 그렇게 만들면 개발자 도구의 네트워크 탭이나 메모리만 뜯어봐도 상대방의 숨은 패가 적나라하게 드러납니다.
딴판은 정식 공개 타이밍이 오기 전까지는 브라우저로 데이터 자체를 일절 전송하지 않습니다. 게임별 비밀 보호 방식은 철저합니다.
흑백 심리전은 선공이 낸 타일의 ‘색깔(흑/백)’만 전송합니다. 진짜 숫자는 라운드가 끝난 뒤에도 상대방 화면에 알려주지 않고, 서버가 두 숫자의 크기만 비교해 “승/패” 결과만 내려줍니다. 덕분에 게임 끝까지 상대의 남은 패를 수학적으로 소거해 나가는 순수한 두뇌 싸움이 유지됩니다. (흑백 심리전 규칙 보기)
이면승부는 정반대로 ‘상대방의 카드’만 보내줍니다. 정작 내 이마에 붙은 내 카드 숫자는 라운드가 완전히 끝나 쇼다운될 때까지 내 브라우저 메모리 어디에도 존재하지 않아요. (이면승부 규칙 보기)
낱말 게임(십자격돌·자모 암호) 역시 정답 단어와 사전 키를 오직 서버 내부 메모리에만 격리해 둡니다. 판을 미리 뜯어보거나 외부 사전 API 키를 탈취해 정답을 커닝하는 뒷구멍은 완전히 봉쇄되어 있습니다.
출발선은 똑같이, 운의 개입은 공평하게
랜덤 요소가 있는 게임에서는 “누구에게 유리한 운이 쏠렸는가”가 승부의 만족도를 좌우합니다. 2048 레이스가 대표적인 예입니다.
대결이 시작될 때 첫 두 개의 타일 숫자와 생성 위치는 참가자 전원에게 100% 완벽하게 똑같이 주어집니다. 모두가 동일한 판에서 출발하는 것이죠. 하지만 그 이후에 생겨나는 타일까지 똑같은 랜덤 흐름을 쓰면 문제가 생깁니다. 실시간으로 상대방 미니 보드가 보이기 때문에, 한 수 늦게 두는 사람이 앞서가는 사람의 판을 보고 “아, 다음엔 저 자리에 2가 뜨겠구나” 하고 미래를 예측해 버릴 수 있으니까요.
그래서 딴판은 각 유저의 고유 세션 ID를 난수 시트에 소금(Salt)처럼 섞어 서로 완전히 독립된 랜덤 흐름을 타게 만들었습니다. 출발선은 똑같지만 플레이 도중에는 남의 화면으로 내 다음 타일을 훔쳐볼 수 없도록 설계한 것이죠. (2048 레이스 규칙 보기)
오목의 선공 유리함도 마찬가지입니다. 먼저 두는 흑에게 렌주룰 금수(쌍삼·사사·장목 불가)를 엄격히 적용해 유리함을 깎아내고, 리턴 매치 시 흑백을 자동으로 맞바꿔 한 사람만 계속 선공을 쥐는 불공정을 막습니다.
연습 봇은 사람이 보는 것만 본다
혼자 연습 모드를 할 때 컴퓨터 봇이 정답을 미리 알고 치팅을 한다면 그건 좋은 연습 상대가 될 수 없습니다. 사람을 상대로는 안 먹힐 꼼수만 늘어나니까요.
자모 암호의 연습 상대인 젤롱봇은 유저들이 화면에서 확인한 공개 단서(초록·노랑·회색 판정)만을 똑같이 입력값으로 받아 다음 단어를 추론합니다. 정답 단어를 몰래 훔쳐보지 않으며, 사람이 볼 수 있는 정보만을 가지고 수학적 확률 공식에 따라 승부합니다. 덕분에 봇을 상대로 익힌 실전 감각이 진짜 사람과의 대결에서도 100% 그대로 통합니다.
2048 레이스의 1인 모드는 가짜 봇을 옆에 세워두지 않고, 내 순수 점수와 최고 타일, 최소 이동 수 기록만을 측정하는 정직한 개인 타임어택으로 구성했습니다. 있지도 않은 가짜 AI를 이겼다는 착시 대신, 진짜 내 실력의 성장을 확인하실 수 있습니다.
돈이 개입되지 않는 청정한 플레이 환경
이면승부의 베팅을 비롯해 모든 게임에 젤리가 쓰이지만, 딴판의 가장 확고한 철칙은 “젤리는 결코 현금이 될 수 없다”는 점입니다.
젤리는 유료 구매가 불가능하고, 현금이나 상품권으로 환전할 수도 없으며, 계정 간 이동도 막혀 있습니다. 오직 무료 지급과 승패에 따른 이동, 소멸만 존재하므로 현실의 사행성이나 금전적 피해가 원천적으로 발생하지 않습니다. 외부에서 젤리를 현금 거래하자는 시도는 100% 사기이니 주의해 주세요.
광고 정책 역시 투명합니다. 일반 배너 광고를 클릭한다고 해서 젤리를 더 주지 않으며, 게임을 시작하기 위해 광고를 강제로 시청하게 만들지도 않습니다. 유저 여러분의 순수한 몰입과 공정한 승부만을 지향합니다.
판정이나 결과가 의심스러울 땐
모든 것을 서버가 관장한다는 것은, 반대로 모든 판의 상세 로그가 투명하게 남아있다는 뜻이기도 합니다.
혹시라도 판정이나 점수 계산이 이상하다고 느껴지셨다면 방 코드와 플레이 시간대를 적어 문의하기로 알려주세요. 서버의 상태 머신 기록을 대조해 당시 어떤 판정이 내려졌는지 투명하게 확인해 드립니다.
설명서와 실제 판정 로직이 어긋난다면 문서든 코드든 저희가 고쳐야 할 버그입니다. 소중한 제보를 보내주시면 꼼꼼히 확인해 즉시 수정하겠습니다.