테마 전환

OpenAI API가 계속 시간 초과되나요? Workers로 무료 개인 프록시 구축하기

Easton editorial illustration: global cache relay

들어가며

지난주 ChatGPT 애플리케이션을 개발하려고 프런트엔드 코드를 완성한 뒤 API를 호출했는데 연결 시간이 초과됐습니다. 중국에서는 OpenAI에 접속할 수 없기 때문입니다. 온라인에서 판매하는 프록시 서비스도 써 봤지만 신뢰하기 어려웠고, API Key 유출 위험도 너무 컸습니다. VPS를 구매해 직접 구축하는 방법도 생각했지만 매달 수십 위안의 비용이 들고 서버 설정과 유지보수까지 해야 했습니다.

그러다 Cloudflare Workers를 이용하는 방법을 알게 됐습니다. 비용이 전혀 들지 않고 5분이면 설정할 수 있습니다. 두 달 넘게 사용해 보니 안정적일 뿐 아니라 속도도 많은 유료 프록시보다 빨랐습니다. 이 글에서는 바로 사용할 수 있는 코드와 함께 전체 구축 과정을 소개합니다.

Cloudflare Workers를 선택하는 이유

하루 10만 건
무료 요청 한도
300개 이상
전 세계 CDN 노드
5분
전체 배포 시간
Source: Cloudflare 공식 데이터

개인 개발자에게 충분한 무료 한도

Workers 무료 플랜은 하루 10만 건, 분당 1,000건의 요청 한도를 제공합니다. 무료 서비스가 정말 쓸 만할지 의문이 들 수도 있습니다. 저도 처음에는 그랬습니다. 하지만 실제로 사용해 보니 개인 개발과 학습, 소규모 프로젝트에는 충분했습니다.

간단히 계산해 보겠습니다. 요청 한 건이 평균 2초 걸린다고 가정하면 하루 8시간 동안 쉬지 않고 호출해도 2,000여 건에 불과합니다. 10만 건의 한도를 소진하려면 며칠 내내 계속 사용해야 합니다.

서버 구매 없이 간편하게

기존 방식은 VPS를 구매한 다음 Nginx를 설치해 리버스 프록시를 설정해야 하고, 서버 장애까지 신경 써야 합니다. Workers에서는 이런 작업이 전혀 필요 없습니다. Cloudflare가 모든 인프라를 처리하므로 몇 줄의 코드만 작성하면 됩니다.

Workers는 Cloudflare의 글로벌 CDN 네트워크에서 실행되므로 이론적으로 직접 구축한 단일 서버보다 더 빠릅니다. Cloudflare는 전 세계 300개 이상의 도시에 노드를 운영하고 있습니다.

API Key를 기본적으로 안전하게 보호

이 부분은 특히 중요합니다. 프런트엔드에서 OpenAI API를 직접 호출하면 키가 브라우저에 노출되어 누구든 개발자 도구를 열어 확인할 수 있습니다. Workers를 중간 계층으로 사용하면 프런트엔드는 Worker 주소만 호출하고, 실제 API Key는 Cloudflare 환경 변수에 안전하게 보관됩니다.

"2025년 8월 Cloudflare와 OpenAI는 OpenAI의 오픈 소스 모델을 Workers AI에 직접 통합했으며, 매일 10,000 Neurons의 무료 할당량을 제공합니다."

- Cloudflare 공식 발표

2025년에 추가된 새로운 혜택

2025년 8월에는 Cloudflare와 OpenAI의 협력으로 OpenAI의 오픈 소스 모델이 Workers AI에 직접 통합됐습니다. 따라서 기존 API를 프록시하는 것뿐 아니라 Cloudflare가 제공하는 모델도 직접 사용할 수 있으며, 매일 10,000 Neurons의 무료 할당량을 받을 수 있습니다.

구축 전 준비 사항

준비는 매우 간단합니다. 다음 항목이 필요합니다.

계정과 리소스:

  • Cloudflare 계정(무료로 가입할 수 있으며 몇 분이면 완료됩니다)
  • OpenAI 또는 Claude의 API Key
  • 도메인(선택 사항이며 Workers가 무료 .workers.dev 하위 도메인을 제공합니다)

기술 요구 사항:

  • 기본적인 JavaScript 지식(fetch 요청을 이해하는 정도면 충분합니다)
  • HTTP의 기본 원리 이해

