이전 글에서는 랭킹이 있는 스도쿠 게임에서 정답을 브라우저에 보내면 왜 문제가 되는지 이야기했습니다. 이번 글에서는 Sudoku nodi가 이 문제를 어떻게 해결했는지 조금 더 구체적으로 정리해보려 합니다.

핵심은 역할을 나누는 것입니다. 브라우저는 사용자가 편하게 플레이하도록 돕고, 서버는 기록을 믿을 수 있는지 판단합니다. 브라우저는 화면을 보여주고, 숫자 입력을 처리하고, 타이머를 표시합니다. 서버는 정답을 보관하고, 사용자가 제출한 풀이를 검증하고, 완료 시간과 점수를 계산합니다.
사용자가 오늘의 스도쿠를 열면 서버는 문제판만 보내줍니다. 여기에는 처음부터 채워져 있는 숫자와 빈칸 정보가 들어 있습니다. 하지만 완성된 정답판은 보내지 않습니다. 정답은 서버 안에 저장해둡니다.
그리고 사용자가 실제로 풀이를 시작하면 서버는 하나의 풀이 기록을 만듭니다. 이것을 쉽게 말하면 “이 사용자가 이 퍼즐을 지금부터 풀기 시작했다”는 기록입니다. 이 기록에는 시작 시간, 어떤 퍼즐인지, 힌트를 몇 번 썼는지, 나중에 완료했는지 같은 정보가 쌓입니다.
브라우저가 아무 일도 하지 않는 것은 아닙니다. 사용자가 같은 줄에 같은 숫자를 두 번 입력했거나, 같은 작은 박스 안에 중복된 숫자를 넣었다면 바로 알려줄 수 있습니다. 이런 검사는 정답을 몰라도 가능합니다. 스도쿠의 기본 규칙만 확인하면 되기 때문입니다.
하지만 “이 칸의 숫자가 정답과 다르다”는 판단은 브라우저가 하지 않습니다. 그 판단을 하려면 정답판이 필요하고, 정답판을 브라우저에 보내는 순간 처음의 목적이 무너집니다. 그래서 브라우저는 빠른 반응과 편한 조작을 담당하고, 정답 여부는 서버가 담당합니다.
힌트도 같은 방식으로 처리합니다. 사용자가 특정 칸의 힌트를 요청하면 서버는 전체 정답을 보내지 않고, 그 칸 하나의 값만 알려줍니다. 그리고 힌트를 사용했다는 사실도 서버에 기록합니다. 랭킹을 계산할 때 힌트를 많이 쓴 기록과 힌트를 쓰지 않은 기록을 똑같이 비교하면 공정하지 않기 때문입니다.
사용자가 퍼즐을 다 풀고 제출하면, 브라우저는 현재 입력된 판을 서버로 보냅니다. 서버는 자신이 보관하고 있던 정답판과 비교합니다. 맞으면 완료 처리하고, 시작 시간과 완료 시간을 기준으로 실제 풀이 시간을 계산합니다. 틀렸다면 정답을 알려주지 않고, 어떤 위치가 잘못되었는지만 알려줄 수 있습니다.
타이머도 마찬가지입니다. 화면에 보이는 타이머는 사용자가 시간을 느끼기 위한 표시입니다. 실제 랭킹에 쓰이는 시간은 서버가 기록한 시작 시간과 완료 시간을 기준으로 계산합니다. 그래야 새로고침을 하거나 화면의 값을 조작하더라도 기록이 쉽게 흔들리지 않습니다.
이 방식은 단순히 화면에서 정답을 비교하는 것보다 구현이 복잡합니다. 서버는 퍼즐, 정답, 풀이 기록, 힌트 사용, 완료 시간 등을 모두 관리해야 합니다. 하지만 대신 얻는 것이 있습니다. 기록을 더 믿을 수 있고, 랭킹을 더 공정하게 운영할 수 있습니다.
대부분의 스도쿠 게임은 정답을 서버에만 두는 이유는 단순한 보안 때문만은 아닙니다. 오늘의 스도쿠와 일일 랭킹이 제대로 의미를 가지려면, 사용자가 만든 기록을 믿을 수 있어야 합니다. 클라이언트는 즐거운 플레이를 만들고, 서버는 그 기록의 신뢰성을 지키는 것. 이 책임 분리가 서버 검증 기반 구조의 핵심입니다.
'개발 > 백엔드 설계' 카테고리의 다른 글
| 스도쿠 정답을 브라우저에 보내면 안 되는 이유 (0) | 2026.05.13 |
|---|