개인5종 게임 · 방별 Durable Object · 모바일 WebSocket
Gamebang — 서버 권위형 실시간 게임 공방
개인 설계·구현·배포
2026-07-01 — present
모바일 클라이언트는 행동만 요청하고 방별 Durable Object가 phase·turn·숨은 정보·재접속을 판정하는 5종 실시간 미니게임 서비스
시스템 아키텍처
문제 해결 과정
1
클라이언트가 카드·턴·승패를 판정하면 조작과 참가자별 정보 누출 위험이 생김
해결 과정
방별 Durable Object가 상태 정본을 소유하고 phase·turn·행동을 검증한 뒤 참가자별 view를 투영
결과
클라이언트에는 자기 정보와 공개 상태만 전달
2
모바일 연결 끊김이 게임 상태 손실이나 방장 오판정으로 이어질 수 있음
해결 과정
연결과 player identity를 분리하고 재접속 여유·방 lifecycle·token 기반 복귀 경로를 서버에서 관리
결과
연결 복구 시 기존 서버 상태에서 허용 view를 재생성
합성 시나리오
실제 운영·개인 데이터 없이 코드의 상태 전이와 경계만 고정 fixture로 재현합니다.
프로젝트 설명
방 코드로 입장하는 모바일 웹과 Cloudflare Durable Object 기반 Room을 분리했습니다. Room은 게임별 순수 상태 머신에 행동을 전달하기 전에 phase·turn·권한을 검증하고, 각 참가자에게 허용된 player view만 투영합니다. 연결이 끊겨도 서버 상태를 정본으로 유지하고 유효한 reconnect token이 돌아오면 허용된 개인 view를 다시 제공합니다. 공개 포트폴리오에는 실제 방 코드·닉네임·전적과 비공개 저장소 내용을 포함하지 않습니다.
주요 내용
- 5종 게임을 공통 GameDef·상태 머신 계약으로 등록
- 방별 Durable Object가 phase·turn·host·행동 검증
- 참가자별 player view로 숨은 정보 분리
- CSP·보안 헤더·room lifecycle·재접속 경계를 테스트로 고정
기술 선택 근거
- ▶방 단위 상태 정본에 Durable Object를 사용하고 게임 규칙은 순수 상태 머신으로 분리
- ▶playerView projection을 서버에서 수행해 참가자별 숨은 정보 경계를 유지
깨달은 점
- •실시간 게임은 연결 상태와 게임 상태를 분리해야 재접속이 규칙 정본을 흔들지 않는다.
- •공통 엔진은 게임별 규칙을 추상화하되 숨은 정보 projection은 서버 경계에 남겨야 한다.
기술 스택
TypeScriptReactWebSocketCloudflare WorkersDurable ObjectsVitest