소요 시간:

  • 최초 구축: 5~10분
  • 익숙해진 뒤: 3분

실전: 5분 만에 OpenAI 프록시 구축하기

1단계: Worker 생성

Cloudflare 대시보드에 로그인한 뒤 왼쪽 메뉴에서 Workers & Pages를 찾습니다. Create Application을 클릭하고 Create Worker를 선택합니다.

Cloudflare가 Worker에 임의의 이름(예: aged-shadow-1234)을 자동으로 지정합니다. 원하는 이름으로 변경할 수 있으며, 여기서는 openai-proxy로 정하겠습니다. Deploy를 클릭해 배포합니다.

이제 실행 가능한 Worker가 생성됐습니다. 아직은 아무 작업도 하지 않습니다.

2단계: 코드 작성

Edit Code를 클릭해 코드 편집기로 이동하고 다음 코드를 붙여 넣습니다.

export default {
  async fetch(request, env) {
    const url = new URL(request.url);
    // 도메인을 OpenAI API 주소로 변경
    url.hostname = 'api.openai.com';
    // 새 요청 생성
    const newRequest = new Request(url, {
      method: request.method,
      headers: request.headers,
      body: request.body
    });
    // 요청을 전달하고 응답 반환
    const response = await fetch(newRequest);
    // CORS 교차 출처 문제 처리
    const newResponse = new Response(response.body, response);
    newResponse.headers.set('Access-Control-Allow-Origin', '*');
    newResponse.headers.set('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
    newResponse.headers.set('Access-Control-Allow-Headers', 'Content-Type, Authorization');
    return newResponse;
  }
};

이 코드가 하는 일은 간단합니다.

  1. 프런트엔드가 보낸 요청을 받습니다.
  2. 요청 주소의 도메인을 api.openai.com으로 변경합니다.
  3. 수정한 요청을 OpenAI로 전달합니다.
  4. OpenAI의 응답을 그대로 프런트엔드에 반환합니다.
  5. 교차 출처 문제(CORS)도 함께 처리합니다.

Save and Deploy를 클릭해 저장합니다.

3단계: 테스트

배포가 완료되면 https://openai-proxy.YOUR_NAME.workers.dev와 같은 Worker URL이 표시됩니다.

다음 curl 명령으로 테스트합니다(YOUR_API_KEY를 자신의 OpenAI 키로 바꾸세요).

curl https://openai-proxy.YOUR_NAME.workers.dev/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -d '{
    "model": "gpt-3.5-turbo",
    "messages": [{"role": "user", "content": "Hello!"}]
  }'

OpenAI의 정상 응답이 표시되면 성공입니다.

고급 설정: 여러 AI 서비스 지원

Claude API 프록시

Claude의 API 구조는 OpenAI와 조금 다르며, 주된 차이는 요청 헤더입니다. 다음과 같이 코드를 수정해 Claude를 지원할 수 있습니다.

export default {
  async fetch(request, env) {
    const url = new URL(request.url);
    // 경로에 따라 서비스 구분
    if (url.pathname.startsWith('/claude')) {
      // /claude 접두사를 제거하고 Anthropic으로 전달
      url.pathname = url.pathname.replace('/claude', '');
      url.hostname = 'api.anthropic.com';
    } else {
      // 기본값은 OpenAI
      url.hostname = 'api.openai.com';
    }
    const newRequest = new Request(url, {
      method: request.method,
      headers: request.headers,
      body: request.body
    });
    const response = await fetch(newRequest);
    const newResponse = new Response(response.body, response);
    newResponse.headers.set('Access-Control-Allow-Origin', '*');
    return newResponse;
  }
};

이제 /claude/v1/messages로 접속하면 요청이 Claude API로 전달됩니다.

Gemini API 프록시

Google Gemini API의 엔드포인트는 generativelanguage.googleapis.com입니다. 다음 조건만 추가하면 됩니다.

if (url.pathname.startsWith('/gemini')) {
  url.pathname = url.pathname.replace('/gemini', '');
  url.hostname = 'generativelanguage.googleapis.com';
}

이렇게 하면 Worker 하나로 세 가지 AI 서비스를 프록시할 수 있습니다.

보안 모범 사례

API Key를 코드에 직접 입력하지 않기

