모든 키를 .env.local 한 파일에 모읍니다. 절대 커밋하지 마세요(.gitignore에 .env*.local 확인). 배포 시에는 vercel env로 동일하게 올립니다.
.env.local 템플릿
# ── LLM ──
ANTHROPIC_API_KEY="sk-ant-..." # Claude (강사 Agent 답변)
OPENAI_API_KEY="sk-proj-..." # 임베딩(text-embedding-3-small)
# ── 음성 (ElevenLabs) ──
ELEVENLABS_API_KEY=sk_...
NEXT_PUBLIC_VOICE_HANS17=IXlopTLhDcKBLBlJjBG5 # 강사 보이스
NEXT_PUBLIC_VOICE_GHOST=L48DKpNJAULWpYwR0KCt # 마왕 나래이션
# ── Supabase (대규모 RAG · pgvector) ──
NEXT_PUBLIC_SUPABASE_URL="https://<ref>.supabase.co"
NEXT_PUBLIC_SUPABASE_ANON_KEY="eyJ..."
SUPABASE_SERVICE_ROLE_KEY="eyJ..." # 서버 전용(관리자 조회). 절대 클라이언트 노출 금지
# ── 메일 (선택) ──
RESEND_API_KEY=re_...
# ── 관리자 ──
ADMIN_TOKEN=... # 대화 로그/관리자 페이지 게이트
체크리스트
-
.env*.local이.gitignore에 있는가 (커밋 방지) -
NEXT_PUBLIC_*는 클라이언트 노출용만 (비밀키엔 붙이지 말 것) -
SUPABASE_SERVICE_ROLE_KEY는 서버 라우트에서만 사용 - 로컬 =
.env.local, 배포 =vercel env add NAME production(+ preview/development) - 배포 후
vercel env pull로 로컬과 동기 확인 - 키 회전(rotate) 시 로컬·Vercel 양쪽 모두 교체
NEXT_PUBLIC 구분
| 종류 | 예 | 위치 |
|---|---|---|
| 서버 전용(비밀) | ANTHROPIC_API_KEY, SUPABASE_SERVICE_ROLE_KEY | process.env.*, 라우트/서버 |
| 클라이언트 노출(공개 가능) | NEXT_PUBLIC_VOICE_*, NEXT_PUBLIC_SUPABASE_URL | 브라우저 번들에 인라인됨 |
⚠️ 비밀키에
NEXT_PUBLIC_을 붙이면 브라우저로 새어 나갑니다. anon key·voice id 처럼 공개돼도 되는 것만.
핵심 정리
- 키는 한 파일(
.env.local) · 커밋 금지 · 배포처 env에 동일 등록. - 공개/비밀 구분이 보안의 90%. service_role·API 키는 서버 전용.
