---
type: explanation
title: 게이밍 안티치트
summary: 게임이 어떻게 챌린지 이상인지. 모든 라운드를 서버에서 세우고, 브라우저에서 샌드박스로 돌리고, 결정론적 리플레이로 다시 검증하는 계층화된 안티치트 시스템.
---

방문자가 몇 초 동안 하는 게임은 당신이 보는 부분입니다. 그 아래에는 게임을 사람의 증거로 만드는 안티치트 시스템이 있습니다. Caputchin은 경쟁 멀티플레이어 게임이 치터를 상대로 쓰는 작전을 빌립니다: 서버가 모든 라운드에 대해 권위를 갖고, 게임이 잠긴 샌드박스에서 돌고, 결과가 플레이어의 입력을 리플레이해 다시 도출됩니다. 게임은 할 수 있지, 위조할 수 없습니다.

이것은 [proof of work](/docs/understanding-caputchin/proof-of-work)와 [계측](/docs/understanding-caputchin/instrumentation)과 쌓인 세 번째 검증 게이트입니다. 그것은 [보안](/docs/site-keys/security) 페이지에서 키별로 구성됩니다.

## 수명 주기

라운드는 세 단계를 거칩니다: 플레이 전에 서버에서 세워지고, 플레이 동안 브라우저에서 샌드박스로 돌고, 플레이 후에 서버에서 다시 검증됩니다.

```mermaid
sequenceDiagram
    participant V as 방문자 브라우저
    participant S as Caputchin 서버
    participant G as 샌드박스된 게임 iframe
    participant R as 리플레이 아이솔레이트
    V->>S: 챌린지 요청
    S->>V: 서명된 일회용 티켓 (서버가 게임과 시드를 고름)
    V->>G: 격리된 iframe에 게임 마운트
    Note over G: 네트워크 없음, 당신의 페이지로 닿음 없음
    G->>V: 플레이어의 입력을 트레이스로 기록
    V->>S: 티켓과 트레이스 제출
    S->>R: 같은 시드로 트레이스 다시 실행
    Note over R: 봉인됨, 네트워크 없음, 시간 한정
    R->>S: 판정과 점수
    S->>V: 리플레이가 플레이를 확인할 때만, 서명된 토큰
```

## 라운드 전: 서버 권위 설정

라운드가 *무엇*인지 정하는 모든 것은 브라우저가 아니라 서버에서 일어납니다. 이것이 멀티플레이어 안티치트의 "클라이언트를 결코 신뢰하지 마라" 원칙입니다: 클라이언트는 의도를 보내고, 서버가 현실을 정합니다.

- **서명된 일회용 티켓**이 라운드를 발급합니다. 그것은 수명이 짧고 한 번만 쓸 수 있습니다. 붙잡힌 티켓은 두 번째 통과로 리플레이될 수 없습니다.
- **게임과 그 무작위 시드는 서버 측에서 골라져** 티켓에 실립니다. 브라우저는 더 쉬운 게임이나 더 친절한 시드를 고를 수 없는데, 그것이 그 선택을 결코 하지 않기 때문입니다.
- **매번 자격 있는 풀에서 다른 게임.** 풀이기는 어떤 게임을 마주할지 결코 모르니, 단일 정적 표적에 미리 훈련할 수 없습니다. 운영자는 회전을 좁힐 수 있지만, 서버는 늘 허용된 묶음에서 고릅니다. 풀 자체는 색인 시점 적합성 확인을 통과한 게임만 담습니다. [마켓플레이스 게임 빌드하기](/docs/marketplace-game-development/build-a-marketplace-game)를 보세요.

## 라운드 동안: 샌드박스된 게임

게임은 방문자의 브라우저에서 돌지만, 방문자의 사이트와 라운드의 무결성을 둘 다 보호하는 경계 안에서 돕니다.

