From 8667bf6e2e64e2d1d68a60f99c1f0b2bd3cc1dce Mon Sep 17 00:00:00 2001 From: Haewon Kam Date: Wed, 7 Oct 2026 14:21:53 +0900 Subject: [PATCH] =?UTF-8?q?docs:=20webforai.kr=20=EA=B3=B5=EA=B0=9C=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EC=8A=A4=EC=9C=84=EC=B9=98=EC=99=80=20?= =?UTF-8?q?=EB=8B=A4=EC=8B=9C=20=EC=97=AC=EB=8A=94=20=EC=88=9C=EC=84=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- docs/WEBFORAI_FEATURE_FLAGS.md | 45 ++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 docs/WEBFORAI_FEATURE_FLAGS.md diff --git a/docs/WEBFORAI_FEATURE_FLAGS.md b/docs/WEBFORAI_FEATURE_FLAGS.md new file mode 100644 index 0000000..e42d25f --- /dev/null +++ b/docs/WEBFORAI_FEATURE_FLAGS.md @@ -0,0 +1,45 @@ +# webforai.kr 공개 기능 스위치 + +공개 배포(webforai.kr, `VITE_SITE=discovery`)에서 숨겨 둔 기능을 다시 여는 방법. 2026-10-07 보도자료 공개일 기준. + +## 지금 공개된 것 + +랜딩(`/`), 로그인(`/login`), 개인정보처리방침(`/privacy`), 이용약관(`/terms`). 나머지 경로는 홈으로 돌아간다. +infinith-demo 배포(VITE_SITE 없음)는 모든 화면이 그대로 열린다. + +## 스위치 (`src/lib/site.ts`) + +| 스위치 | 여는 것 | 켜기 전 조건 | 같이 고칠 것 | +|---|---|---|---| +| `SHOW_PRICING` | `/pricing`, 헤더 Pricing | 요금 확정 | `src/data/pricingTiers.ts` 요금표 | +| `SHOW_SAMPLE_REPORT` | `/discovery/sample`, 랜딩 "샘플 리포트 보기" | 없음 (가상 데이터 `src/data/discovery_sample.ts`) | 필요하면 가상 데이터 문구 | +| `SHOW_USE_CASES` | 랜딩 Use Cases 섹션, 헤더 Use Cases | 병원 동의를 받은 비식별 사례 | `src/data/useCases.ts` 에 사례 추가 (비어 있으면 섹션·메뉴가 나오지 않는다) | + +켜는 방법: 값을 `!DISCOVERY_SITE` 에서 `true` 로 바꾸고 커밋·배포한다. 값은 빌드 때 정해지는 상수라 꺼진 기능은 공개 번들에서 통째로 빠진다. + +## 공개 번들 검사 (배포 차단) + +공개 배포 빌드 끝에 `plugins/vite-plugin-public-bundle-guard.ts` 가 결과물 전체를 검사한다. 아래가 하나라도 있으면 빌드가 실패해 Vercel 배포가 진행되지 않는다. + +- 실제 병원명·도메인 (`plugins/public-bundle-denylist.json` 의 `clinics`) +- 비밀 키: Google API 키(AIza·AQ.), Supabase 주소·JWT (`secrets`) +- 실제 병원 파일: `reports/`, `assets/clients/` (`paths`) + +새 병원과 계약하거나 진단하면 `public-bundle-denylist.json` 에 이름·도메인을 추가한다. 실패 메시지에 어느 파일에서 무엇이 걸렸는지 나온다. + +## 켜기 전 확인 순서 + +1. 스위치를 켠 상태로 로컬 빌드: `VITE_SITE=discovery npx vite build` → 번들 검사 통과 확인 +2. 로컬 미리보기로 화면 확인 (`npx vite preview`, 루트가 아니라 해당 경로) +3. 헤더 메뉴가 빈 곳을 가리키지 않는지 확인 +4. 배포 후 라이브에서 같은 경로 확인 + +## 4단계: 실제 병원 리포트 (스위치로 열지 않음) + +`/discovery/:id`, `/actions/:id`, `/supporters/:id`, `/images/:id`, `/build/:id`, `/report/:id` 는 실제 병원 데이터를 보여 준다. +공개 배포에서 열려면 아래가 먼저 끝나야 한다. 스위치를 만들지 않은 이유다. + +1. 로그인(Supabase Auth)과 병원별 접근 권한 +2. 데이터베이스 익명 읽기 정리: `docs/security/2026-10-07_rls_anon_read_DRAFT.sql` (infinith-demo 화면 영향 확인 후 실행) +3. `src/lib/supabase.ts` 가 공개 번들에 들어가게 되므로 번들 검사 `secrets` 의 Supabase 항목을 어떻게 다룰지 결정 +4. 진단 신청 모달(`DiscoveryLeadModal.tsx`, 현재 미사용)은 신청마다 자동 빌드 큐(`supporter_builds`)에 넣는다. 공개 폼에 다시 붙이려면 사람 승인 단계를 먼저 둔다.