일부 튜토리얼에서는 API Key를 Worker 코드에 직접 작성하지만, 절대 그렇게 해서는 안 됩니다. 코드는 평문으로 저장되며 실수로 공유될 수도 있습니다.

올바른 방법은 환경 변수를 사용하는 것입니다. Worker 설정에서 Variables and Secrets를 찾아 다음 환경 변수를 추가합니다.

  • 이름: OPENAI_API_KEY
  • 값: 자신의 API Key
  • 유형: Secret 선택(암호화 저장)

그런 다음 코드에서 다음과 같이 사용합니다.

export default {
  async fetch(request, env) {
    // 환경 변수에서 API Key 읽기
    const apiKey = env.OPENAI_API_KEY;
    // 요청 헤더를 수정하고 API Key 추가
    const headers = new Headers(request.headers);
    headers.set('Authorization', `Bearer ${apiKey}`);
    // 이후 코드는 이전과 동일...
  }
};

이렇게 하면 프런트엔드에서 호출할 때 API Key를 전송할 필요가 없어 더 안전합니다.

사용자 지정 인증 Token 추가

Worker URL이 다른 사람에게 알려져 악용될까 걱정된다면 간단한 인증 계층을 추가할 수 있습니다.

export default {
  async fetch(request, env) {
    // 사용자 지정 Token 확인
    const authToken = request.headers.get('X-Custom-Auth');
    if (authToken !== env.MY_SECRET_TOKEN) {
      return new Response('Unauthorized', { status: 401 });
    }
    // 인증에 성공하면 요청 처리 계속...
  }
};

환경 변수에 MY_SECRET_TOKEN을 설정하고 프런트엔드에서 호출할 때 이 사용자 지정 header를 함께 전달합니다.

사용량 모니터링

Cloudflare 대시보드의 Analytics 탭에서는 일별 요청 수와 오류율 등의 데이터를 확인할 수 있습니다. 무료 한도를 초과하는 상황을 조기에 발견할 수 있도록 정기적으로 확인하는 것이 좋습니다.

알림도 설정할 수 있습니다. Notifications에서 규칙을 생성하면 요청 수가 10만 건에 가까워질 때 이메일을 받을 수 있습니다.

자주 발생하는 문제와 해결 방법

요청 속도가 느리거나 시간 초과가 발생할 때

응답이 지나치게 느리다면 Worker에 할당된 노드가 적합하지 않을 수 있습니다.

해결 방법: 사용자 지정 도메인을 연결합니다. Cloudflare는 도메인의 DNS 설정에 따라 경로를 최적화하므로 일반적으로 무료 .workers.dev 도메인보다 더 빨라질 수 있습니다.

Worker 설정에서 TriggersAdd Custom Domain을 선택하고 도메인(예: api.yourdomain.com)을 입력한 뒤 안내에 따라 DNS 레코드를 추가하면 됩니다.

403 또는 401 오류

이 오류는 대개 API Key 문제로 발생합니다.

  1. 환경 변수의 Key 이름과 코드에서 사용하는 이름이 같은지 확인합니다.
  2. API Key가 유효하고 잔액이 남아 있는지 확인합니다.
  3. OpenAI 또는 Claude에 지역 제한이 있는지 확인합니다. Workers가 전 세계에 분산되어 있어도 일부 노드는 제한 지역으로 인식될 수 있습니다.

디버깅할 때는 코드에 다음 로그를 추가할 수 있습니다.

console.log('API Key:', env.OPENAI_API_KEY ? '설정됨' : '설정되지 않음');

그런 다음 Worker의 Logs 탭에서 실시간 로그를 확인합니다.

무료 한도가 부족할 때

10만 건의 요청 한도가 실제로 부족하다면(예: 상용 프로젝트를 운영하는 경우) 유료 플랜을 고려할 수 있습니다.

  • Workers 유료 플랜: 월 $5, 요청 1,000만 건 포함
  • 초과분: 요청 100만 건당 $0.50

솔직히 중소형 애플리케이션이라면 직접 VPS를 구매하는 것보다 훨씬 경제적입니다. 서버 유지보수에 신경 쓰지 않아도 되므로 절약되는 시간의 가치도 더 큽니다.

월 $5
유료 플랜 시작 가격
1,000만 건
유료 플랜 요청 한도
$0.50
초과 요청 100만 건당 비용
Source: Cloudflare 가격 정보