`<caputchin-game>`은 각 게임을 동일 오리진 접근이 없는 격리된 iframe에 마운트하니, 게임은 불투명 오리진을 갖고 호스트 페이지의 쿠키, 스토리지, DOM, 또는 동일 오리진 네트워크에 닿을 수 없습니다. 그 인라인 content-security-policy는 스크립트를 정확히 게임의 번들로 고정하고 아웃바운드 네트워크 호출을 차단하며, 번들은 돌기 전에 알려진 해시를 상대로 확인됩니다(불일치는 닫힌 채 실패). 호스트 페이지 자체의 보안 정책은 그대로입니다. 정확한 샌드박스와 정책 모양은 [Caputchin이 게임을 샌드박싱하는 방법](/docs/understanding-caputchin/game-sandboxing)에 문서화되어 있습니다.

요점: 게임은 기본으로 신뢰되지 않고 갇혀 있습니다. 그것은 무엇도 빼낼 수 없고, 자기가 임베드된 페이지를 조작할 수 없습니다.

## 라운드 후: 결정론적 리플레이

방문자가 끝내면, 브라우저는 기록된 입력 트레이스를 제출합니다. 서버는 결과에 대해 브라우저의 말을 받아들이지 않습니다. 그것은 트레이스를 다시 실행합니다.

- **라운드는 서버에서 다시 시뮬레이션됩니다**, 같은 서버 도출 시드로, 네트워크 접근이 없고 단단한 시간 예산을 둔 봉인된 아이솔레이트에서. 이것은 전략 게임에서 결정론적 록스텝이 기대는 같은 속성입니다: 동일한 시드에 동일한 입력이 동일한 플레이를 재현합니다. 게임을 진짜로 풀지 않은 트레이스는 통과 결과를 재현하지 않습니다.
- **통과 또는 실패는 그 리플레이에서 취해지지**, 결코 브라우저가 보고한 숫자에서가 아닙니다. 클라이언트는 벌지 않은 점수를 주장할 수 없습니다.
- **서명된 토큰은 리플레이가 플레이를 확인할 때만 발급됩니다.** 그 토큰은 당신의 백엔드가 나중에 검증 시점에 그것을 확인할 때 그 자체로 일회용입니다.

## Caputchin이 하지 않는 것

대부분의 게임과 대화형 CAPTCHA는 행동 신호에 기댑니다: 마우스 경로 엔트로피, 탭 타이밍, 봇 대 사람을 추측하는 분류기에 먹이는 기기 텔레메트리. Caputchin은 일부러 그렇게 하지 않습니다. 그것은 플레이어의 어떤 행동 프로필도 수집하지 않습니다. 입력이 *어떻게* 만들어졌는지 추측하는 대신, 그것이 실제로 게임을 푸는지를 *근본 원리에서* 다시 도출합니다. 이것은 프라이버시 자세이자 보안 자세입니다: 속일 행동 모델이 없고, 재현할 물리만 있습니다.

## 정직한 한계

**게이트는 게임만큼만 강합니다.** 안티치트 기계는 라운드가 위조가 아니라 진짜로 플레이됐음을 증명하지만, 쉬운 게임을 어렵게 만들 수는 없습니다. 사소한 게임(정적 판, DOM에서 읽히는 승리 수, "통과하려면 빨간 점을 클릭")은 스크립트가 풀기 싸고, 결정론적 리플레이는 그 스크립트 입력이 이긴다고 충실히 확인할 텐데, 실제로 이기기 때문입니다. 봇에 대한 저항은 게임 자체가 프로그램으로 풀기 어렵다는 데서 옵니다: 빠르고, 감각적이고, 찰나의 반응, DOM에 앉은 해답 없음. 안티치트 계층은 플레이가 진짜였음을 보장하고; 게임의 설계가 진짜 플레이가 자동화하기 어려웠는지를 정합니다. 그것을 염두에 두고 게임을 고르고 빌드하세요, [마켓플레이스 게임 빌드하기](/docs/marketplace-game-development/build-a-marketplace-game)를 보세요.

통과 또는 실패는 각 게임 자체의 로직이 정합니다; 서버는 그 로직을 충실히 다시 실행하지만, 주어진 게임이 무엇을 승리로 여기는지를 재단하지 않습니다. 게이밍 안티치트는 [proof of work](/docs/understanding-caputchin/proof-of-work), [계측](/docs/understanding-caputchin/instrumentation), 그리고 키의 나머지 [보안 설정](/docs/site-keys/security)과 조합될 때 가장 강합니다.
