# Cloudflare Turnstile

> YesCaptcha로 Cloudflare Turnstile 토큰을 받아요. TurnstileTaskProxyless, TurnstileTaskProxylessM1, 자체 프록시를 쓰는 TurnstileTask의 파라미터, 예제, 반환 결과와 Cloudflare 챌린지 페이지와의 차이를 설명해요.

Source: https://docs.yescaptcha.com/ko/tasks/turnstile/ · Last verified: 2026-10-21

> This page was machine-translated from the Chinese version. If anything differs, the Chinese version prevails: https://docs.yescaptcha.com/zh/tasks/turnstile/

Cloudflare Turnstile 작업은 토큰(`token`)을 반환해요. 이 토큰을 대상 웹사이트에 제출하면 인증을 통과할 수 있어요. `TurnstileTaskProxyless`는 작업당 25 포인트 (≈ $3.75 / 1k)이고, 비동기로 결과를 반환해요. 먼저 `createTask`를 호출한 뒤 5초마다 `getTaskResult`를 폴링하세요. 인식에 실패하거나 시간이 초과되면 포인트가 자동으로 환불돼요.

- POST `https://api.yescaptcha.com/createTask` (글로벌 엔드포인트)
- POST `https://cn.yescaptcha.com/createTask` (중국 엔드포인트)

요청 본문은 JSON이고, `clientKey`로 인증해요. 작업을 생성한 엔드포인트와 같은 엔드포인트에서 결과를 조회하세요.

## 사용 시기

웹페이지의 폼 안에 Cloudflare 인증 위젯(“사람인지 확인”)이 포함되어 있고, 페이지가 `challenges.cloudflare.com/turnstile` 스크립트를 로드하는 경우예요.

