---
type: how-to
title: 챌린지 맞춤 설정하기
summary: 게임이냐 한 번 누르는 체크박스냐를 고르고, 언어와 테마를 고정하고, 게이트가 당신의 오리진에서 쓰는 쿠키 이름과 콜백 경로를 바꿉니다.
---

게이트가 보여 주는 검증 페이지는 사이트 키별로, 대시보드의 그 **프록시 게이트** 페이지에서 구성합니다. 다른 모든 설정과 마찬가지로 [관리 API](/docs/automation/management-api), MCP, Terraform으로도 구성합니다. 아래 모든 옵션의 기본값은 지금 이미 쓰고 있는 동작이므로, 손대지 않는 사이트 키는 예전 그대로 돌아갑니다.

## 게임이냐 체크박스냐 고르기

**챌린지 유형**이 방문자가 실제로 무엇을 하는지 정합니다:

| 유형 | 방문자가 하는 일 | 어울리는 때 |
|---|---|---|
| **게임 플레이** | 페이지 안에서 짧은 검증 게임을 합니다 | 봇에 대해 더 강한 신호. 기본값입니다. 방문자에게 몇 초가 듭니다. |
| **체크박스로 확인** | 작업 증명 검사가 도는 동안 한 번 누릅니다 | 더 빠르고 더 가볍고, 설치할 게임도 없습니다. 신호는 더 약합니다. |

두 가지 규칙이 선택을 묶습니다:

- **게임을 요구하는 사이트 키는 항상 게임을 보여 줍니다.** 사이트 키 자체의 **검증에 게임을 요구** 설정이 켜져 있거나, 팀이 모든 키에 게임을 요구하면, 체크박스 선택지는 쓸 수 없고 대시보드가 어느 설정이 그것을 고정하는지 알려 줍니다. API로 설정하면 `409 gate-forces-game-mode`를 돌려줍니다.
- **게임을 고르려면 설치된 게임이 필요합니다.** 사이트 키에는 재생 가능한 아티팩트를 가진 설치된 게임이 자기 것이든 팀에서 물려받은 것이든 최소 하나 필요합니다. 하나도 없을 때 `409 no-games`를 돌려주는 것은 게임 유형을 고르는 쪽입니다. 게이트를 켜는 것만으로는 돌려주지 않습니다. 게임을 요구하지 않는 사이트 키는 체크박스로 물러나므로, 게임을 정리하는 동안에도 게이트는 계속 동작합니다.

<Callout type="info">
마지막으로 설치된 게임이 나중에 제거되면, 게임을 요구하는 사이트 키는 조용히 다른 것으로 물러나는 대신 검증 제공을 멈춥니다. 게임을 요구하는 키에서는 체크박스가 검증이 될 수 없기 때문입니다. 게임을 요구하지 *않는* 키는 체크박스로 물러나, 사이트가 계속 닿을 수 있게 합니다.
</Callout>

이 마지막 경우는 알아채는 법을 알아 둘 값어치가 있습니다. 게이트가 걸린 사이트를 멈춰 세우기 때문입니다: 게이트는 다시 게임을 쓸 수 있을 때까지 모든 방문자에게 "확인을 이용할 수 없음" 페이지로 답합니다. 아무도 설정을 건드리지 않았는데 찾아올 수도 있는데, 게임은 고정된 버전이 저희 결정론 검사를 통과해야 비로소 셈에 들어가기 때문입니다. 프록시 게이트 페이지는 사이트 키가 그 상태에 놓일 때마다 경고하고, 게임 목록과 게임을 요구하고 있는 설정 양쪽으로 링크를 겁니다. 그러니 게임을 하나 설치하거나, 요구를 풀고 체크박스가 넘겨받게 하면 됩니다.

## 언어나 테마 고정하기

**언어**와 **테마** 둘 다 기본값은 *방문자에 맞춤*이고, 거의 언제나 그게 원하는 바입니다:

- **언어**는 방문자 자신의 브라우저 언어를 따릅니다. 위젯이 지원하는 것과 같은 열한 개 언어입니다.
- **테마**는 방문자 시스템의 밝음이나 어두움 선호를 따르고, 그에 맞춰 바뀝니다.

