---
title: "C-2. CF Workers AI 브리프 프록시 구축"
notion_id: "36422962086881a1866acec6da75d72f"
notion_url: "https://app.notion.com/p/36422962086881a1866acec6da75d72f"
category: "workreport"
parent: "Claude Code 작업보고"
updated: "2026-05-18"
priority: "High"
purpose: "작업지시서 #01 CF Workers AI 브리프 프록시 구축 (C파트 재기록본) — CORS·키 보호, demo/main 양쪽 푸시"
read_when: ["AI브리프·코칭"]
---

## 📌 스터디 요약
**파트-섹션:** C-2 | **작업일:** 2026-05-15 | **에이전트:** Claude Code (Opus 4.7 1M) | **브랜치:** demo
- **작업지시서 #01** 전달: CF Workers AI 브리프 프록시 구축 (우선순위 1순위)
- Claude Code가 4개 파일 생성/수정, `tsc --noEmit` 통과 (0 에러)
- 사용자가 `briefApi.ts` PROXY_URL에서 `ccy-hansbridge` → **`ccy4848`** 수정 후 커밋 요청
- demo + main **둘 다 푸시** 커밋 완료: `origin/demo` 및 `origin/main` 동기화
- 5턴 시스템 리마인더: `workers/brief-proxy/index.js`가 **CORS preflight 보강 패치**로 외부 수정됨
**파트 연관:** C파트 — 인증/백엔드 / 선행: C-1(로그인) / 후속: C-3(마스터로그인수정)

---
# 대화 추출본 — 작업지시서 #01 CF Workers AI 브리프 프록시 구축
- 프로젝트: 달록 (dallog)
- 작업 브랜치: demo / main
- 추출일: 2026-05-18
- 모델: Claude Opus 4.7 (1M context)

---
## 1턴 — 사용자 (작업지시서 #01)
### 배경 및 목적
AI 브리프 기능이 아직 구현되지 않은 상태. 프론트에서 Anthropic API를 직접 호출하면 CORS 정사 위반 + API 키 노출 문제 발생. CF Workers를 중간 프록시로 세워 두 문제를 동시 해소.
```
프론트 (dallog.pages.dev)
  ↓  POST /
CF Workers (dallog-brief-proxy.*.workers.dev)
  ↓  POST + x-api-key 헤더 주입
api.anthropic.com/v1/messages
```
### 생성할 파일 3+수정:
```
D:\dallog\dallog_git\
├── workers/brief-proxy/index.js   ← 신규
├── wrangler.toml                  ← 신규
└── src/lib/briefApi.ts            ← 신규 (.js→.ts 콘벤션 변환)
```

---
## 1턴 — 어시스턴트 (작업 수행 및 보고)
### 사전 조사
- 루트에 `workers/`, `wrangler.toml` 없음 → 신규 생성
- `src/lib/` 안에 `auth.ts`, `claude.ts`, `demo.ts`, `supabase.ts` 존재 → TS 콘벤션 확인
- 기존 `src/lib/claude.ts`는 브라우저 직접 호출 방식이라 작업지시서가 해결하려는 바로 그 문제 상태
### [3종 세트]
**[계획]**
1. `workers/brief-proxy/index.js` 생성 → 검증: 파일 내용 확인
2. `wrangler.toml` 루트에 생성 → 검증: 파일 내용 확인
3. `src/lib/briefApi.ts` 생성 (.js→.ts 콘벤션 변환) → 검증: 파일 내용 확인
4. `.gitignore`에 `.wrangler/` 추가
5. wrangler 모수 명령(login/secret/deploy)은 사용자에게 안내
**[콘텍스트노트]**
- `briefApi.js` → `briefApi.ts`: 프로젝트가 TS이고 같은 폴더의 모든 파일이 `.ts`. import 호환성·타입 안전성을 위해 콘벤션 따름.
- `wrangler login`·`deploy`는 외부 서비스(Cloudflare) 인증이 필요해 사용자 본인이 실행하는 것이 안전.
### 생성 파일 1: `workers/brief-proxy/index.js`
```javascript
// Anthropic API CORS·키 보호용 CF Workers 프록시 — 2026.05.15 추가
const ALLOWED_ORIGINS = [
  'https://dallog.pages.dev',
  'http://localhost:5173',
];

const ANTHROPIC_API = 'https://api.anthropic.com/v1/messages';

export default {
  async fetch(request, env) {
    const origin = request.headers.get('Origin') || '';
    if (request.method === 'OPTIONS') return new Response(null, { headers: corsHeaders(origin) });
    if (request.method !== 'POST') return new Response('Method not allowed', { status: 405 });

    let body;
    try { body = await request.json(); }
    catch { return new Response('Invalid JSON', { status: 400 }); }

    const anthropicRes = await fetch(ANTHROPIC_API, {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'x-api-key': env.ANTHROPIC_API_KEY,
        'anthropic-version': '2023-06-01',
      },
      body: JSON.stringify(body),
    });

    const data = await anthropicRes.json();
    return new Response(JSON.stringify(data), {
      status: anthropicRes.status,
      headers: { 'Content-Type': 'application/json', ...corsHeaders(origin) },
    });
  },
};

function corsHeaders(origin) {
  const isAllowed = ALLOWED_ORIGINS.includes(origin);
  return {
    'Access-Control-Allow-Origin': isAllowed ? origin : ALLOWED_ORIGINS[0],
    'Access-Control-Allow-Methods': 'POST, OPTIONS',
    'Access-Control-Allow-Headers': 'Content-Type',
    'Access-Control-Max-Age': '86400',
  };
}
```
**→ 외부 수정 (5턴 시스템 리마인더):** CORS preflight 보강 패치 적용.
### 생성 파일 2: `wrangler.toml`
```toml
# Cloudflare Workers 설정 — dallog-brief-proxy — 2026.05.15 추가
name = "dallog-brief-proxy"
main = "workers/brief-proxy/index.js"
compatibility_date = "2024-09-23"
compatibility_flags = ["nodejs_compat"]
```
### 생성 파일 3: `src/lib/briefApi.ts`
```typescript
// AI 브리프 프록시 호출 유틸 — 2026.05.15 추가
const PROXY_URL = import.meta.env.PROD
  ? 'https://dallog-brief-proxy.ccy4848.workers.dev'  // 수정: ccy-hansbridge → ccy4848
  : 'http://localhost:8787'

export async function fetchBrief(prompt: string): Promise<string> {
  const res = await fetch(PROXY_URL, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
      model: 'claude-sonnet-4-20250514',
      max_tokens: 1000,
      messages: [{ role: 'user', content: prompt }],
    }),
  })
  if (!res.ok) throw new Error(`브리프 요청 실패: ${res.status}`)
  const data = await res.json()
  return data.content?.[0]?.text ?? ''
}
```
### `tsc --noEmit` 통과 (에러 0건)

