쿠소월드 — 캐릭터 하나를 20번 다르게 보여주는 웹 미니게임 놀이터 2026.07.27

쿠소월드를 띄웠다 — 도메인부터 검색엔진 등록까지

기획만 있던 사이트를 실제로 배포했다. 만든 것보다 만들다 발견한 것이 더 남는다 — 계정이 두 개씩 생기던 버그, 0점으로 받던 보너스, 트래픽이 오는 순간 꺼지는 레이트리밋.

기획만 있던 쿠소월드를 실제로 띄웠다. 도메인을 사고, 배포하고, 로그인과 포인트 경제를 붙이고, 검색엔진에 등록하는 데까지 왔다. 주소는 kusoworld.net이다.

만든 것보다 만들다가 발견한 것이 더 기억에 남는다.

도메인과 인프라

kusoworld.com은 이미 남이 갖고 있어서 .net으로 갔다. Cloudflare Registrar에서 연 11.86달러. 도매가라 마크업이 없고 WHOIS 프라이버시가 무료다.

인프라는 전부 Cloudflare 무료 티어다. Workers(사이트+API), D1(데이터), R2(게임 번들), KV(캐시). 게임을 R2에 올리므로 신작을 추가할 때 사이트를 다시 배포하지 않아도 된다. 이게 이 프로젝트의 유일한 구조적 요구사항이었다.

어뷰징 방어 — 실측으로 드러난 구멍

포인트에 가치가 붙으면 반드시 뚫으려는 사람이 생긴다. 그래서 방어를 먼저 짰는데, 직접 공격해보니 생각과 달랐다.

가장 큰 구멍은 점수 위조가 아니라 계정 발급이었다. 익명 계정 생성에 제한이 없어 계정을 무한히 찍어낼 수 있었다. 계정 하나당 출석과 플레이 보상이 그대로 복제되니, 점수를 아무리 잘 지켜도 소용이 없다.

그리고 웹게임에서 "게임이 점수에 서명한다"는 설계는 보안이 아니라 연출이다. 클라이언트에 넣은 키는 개발자도구 한 번이면 읽힌다. 그래서 서명키를 서버 밖으로 내보내지 않고, 서버가 발급한 세션 정보의 무결성을 지키는 데만 썼다. 진짜 방어선은 따로 있다 — "사람이 그 시간 안에 낼 수 있는 점수인가" 를 서버가 판정하는 것.

무료 티어의 함정

레이트리밋을 KV로 만들었는데, 문서를 확인하다 알았다. 무료 KV는 쓰기가 하루 1,000회다. 요청마다 카운터를 1회 쓰니 방문자 100명 근처에서 한도를 넘긴다.

문제는 넘는 방식이었다. 한도를 넘으면 쓰기만 실패하고 사이트는 멀쩡히 돈다. 카운터가 얼어붙어 제한이 조용히 풀린다. 트래픽이 오는 바로 그 순간에 방어가 사라지는 구조였다. Cache API로 옮겼다.

로그인은 "잃지 않게" 하는 것

구글 로그인을 붙였다. 이메일은 받지 않는다. 요청하는 권한은 계정 식별용 하나뿐이고, 저장하는 것도 구글 계정 고유 ID뿐이다. 게임 사이트에서 이메일로 할 일이 없는데 받으면 보관·파기 의무만 생긴다.

로그인이 해결하는 건 포인트 "관리"가 아니다. 포인트는 로그인 없이도 서버가 관리한다. 로그인은 브라우저 데이터를 지워도 남게 하고 다른 기기에서 이어하게 한다. 그래서 버튼 문구도 "로그인"이 아니라 "구글로 저장"이다.

포인트가 쓰이고 동시에 벌리게

처음엔 플레이하면 포인트를 주기만 했다. 그러면 숫자가 쌓이기만 하고 의미가 없어진다. 반대로 받기만 하면 처음 온 사람이 한 판도 못 한다.

지금은 한 판 들어갈 때 진입 포인트를 내고, 성과에 비례해 돌려받는다. 핵심은 초보도 본전은 된다는 것. 못한다고 막히는 게 아니라 잘하면 더 오래 놀 수 있는 쪽으로 기울였다.

진입비는 게임 인기 순위에서 나온다. 많이 플레이된 게임이 비싸고 신작이 싸다. 순위가 화면 장식이 아니라 실제로 값을 정하게 만들고, 아무도 안 하던 게임을 눌러볼 이유를 만드는 설계다.

테스트가 잡아준 것들

혼자 만들면 놓치는 걸 테스트가 잡았다.

  • 계정이 한 번 로드에 2개씩 생기고 있었다. 스크립트 두 곳이 동시에 계정 발급을 시작해 각자 만들었다. 실제 사용자 수가 2배로 부풀어 있었다
  • 0점으로도 "최고기록 갱신" 보너스를 받았다. 첫 판은 이전 기록이 없어 0점이 갱신으로 잡힌다. 즉사만 해도 보너스였다
  • 게임이 모니터 주사율에 묶여 있었다. 144Hz 사용자가 60Hz 사용자보다 2.4배 빨리 점수를 얻었다. 같은 랭킹에 올릴 수 없는 상태였다

검색엔진에는 이제야

robots.txt와 사이트맵을 만들고 구조화 데이터를 넣었다. 사이트맵은 정적 파일로 두지 않고 데이터베이스에서 생성한다 — 게임을 추가할 때 사이트맵을 손으로 고쳐야 하면 반드시 빠뜨리기 때문이다.

다만 정직하게 말하면, 지금 사이트맵의 주소는 일곱 개다. 게임 하나와 글 셋. 기술적 SEO는 찾아온 크롤러가 제대로 읽게 하는 일이지, 없는 콘텐츠를 만들어주지 않는다.

다음

게임이 하나뿐이라 인기 랭킹도 진입비 차등도 화면에 나타나지 않는다. 코드로만 존재하는 상태다. 게임 2호가 다음이다.

쿠소월드 — 캐릭터 하나를 20번 다르게 보여주는 웹 미니게임 놀이터 프로젝트로