Go to file
Haewon Kam 00b8339ca2 feat(contact): 문의 전송을 서버 함수로 옮겨 토큰 노출 제거
브라우저로 내려간 값은 무엇이든 공개다. VITE_LEAD_TOKEN 이 번들에 평문으로
박혀 있었고(실제로 추출해 확인했다) 토큰은 보호 장치가 되지 못했다. 토큰을
새로 발급해도 똑같이 공개된다.

- api/lead.js 신규. 토큰과 Apps Script 주소를 서버 환경변수(LEAD_TOKEN·
  LEAD_ENDPOINT)로만 들고 요청을 전달한다. VITE_ 접두사를 쓰지 않아 번들에
  들어가지 않는다.
- Origin 허용 목록으로 webforai.kr·www·aio2o.webforai.kr 만 받는다. 토큰과
  달리 Origin 은 브라우저가 채우고 스크립트가 바꿀 수 없다. 다른 사이트에
  폼을 심어 이 주소를 때리는 것을 막는다. aio2o 는 정적 배포라 자체 함수를
  둘 수 없어 이 함수를 같이 쓴다(교차 출처라 CORS 를 명시).
- submitLead 는 같은 출처 /api/lead 로 보낸다. 클라이언트 환경변수가 없어졌다.
- vercel.json 의 전체 경로 리라이트에서 /api 를 제외한다. 안 그러면 함수
  요청까지 index.html 로 삼킨다.

Vercel 환경변수: LEAD_ENDPOINT·LEAD_TOKEN 추가, VITE_LEAD_* 2개 삭제.
Vite 는 코드에서 안 쓰더라도 VITE_ 접두사 변수를 전부 번들에 넣기 때문에
삭제까지 해야 토큰이 사라진다(삭제 전 재배포에서 여전히 검출됐다).

검증: 운영 번들에서 토큰 0건·script.google.com 0건. /api/lead 정상 응답
{"ok":true,"mailed":true}. 다른 Origin 403. SPA 라우트(/discovery/:id·
/actions/:id) 200 유지. 실제 폼 제출 접수 확인.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-10-06 16:56:15 +09:00
.claude chore: archive-screenshots supabase-py 리팩터 + Storage 버킷 자동 생성 2026-04-07 15:32:40 +09:00
.vscode feat: add API Dashboard + filled icons + pipeline improvements 2026-04-06 14:59:31 +09:00
api feat(contact): 문의 전송을 서버 함수로 옮겨 토큰 노출 제거 2026-10-06 16:56:15 +09:00
data feat(ga4): AI 유입 트래픽 연동 뼈대 + 리포트 "측정 가능 범위" 절 2026-09-09 10:53:54 +09:00
doc docs: update DB V3 checklist — Phase 1-4 implemented 2026-04-05 00:54:52 +09:00
docs docs: 2026-09-18 핸드오버와 다음 세션 프롬프트 2026-09-18 17:27:50 +09:00
evidence/viewclinic feat(supporters): 근거 수집기 scripts/collect_evidence.mjs + evidence/viewclinic (§7-3) 2026-09-07 14:26:15 +09:00
plugins chore: archive-screenshots supabase-py 리팩터 + Storage 버킷 자동 생성 2026-04-07 15:32:40 +09:00
public feat(landing): 히어로 문구를 'AI에게 병원을 묻습니다'로 2026-09-15 16:55:59 +09:00
reference feat: clinic registry DB + pipeline audit P0 fixes 2026-04-07 09:33:25 +09:00
scripts feat(contact): 푸터에 사업자 정보 추가, 문의 폼에 허니팟·속도 제한 2026-10-01 11:53:06 +09:00
src feat(contact): 문의 전송을 서버 함수로 옮겨 토큰 노출 제거 2026-10-06 16:56:15 +09:00
supabase feat(db): clinic_registry 에 서브도메인 컬럼·유니크·예약어 제약 추가 2026-09-14 11:09:52 +09:00
supporters feat(supporters): 서포터즈 사이트 초안 표시를 눈에 띄게 강화 2026-09-21 10:27:26 +09:00
templates/supporters-astro feat(supporters): 서포터즈 사이트 초안 표시를 눈에 띄게 강화 2026-09-21 10:27:26 +09:00
workers/supporters-build feat(supporters): 주변 안내 축제를 회복 일정의 체류 기간 기준으로 먼저 보여 준다 2026-09-16 09:47:01 +09:00
.env.example feat: INFINITH Marketing Platform — Phase 1 MVP 2026-03-24 16:48:11 +09:00
.gitignore docs(design): 신청 접수 알림과 완료 안내 메일 설계 v0.1 2026-09-18 16:22:28 +09:00
.vercelignore feat: add API Dashboard + filled icons + pipeline improvements 2026-04-06 14:59:31 +09:00
CLAUDE.md docs: CLAUDE.md 백엔드 파이프라인 실제 구현 반영 2026-04-10 13:41:53 +09:00
extracted_marketing_text.md feat: INFINITH Marketing Platform — Phase 1 MVP 2026-03-24 16:48:11 +09:00
index.html fix: Pretendard self-host + 한글 시스템 폰트 fallback 체인 강화 2026-04-15 11:03:04 +09:00
Medical Marketing Intelligence Report Prompt_01.28.2026.md feat: INFINITH Marketing Platform — Phase 1 MVP 2026-03-24 16:48:11 +09:00
metadata.json feat: INFINITH Marketing Platform — Phase 1 MVP 2026-03-24 16:48:11 +09:00
package-lock.json feat: real API integration + YouTube Data API v3 + progressive loading 2026-04-02 10:57:14 +09:00
package.json fix: import-registry 스크립트 수정 + npm sync-registry 추가 2026-04-10 14:25:00 +09:00
PRD.md feat: INFINITH Marketing Platform — Phase 1 MVP 2026-03-24 16:48:11 +09:00
README.md feat: INFINITH Marketing Platform — Phase 1 MVP 2026-03-24 16:48:11 +09:00
tsconfig.json feat(discovery): AEO/GEO 분리 채점 기준표 v2.0 초안 + 리포트 패널 2026-09-07 15:12:35 +09:00
vercel.json feat(contact): 문의 전송을 서버 함수로 옮겨 토큰 노출 제거 2026-10-06 16:56:15 +09:00
Viewclinic Plan.md feat: 뷰성형외과 실제 데이터 기반 세일즈 프로토타입 완성 2026-04-13 13:11:18 +09:00
vite.config.ts fix(front): 루트 /favicon.ico 를 discovery 배포에 넣는다 2026-09-16 09:27:10 +09:00
뷰성형외과_Marketing_Intelligence_Report.md feat: INFINITH Marketing Platform — Phase 1 MVP 2026-03-24 16:48:11 +09:00

GHBanner

Run and deploy your AI Studio app

This contains everything you need to run your app locally.

View your app in AI Studio: https://ai.studio/apps/d446f5f5-e089-404a-93ce-32a72f2f5108

Run Locally

Prerequisites: Node.js

  1. Install dependencies: npm install
  2. Set the GEMINI_API_KEY in .env.local to your Gemini API key
  3. Run the app: npm run dev