---
## 2턴 — 사용자
```
src/lib/briefApi.ts에서 PROXY_URL의 ccy-hansbridge를 ccy4848로 수정하고 커밋해줘
```

---
## 2턴 — 어시스턴트
`src/lib/briefApi.ts:5` 한 줄 교정 후 git 상태 확인.
트브랜치 콘텍스트 확인:
- 현재 브랜치: `demo`
- 의미 단위로 한 커밋에 통합
```bash
git add .gitignore src/lib/briefApi.ts workers/brief-proxy/index.js wrangler.toml
git commit -m "feat: 작업지시서 #01 CF Workers AI 브리프 프록시 구축 - CORS·키 보호"
```
결과:
```
[demo 0e7f20a] feat: 작업지시서 #01 CF Workers AI 브리프 프록시 구축 - CORS·키 보호
 4 files changed, 100 insertions(+)
```

---
## 3턴 — 사용자
```
git push origin main
```

---
## 3턴 — 어시스턴트
현재 브랜치가 `demo`라는 점을 확인한 뒤 옵션 제시.
| 옵션 | 동작 |
|---|---|
| demo만 푸시 | `git push origin demo` |
| main만 푸시 | `git push origin main` |
| **둘 다 푸시** | `git push origin demo && git push origin main` |
| demo를 main에 머지 후 푸시 | 모든 작업을 main 한 줄로 통합 |

**사용자 답변: "둘 다 푸시"**
```bash
git push origin demo  # b5345aa..0e7f20a
git push origin main  # f2d5786..7e4b825
```
결과:
```
To https://github.com/ccy-hansbridge/dallog.git
   b5345aa..0e7f20a  demo -> demo
   f2d5786..7e4b825  main -> main
```

---
## 4~5턴 — Continue + 화면이켜 요청 및 최종 추출

---
## 부록 A — 최종 산출물 파일 인벤토리
| 파일 | 상태 | 비고 |
|---|---|---|
| `workers/brief-proxy/index.js` | 신규 + 후속 패치(CORS preflight 보강) | 외부 수정 적용됨 |
| `wrangler.toml` | 신규 | `dallog-brief-proxy` 워커 정의 |
| `src/lib/briefApi.ts` | 신규 | PROXY_URL `ccy4848.workers.dev` |
| `.gitignore` | 수정 | `.wrangler/` 추가 |

## 부록 B — 커밋 한 줄
```
0e7f20a feat: 작업지시서 #01 CF Workers AI 브리프 프록시 구축 - CORS·키 보호
```
`origin/demo`에 동기화됨. main 브랜치에는 `7e4b825`(작업지시서 #02)가 푸시됨.

## 부록 C — 사용자가 직접 수행해야 할 후속 단계
1. `npx wrangler --version`
2. `npx wrangler login`
3. `npx wrangler secret put ANTHROPIC_API_KEY`
4. `npx wrangler dev` (별도 터미널)
5. `curl -X POST http://localhost:8787 ...` 로컈 검증
6. `npx wrangler deploy` 후 발급 URL을 `src/lib/briefApi.ts`의 PROXY_URL과 대조

---
*대화 추출본 — 2026.05.18 작성 · Claude Opus 4.7 (1M context)*