페이지 전체가 Cloudflare에 가로막혀 “잠시만 기다리십시오…”, “브라우저를 확인하는 중”이 표시된다면 Turnstile이 아니라 Cloudflare 챌린지 페이지예요. 이 경우에는 [Cloudflare 챌린지 페이지](https://docs.yescaptcha.com/ko/tasks/cloudflare-challenge.md)를 사용하세요. 구분 방법은 [캡차 유형 판별](https://docs.yescaptcha.com/ko/guides/identify-captcha.md)에서 확인할 수 있어요.

## 작업 유형과 가격

| 작업 유형 | 가격 | 반환 방식 | 설명 |
| --- | --- | --- | --- |
| `TurnstileTaskProxyless` | $3.75 / 1k; 25 포인트/작업 · ¥25 / 1k | 비동기 |  |
| `TurnstileTaskProxylessM1` | $4.50 / 1k; 30 포인트/작업 · ¥30 / 1k | 비동기 |  |
| `TurnstileTask` | $3.75 / 1k; 25 포인트/작업 · ¥25 / 1k | 비동기 | 자체 프록시 |

미국 달러 가격은 US$1 ≈ ¥6.67 기준의 추정치이며, 작업은 포인트로 차감돼요.

-   `TurnstileTaskProxyless`와 `TurnstileTaskProxylessM1`은 파라미터가 같고 경로만 달라서 서로 대체용으로 쓸 수 있어요.
-   `TurnstileTask`는 직접 준비한 프록시로 캡차를 로드해요. 프록시 필드를 함께 전달해야 해요.

## 요청 파라미터

| 필드 | 유형 | 필수 | 설명 |
| --- | --- | --- | --- |
| `type` | string | 예 | 작업 유형이에요. 이 페이지의 "작업 유형 및 가격"을 참고하세요 |
| `websiteURL` | string | 예 | 캡차가 표시되는 페이지의 전체 URL이에요. 캡차 제공업체의 도메인이 아니라 캡차가 보이는 사이트를 입력하세요 |
| `websiteKey` | string | 예 | Turnstile 사이트 키(sitekey)예요. 보통 0x로 시작해요 |
| `pageAction` | string | 아니요 | 페이지가 Turnstile에 전달하는 `action`이에요(`turnstile.render`의 옵션 또는 위젯 요소의 `data-action`). 예: `login`. 대부분의 경우 필요하지 않아요. 작업이 계속 실패할 때만 추가하세요 |
| `data` | string | 아니요 | 페이지가 Turnstile에 전달하는 `cData`예요(`turnstile.render`의 옵션 또는 위젯 요소의 `data-cdata`). 예: `c0bd4b36-7419-4e18-83c6-378699f2a9a2`. 대부분의 경우 필요하지 않아요. 작업이 계속 실패할 때만 추가하세요 |
| `proxyType` | string | 일부 유형 | 프록시 프로토콜이에요: `http`, `https`, `socks4`, `socks5` (TurnstileTask에서 필수) |
| `proxyAddress` | string | 일부 유형 | 프록시 IP 주소 또는 호스트 이름이에요. 127.0.0.1이나 192.168.x.x 같은 로컬 또는 사설 주소는 저희 서버가 접근할 수 없어서 사용할 수 없어요 (TurnstileTask에서 필수) |
| `proxyPort` | integer | 일부 유형 | 프록시 포트 (TurnstileTask에서 필수) |
| `proxyLogin` | string | 아니요 | 프록시 사용자 이름(프록시에 인증이 필요한 경우) (TurnstileTask 전용) |
| `proxyPassword` | string | 아니요 | 프록시 비밀번호(프록시에 인증이 필요한 경우) (TurnstileTask 전용) |
| `userAgent` | string | 아니요 | 브라우저 User-Agent예요. 결과에 `userAgent`가 있으면 토큰을 제출할 때 그 값을 사용하세요 (TurnstileTask 전용) |

`websiteKey`는 보통 `0x`로 시작해요. 찾는 방법은 [Turnstile 파라미터 찾기](https://docs.yescaptcha.com/ko/guides/find-turnstile-parameters.md)를 참고하세요.

### 통과하지 못할 때: pageAction과 data

대부분은 `websiteURL`과 `websiteKey`만 전달하면 충분하고, 이 두 파라미터는 필요하지 않아요. `websiteURL`과 `websiteKey`가 모두 맞는데도 작업이 통과하지 못한다면, 웹페이지가 Turnstile을 호출할 때 `action`과 `cData`를 전달하는지 확인하세요. `turnstile.render`의 파라미터이거나 인증 위젯 요소의 `data-action`, `data-cdata`예요. 있다면 그대로 함께 전달하세요.

-   `pageAction`: 웹페이지의 `action` 값이에요. 예: `login`
-   `data`: 웹페이지의 `cData` 값이에요. 예: `c0bd4b36-7419-4e18-83c6-378699f2a9a2`

POST https://api.yescaptcha.com/createTask

```json
{
  "clientKey": "YOUR_CLIENT_KEY",
  "task": {
    "type": "TurnstileTaskProxyless",
    "websiteURL": "https://example.com/login",
    "websiteKey": "0x4AAAAAAA_SITE_KEY",
    "pageAction": "login",
    "data": "c0bd4b36-7419-4e18-83c6-378699f2a9a2"
  }
}
```

## 요청 예제

POST https://api.yescaptcha.com/createTask

```json
{
  "clientKey": "YOUR_CLIENT_KEY",
  "task": {
    "type": "TurnstileTaskProxyless",
    "websiteURL": "https://example.com/login",
    "websiteKey": "0x4AAAAAAA_SITE_KEY"
  }
}
```

**curl**

```bash
curl -s https://api.yescaptcha.com/createTask \
  -H 'Content-Type: application/json' \
  -d '{
  "clientKey": "YOUR_CLIENT_KEY",
  "task": {
    "type": "TurnstileTaskProxyless",
    "websiteURL": "https://example.com/login",
    "websiteKey": "0x4AAAAAAA_SITE_KEY"
  }
}'

# Returns {"errorId":0,"taskId":"..."}; then poll every 5 seconds:
curl -s https://api.yescaptcha.com/getTaskResult \
  -H 'Content-Type: application/json' \
  -d '{"clientKey": "YOUR_CLIENT_KEY", "taskId": "TASK_ID"}'
```

**Python**

solve.py

```python
import os
import time

import requests

API = "https://api.yescaptcha.com"
CLIENT_KEY = os.environ["YESCAPTCHA_CLIENT_KEY"]  # Read the clientKey from an environment variable

def call(method, payload):
    r = requests.post(f"{API}/{method}", json={"clientKey": CLIENT_KEY, **payload}, timeout=30)
    data = r.json()
    if data.get("errorId"):
        raise RuntimeError(f"{data.get('errorCode')}: {data.get('errorDescription')}")
    return data

def solve(task):
    task_id = call("createTask", {"task": task})["taskId"]
    for _ in range(36):  # Poll every 5 seconds, for up to about 3 minutes
        time.sleep(5)
        result = call("getTaskResult", {"taskId": task_id})
        if result.get("status") == "ready":
            return result["solution"]
    raise TimeoutError(task_id)

solution = solve({
    "type": "TurnstileTaskProxyless",
    "websiteURL": "https://example.com/login",
    "websiteKey": "0x4AAAAAAA_SITE_KEY",
})
print(solution["token"])
```

**Node.js**

solve.mjs

```js
const API = 'https://api.yescaptcha.com';
const CLIENT_KEY = process.env.YESCAPTCHA_CLIENT_KEY; // Read the clientKey from an environment variable

async function call(method, payload) {
  const res = await fetch(`${API}/${method}`, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ clientKey: CLIENT_KEY, ...payload }),
  });
  const data = await res.json();
  if (data.errorId) throw new Error(`${data.errorCode}: ${data.errorDescription}`);
  return data;
}

async function solve(task) {
  const { taskId } = await call('createTask', { task });
  for (let i = 0; i < 36; i++) { // Poll every 5 seconds, for up to about 3 minutes
    await new Promise((r) => setTimeout(r, 5000));
    const result = await call('getTaskResult', { taskId });
    if (result.status === 'ready') return result.solution;
  }
  throw new Error(`timeout: ${taskId}`);
}

const solution = await solve({
  type: "TurnstileTaskProxyless",
  websiteURL: "https://example.com/login",
  websiteKey: "0x4AAAAAAA_SITE_KEY",
});
console.log(solution.token);
```

`websiteURL`과 `websiteKey`를 대상 웹사이트의 값으로 바꾸세요.

## 반환 결과

```json
{
  "errorId": 0,
  "status": "ready",
  "solution": {
    "token": "0.ufq5RgSVZd11DPSX1brdrxnEs28KcVlKj2ORchqxSy2q9yAW6ciq3hriXDF4x...",
    "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/155.0.0.0 Safari/537.36"
  }
}
```

| 필드 | 유형 | 설명 |
| --- | --- | --- |
| `token` | string | 대상 웹사이트에 제출할 토큰이에요. 1회만 사용할 수 있으니 가능한 한 빨리 사용하세요 |
| `userAgent` | string | 토큰을 발급받을 때 사용한 User-Agent예요. 토큰을 제출할 때 이 값을 사용하세요. 보낸 값과 다르면 이 값이 우선해요 |

`token`을 웹페이지의 `cf-turnstile-response` 필드(또는 대상 웹사이트 API가 요구하는 필드)에 넣어 제출하세요. 제출 요청의 User-Agent는 반환된 `userAgent`를 사용하세요.

처리 중일 때는 `{"errorId": 0, "status": "processing"}`가 반환돼요. 5초 후에 다시 조회하세요. 오류가 발생하면 `errorCode`에 따라 처리하세요. 자세한 내용은 [오류 코드](https://docs.yescaptcha.com/ko/api/errors.md)를 참고하세요.

## 자주 묻는 질문

### 토큰은 얼마 동안 유효한가요?

일회용이에요. 받은 뒤 가능한 한 빨리 제출하세요. Turnstile 토큰은 보통 몇 분 안에 만료되며, 만료 시점은 Cloudflare가 결정해요.

### 제출했는데도 웹사이트에서 통과되지 않아요

`websiteURL`이 인증 위젯이 나타나는 페이지인지, `websiteKey`가 올바른지 확인하고, 제출할 때 반환된 `userAgent`를 사용하세요. 웹페이지가 `action`과 `cData`를 전달한다면 `pageAction`과 `data`로 함께 전달하세요. 위의 [통과하지 못할 때](#%ED%99%95%EC%A0%95%EB%90%98%EC%A7%80-%EC%95%8A%EC%9D%8C)를 참고하세요. 웹사이트가 IP도 함께 검사한다면 `TurnstileTask`를 사용하고, 제출할 때도 같은 프록시를 거치세요.

## 관련 가이드

-   [캡차 유형 판별](https://docs.yescaptcha.com/ko/guides/identify-captcha.md)
-   [Turnstile 파라미터 찾기](https://docs.yescaptcha.com/ko/guides/find-turnstile-parameters.md)