대신 고정하는 것은, 게이트를 건 사이트가 한 언어뿐일 때, 또는 한 테마로 밀고 가고 있어서 검증이 방문자의 기기를 따르기보다 그 테마에 맞기를 바랄 때입니다.

어느 쪽이든 검증 페이지는 **이 사이트 키의 브랜드**를 두릅니다. 위젯이 쓰는 것과 같은 브랜드 이름, 로고, 색, 링크를 같은 사이트 키에서 풀어냅니다. 그것은 위젯의 외관 설정에서 한 번만 구성하면 게이트가 가져다 씁니다. 맞춤 브랜드 프리셋은 위젯과 마찬가지로 Apex 플랜이 필요합니다. 언어와 테마 옵션 자체는 게이트를 쓸 수 있는 모든 플랜에서 됩니다.

검증 페이지 자체의 문구는 맞춤 설정할 수 없습니다.

## 쿠키 이름과 콜백 경로 바꾸기

기본값이 앱과 부딪칠 때만 이것들을 바꾸세요.

**쿠키 이름**(기본값 `cpt_gate`)은 프록시가 패스로부터 설정하는 퍼스트파티 쿠키입니다. 앱이 이미 그 이름을 쓰고 있거나, 한 도메인에서 게이트 걸린 앱을 여럿 돌리면서 각각 따로 통과시키고 싶다면 이름을 바꾸세요.

<Callout type="warn">
**직접 지은 이름에서 또 다른 직접 지은 이름으로 바꾸면, 사이트 키의 프록시 게이트 페이지에서 리버스 프록시 스니펫을 다시 복사하고 프록시를 리로드할 때까지 게이트를 건 사이트가 멎습니다.** 게이트는 새 이름을 찾는데 프록시는 여전히 옛 이름을 쓰므로, 방문자는 검증으로 보내지고, 검증을 통과하고, 곧바로 다시 검증으로 되돌려집니다. 속도 제한에 걸릴 때까지 도는 고리입니다. 기본값 `cpt_gate`에서 벗어나는 변경은 먼저 바꾸고 나중에 배선해도 안전합니다. 게이트가 기본값도 계속 알아보기 때문입니다.
</Callout>

**콜백으로 POST되는 필드는 쿠키를 무엇이라 이름 붙이든 항상 `cpt_gate`입니다.** 그러니 콜백의 본문 파싱은 결코 바뀌지 않습니다. 바뀌는 것은 `Set-Cookie`에 쓰는 이름뿐입니다. 게이트의 응답에는 콜백에 어느 이름을 쓸지 알려 주는 `cookie_name` 필드가 들어 있습니다.

**콜백 경로**(기본값 `/__cpt/callback`)는 패스를 받아 쿠키를 설정하는, 당신 자신의 오리진 위 라우트입니다. 앱의 라우터가 이미 그 경로를 차지하고 있다면 옮기세요. 오리진 위의 평범한 경로여야 합니다. 스킴도, 호스트도, 쿼리 문자열도, 프래그먼트도 없이.

## 게이트를 일부 경로로 좁히기

**이 경로만 게이트 적용**와 **이 경로는 절대 게이트 적용 안 함**는 한 줄에 패턴 하나씩 받아, 생성되는 리버스 프록시 구성을 빚습니다. 둘 다 비워 두면 모든 경로에 게이트가 걸립니다.

이들은 권고입니다. 바뀌는 것은 당신이 복사하는 스니펫이고, 강제하는 것은 당신의 프록시입니다. 인가자 서브요청과 당신의 콜백 경로는 항상 게이트 없이 두세요. 생성되는 구성은 이미 그렇게 해 둡니다.

전형적인 로그인 포털이라면:

```
이 경로만 게이트 적용:
/
/api/firstfactor

이 경로는 절대 게이트 적용 안 함:
/api/verify
/healthz
```

## 함께 보기

- [프록시 페이지 게이트 설정하기](/docs/proxy-page-gate/set-up): nginx 안내.
- [리버스 프록시 레시피](/docs/proxy-page-gate/reverse-proxy-recipes): 콜백 계약과 다른 프록시들.
- [개요](/docs/proxy-page-gate/overview): 개념과 통과 쿠키.