최적화 팁:

  1. 프런트엔드에서 캐시를 사용해 같은 요청을 반복 호출하지 않습니다.
  2. API가 지원한다면 배치 인터페이스를 사용해 요청 횟수를 줄입니다.
  3. 개발 단계에서는 실제 API를 계속 호출하지 말고 Mock 데이터를 사용합니다.

마무리

Workers 프록시 방식의 핵심 장점은 세 가지입니다.

  • 비용 부담 없음: 무료 한도만으로도 개인 개발에 충분합니다.
  • 낮은 진입 장벽: 5분이면 설정할 수 있고 코드도 30줄이 채 되지 않습니다.
  • 키 유출 위험 최소화: API Key를 안전하게 저장해 외부에 노출하지 않습니다.

이 방식은 개인 학습, 데모 개발, 소규모 프로젝트에 특히 적합합니다. 안정적인 AI API 접속 방법을 찾고 있다면 Workers를 한번 사용해 보세요.

지금 바로 하나 만들어 보세요. 이 글을 저장해 두면 문제가 생겼을 때 언제든 다시 확인할 수 있습니다. 구축 과정에서 다른 문제를 발견했다면 댓글로 알려 주세요. 어떤 부분을 더 개선할 수 있을지 저도 궁금합니다.

글에서 언급한 오픈 소스 프로젝트도 훌륭합니다. 특히 chatgptProxyAPIworker-openai-proxy는 코드가 명확하므로 GitHub에서 살펴보면 도움이 됩니다.

현재 어떤 방식으로 AI API에 접속하고 계신가요? 댓글로 이야기해 주세요.

FAQ

Cloudflare Workers 무료 플랜으로 충분한가요?
개인 개발과 소규모 프로젝트에는 충분합니다.

무료 플랜 한도:
• 하루 10만 건의 요청
• 분당 1,000건
• 하루 8시간 동안 쉬지 않고 호출해도 2,000여 건에 불과함

상용 프로젝트나 동시 요청이 많은 경우에만 유료 플랜(월 $5, 요청 1,000만 건)을 고려하면 됩니다.
Workers 프록시는 OpenAI에 직접 연결할 때보다 느린가요?
이론적으로는 50~100ms의 지연이 추가되지만, 실제 사용 중에는 거의 체감되지 않습니다.

장점:
• Cloudflare는 전 세계에 300개 이상의 CDN 노드를 운영함
• 일부 지역에서는 Workers를 통한 접속이 OpenAI 직접 연결보다 더 빠를 수 있음

사용자 지정 도메인을 연결하면 Cloudflare가 경로를 최적화하므로 속도를 더 높일 수 있습니다.
API Key 유출을 어떻게 막을 수 있나요?
Cloudflare의 Secret 유형 환경 변수에 API Key를 저장하면 프런트엔드 코드에 키가 전혀 노출되지 않습니다.

추가 보안 조치:
• 사용자 지정 인증 Token(X-Custom-Auth header) 추가
• Token을 아는 클라이언트만 호출할 수 있도록 제한
• Worker URL 유출이 걱정되면 사용자 지정 도메인을 연결하고 IP 허용 목록 설정
Workers 하나로 OpenAI, Claude, Gemini를 모두 프록시할 수 있나요?
물론 가능합니다.

경로 접두사로 서비스를 구분합니다:
• 기본 경로는 OpenAI로 프록시
• /claude 경로는 Claude로 프록시
• /gemini 경로는 Gemini로 프록시

50줄 미만의 코드로 Worker 하나에서 세 가지 AI 서비스를 모두 처리할 수 있습니다.
Workers 사용량과 비용은 어떻게 모니터링하나요?
Cloudflare 대시보드의 Workers Analytics 탭에서 다음 항목을 확인할 수 있습니다:
• 요청 수
• 오류율
• 응답 시간 등의 지표

요청 수가 10만 건에 가까워질 때 이메일을 자동 발송하도록 Notifications 규칙을 설정할 수도 있습니다.

유료 플랜에서는 상세 로그와 추적 데이터도 확인할 수 있습니다.

2분 읽기 · 게시일: 2025년 12월 1일 · 수정일: 2026년 9월 4일

댓글

GitHub로 로그인하여 댓글을 남기세요

Easton BlogEaston Blog