개요 — 무엇을 하나
InfraGuard 는 로그인 뒤 콘솔 말고도 공개 표면을 가집니다.
| 경로 | 화면 | 접근 |
|---|---|---|
/ |
마케팅 랜딩 | 게스트(로그인 세션이면 /console 로 리다이렉트) |
/demo |
데모 요청 폼 | 게스트 |
/manual |
사용 설명서 | 게스트 + 로그인 공용 |
/login · /lang/{locale} |
로그인 · 언어 전환 | 게스트 |
콘솔 홈은 /console 입니다. 라우트 이름(overview)과 북마크를 깨지 않으면서 / 를 공개 표면에 내주기 위한 배치입니다.
랜딩은 콘솔과 별개 번들(front.*)로 굽습니다. 랜딩을 콘솔 번들에 얹으면 방문자가 Vue·ECharts·CodeMirror·Konva·xterm 을 통째로 내려받습니다(실측 콘솔 약 1,283KB vs front 약 24KB). 마케팅 페이지의 첫인상은 곧 로딩 속도입니다. 양쪽이 공유해야 하는 최소 UI(아이콘 버튼·언어 스위처)만
_shared-ui로 빼서 같은 정의를 씁니다 — 복붙하면 한쪽만 고쳐져 갈라집니다.
공개 사용 설명서
/manual 은 로그인 없이 열립니다. 도입 검토자가 "무엇을 어떻게 운영하는지"를 미리 읽을 수 있어야 하고, 공개 문서는 그 자체가 마케팅·SEO 자산이기 때문입니다. 문서에는 비밀·실데이터가 없습니다.
- 한 URL, 두 껍데기 — 게스트는 공개 랜딩 셸(헤더/푸터/언어 스위처)로, 로그인 사용자는 콘솔 셸로 같은 본문을 봅니다. 본문 뷰와 페이지 모듈은 공용이라 두 화면이 갈라지지 않습니다.
- 게스트에게는 설명서 전용 소번들(
manual.*)만 추가로 내려갑니다. 콘솔 번들은 실리지 않습니다. - 상위 등급 기능 문서도 숨기지 않고 잠금 배지로 표시합니다. 게스트는 레벨 1로 간주됩니다.
- 랜딩 히어로의 [사용 설명서] CTA 와 상단 내비게이션에서 진입합니다.
데모 요청 접수
공개 폼 (/demo)
원클릭 데모가 아니라 요청 접수입니다. 이름과 업무 이메일만 필수이며, 접수 시 로케일·유입 경로·IP 가 함께 기록됩니다.
이 폼은 이 앱의 유일한 게스트 쓰기 경로입니다. 그래서 방어를 4겹으로 둡니다.
- 허니팟 — 채워지면 저장하지 않고 성공처럼 응답합니다(탐지 사실을 알리지 않습니다).
throttle:8,1— 분당 8회 초과 시 429.- CSRF 토큰.
- 서버 검증 + 화이트리스트 저장 —
status·note는 관리자 전용이라 공개 폼이 채울 수 없습니다.
관리 화면 (Administration ▸ 데모 요청)
/admin/demo-requests 에서 접수함을 운영합니다. 모달 CRUD + 검색 · 상태 필터(건수 표시) · 페이지네이션.
| 상태 | 뜻 |
|---|---|
new |
접수됨(미처리) |
contacted |
연락함 |
qualified |
검증됨(기회) |
closed |
종료 |
- 행에서 상태를 인라인으로 바꾸거나 모달에서 담당자 내부 메모(
note)를 남깁니다. - 접수 맥락(IP·로케일·유입 경로·시각)은 읽기 전용으로 표시됩니다.
- 상태 건수(facets)는 필터와 무관하게 전체를 셉니다 — "미처리 몇 건"이 필터를 걸었다고 사라지면 안 되기 때문입니다.
검색은 LIKE 와일드카드(
%·_·\)를 이스케이프합니다. 안 하면 사용자가%만 입력해도 전건이 걸립니다.
방문자 분석 태그 (GA4 · GTM · Search Console)
.env 에 측정 ID 를 넣으면 공개 표면에만 태그가 붙습니다. 값이 비면 <script> 자체를 렌더하지 않으므로 기본 배포는 외부 요청 0 입니다.
| 키 | 값 | 용도 |
|---|---|---|
GA_MEASUREMENT_ID |
G-XXXXXXXXXX |
gtag.js (GA4) |
GTM_CONTAINER_ID |
GTM-XXXXXXX |
Google Tag Manager(병용 가능) |
GOOGLE_SITE_VERIFICATION |
meta 토큰 | Search Console 소유 확인 |
GA_PRODUCTION_ONLY |
true(기본) |
운영 환경에서만 발화 |
콘솔(
layouts/app)에는 절대 넣지 않습니다. 콘솔 URL·제목에는 호스트명·IP·인스턴스 alias·인시던트 제목이 실립니다. 이걸 제3자 분석 속성으로 보내면 랜딩페이지가 내세우는 자체 호스팅·데이터 주권 약속과 정면으로 모순되고, 고객 인프라 정보가 외부로 샙니다.
- ID 는 형식 검증 후에만 출력합니다(
G-…/GTM-…정규식). 오타나 따옴표가 섞인 값은 깨진 태그가 아니라 "분석 없음" 으로 떨어집니다. GA_PRODUCTION_ONLY는 기본true— 로컬·스테이징 트래픽이 속성을 오염시키면 사후 정리가 불가능합니다. GA4 수치를 못 믿게 되는 가장 흔한 원인입니다.- 전환은 제출이 아니라 접수 완료 화면에서 발화합니다. 제출 시점에 보내면 검증 실패·허니팟까지 전환으로 세어 수치가 부풀려집니다.
- CTA 는 위치별(
hero·header·footer_cta·footer_nav·hero_manual)로 구분해 기여도를 나눕니다. gtag가 없으면 JS 는 전부 no-op 입니다 — 분석 실패가 UI 를 막지 않습니다.
유입 키워드(검색어)는 GA4 가 주지 않습니다. GA4 는 채널(organic search)까지만 알려주고, 질의어는 Search Console 에만 있습니다. 그래서 소유 확인 meta 는 GA4 와 독립적으로 출력합니다(GA4 를 안 켜도 소유 확인은 됩니다). 사이트별 리포트 조회는 방문자·검색 유입 분석 참조.
카피 원칙
랜딩의 신뢰 지표는 코드에서 셀 수 있는 것만 쓰고, 하드코딩하지 않고 렌더할 때마다 셉니다(룰셋 수·점검 항목 수·메일/SMS 어댑터 수 등).
이 원칙이 실제로 오류를 잡았습니다 — 점검 항목이 37이 아니라 36이었습니다. 반대로 관측값은 쓰지 않습니다(예: 실제 시그니처 고유 수는 24시간 43 · 7일 67 · 전체 79 로 방문마다 달라져 오히려 신뢰를 잃습니다). 공개 페이지라 DB 는 건드리지 않습니다 — 매 방문 쿼리가 불필요하고, DB 가 흔들려도 마케팅 표면은 살아야 합니다.
데이터 소스
| 대상 | 위치 | 역할 |
|---|---|---|
infr_demo_request |
기본(000770) | 데모 요청 접수함(status·note·locale·source·ip) |
config/analytics.php ← .env |
설정 | 측정 ID·게이팅 SOT(App\Support\Analytics) |
public/brand/ |
정적 파일 | 로고·OG 이미지 |
public/brand/는 커밋 대상입니다.public/아래는 대부분 생성물이라(build·hot·storage가 gitignore) 빠뜨리기 쉬운데, 브랜드 에셋은 Vite 산출물이 아니어서 빌드가 만들어 주지 않습니다 — 커밋하지 않으면 서버에서 로고·OG 가 전부 404 다. OG 는 PNG 가 정답입니다(다수 SNS 크롤러가 SVG 미리보기를 렌더하지 않습니다).
권한
- 랜딩·데모 폼·설명서: 게스트 공개.
- Administration ▸ 데모 요청: 레벨 ≥ 10(self-gate) + 모든 변경
infr_audit_log기록.
문제해결 · FAQ
/가 콘솔로 넘어갑니다 — 정상입니다. 로그인 세션이면/console로 리다이렉트됩니다. 랜딩을 보려면 로그아웃하거나 시크릿 창으로 엽니다.- 태그가 안 붙습니다 — ID 가 비었거나 형식 검증에서 탈락했거나,
GA_PRODUCTION_ONLY=true인데 운영 환경이 아니다. 페이지 소스에서googletagmanager.com을 검색해 확인하세요. - GA4 에 데이터가 안 쌓입니다 — 태그의 측정 ID 와 조회하려는 속성이 일치하는지 확인하세요(GA4 관리 ▸ 데이터 스트림). 다른 속성에 쌓이면 리포트는 영원히 0 입니다.
- 데모 요청이 저장되지 않습니다 — 허니팟에 걸리면 성공 응답이지만 저장되지 않습니다(의도된 동작). 검증 실패나 분당 8회 초과(429)도 확인하세요.
- 언어 스위처에 8종이 뜨는데 번역은 한/영뿐 — 나머지는 영어로 폴백합니다. 미번역 로케일의 실제 수요는 분석의
language파라미터로 관측합니다. - 첫 배포 후 500 — Docker 는 nginx 가 vite 빌드 완료를 기다리도록 배선돼 있어야 합니다. 공개 랜딩이
/이므로 크롤러·잠재고객이 첫 화면으로 500 을 보게 됩니다.
관련 항목
- 방문자·검색 유입 분석 — 수집한 데이터를 사이트별로 읽는 쪽
- Service ▸ Web — 등록 웹사이트 관제
- 언어 · 지역화 — 로케일 전환과 번역 팩
- Admin ▸ 감사 로그 — 데모 요청 처리 이력
