InfraGuard

공개 랜딩 · 데모 요청 · 방문자 분석 태그

로그인 없이 열리는 공개 표면(랜딩·데모 폼·사용 설명서)과 그 방문자를 측정하는 GA4/GTM 태그, 그리고 접수된 데모 요청을 처리하는 관리 화면을 다룹니다.

개요 — 무엇을 하나

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 자산이기 때문입니다. 문서에는 비밀·실데이터가 없습니다.

데모 요청 접수

공개 폼 (/demo)

원클릭 데모가 아니라 요청 접수입니다. 이름과 업무 이메일만 필수이며, 접수 시 로케일·유입 경로·IP 가 함께 기록됩니다.

이 폼은 이 앱의 유일한 게스트 쓰기 경로입니다. 그래서 방어를 4겹으로 둡니다.

  1. 허니팟 — 채워지면 저장하지 않고 성공처럼 응답합니다(탐지 사실을 알리지 않습니다).
  2. throttle:8,1 — 분당 8회 초과 시 429.
  3. CSRF 토큰.
  4. 서버 검증 + 화이트리스트 저장 — status·note 는 관리자 전용이라 공개 폼이 채울 수 없습니다.

관리 화면 (Administration ▸ 데모 요청)

/admin/demo-requests 에서 접수함을 운영합니다. 모달 CRUD + 검색 · 상태 필터(건수 표시) · 페이지네이션.

상태 뜻
new 접수됨(미처리)
contacted 연락함
qualified 검증됨(기회)
closed 종료

검색은 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자 분석 속성으로 보내면 랜딩페이지가 내세우는 자체 호스팅·데이터 주권 약속과 정면으로 모순되고, 고객 인프라 정보가 외부로 샙니다.

유입 키워드(검색어)는 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 미리보기를 렌더하지 않습니다).

권한

문제해결 · FAQ

관련 항목

공개 랜딩 페이지
공개 랜딩 페이지