Edge Function의 빌드타임 환경변수 인라인·KV 평문 저장·dev/prod 환경변수 동기화 누락은 비밀키 노출의 5대 진입점이며, 글로벌 배포 특성상 노출 시 회수가 어렵다.
AI 코딩 도구가 만든 코드에서 가장 자주 누락되며, 누락 시 인증 우회·데이터 탈취·서비스 마비로 직결된다.
이 글은 자주 발생하는 실수 패턴, 표준 구현 코드, 30초 자가진단, 24시간 패치 순서를 정리했다.
한눈에 보는 핵심
Q. Edge Function 환경변수는 일반 서버와 뭐가 다른가요? A. 전 세계 엣지 노드에 배포되어 회수가 어렵고, 빌드타임 인라인 시 클라이언트 번들에 포함될 수 있습니다. Q. Cloudflare Workers와 Vercel Edge 차이는? A. Workers는 Wrangler secrets+KV로 분리, Vercel은 Encrypted Environment Variables로 관리합니다. 둘 다 .env 평문 커밋 금지가 원칙입니다. Q. console.log로 디버깅하면 어디 남나요? A. Cloudflare Dashboard Logs/Logpush, Vercel Function Logs에 일정 기간 보관됩니다. 로그 자체에 마스킹 필터가 필요합니다.자주 발생하는 실수 패턴
| # | 패턴 | 위험도 |
|---|---|---|
| 1 | 빌드타임 process.env 인라인 — 번들에 시크릿 박힘 | 치명 |
| 2 | console.log(payment.cardNumber) — Logpush 평문 저장 | 치명 |
| 3 | KV/D1에 비밀키 평문 — 권한 분리 없이 접근 가능 | 치명 |
| 4 | wrangler.toml에 vars 평문 커밋 | 치명 |
| 5 | .env.local만 분리, .env.production 커밋 누설 | 높음 |
표준 구현 코드
// Cloudflare Workers — 표준 Bindings 패턴
export interface Env {
STRIPE_SECRET: string; // wrangler secret put STRIPE_SECRET
PAYMENT_KV: KVNamespace;
}
export default {
async fetch(req: Request, env: Env): Promise<Response> {
// env.STRIPE_SECRET 만 사용. process.env 사용 금지.
const sig = req.headers.get('Stripe-Signature');
if (!verify(sig, env.STRIPE_SECRET)) {
return new Response('unauthorized', { status: 401 });
}
// 비밀키 직접 로그 금지 — 응답 ID만 로그
console.log('paid:', maskedId(sig));
return new Response('ok');
}
};
핵심 4요소를 모두 충족해야 결함이 사라진다.
AI 도구는 동작 코드만 출력하므로 보안 분기는 별도로 강제해야 한다.
미들웨어/데코레이터로 모든 경로에 일괄 적용이 표준이다.
30초 자가진단
# 1. wrangler.toml 평문 검사
grep -E "(api[_-]?key|secret|token)" wrangler.toml
# 2. dist 번들에 시크릿 누설 확인
npx wrangler deploy --dry-run --outdir=/tmp/dist
grep -rE "sk_live_|whsec_" /tmp/dist
# 3. .env 류 git history
git log -p -- .env.production .env.local | grep -iE "secret|key"
# 4. Logpush에 평문 PII
wrangler tail --format=pretty | grep -iE 'card|cvc|ssn'
위 시그널이 발견되면 결함이다. Cloudflare Workers Secrets 공식 참조.
24시간 패치 절차
| 순위 | 조치 |
|---|---|
| 1 | wrangler secret put / Vercel Encrypted Env로 시크릿 분리 |
| 2 | KV/D1 저장 시 AES-256 암호화 후 저장 |
| 3 | console.log 입력값 마스킹 필터 적용 |
| 4 | .env.production git에서 즉시 제거 + filter-repo |
| 5 | 프리뷰/프로덕션 환경변수 분리 + 회전 |
지금 해야 할 것
실무자: CodeScan 무료 스캔으로 30초 점검.
CISO·임원: 통합 보안 점검은 SENTRIX 30분 1:1 상담.
결함 발견 시 24시간 안에 패치 완료가 표준이다.