tiomta → crowny-branding 전환추적 파라미터 연동
개요
마케팅 OS 퍼널 5단계(노출→멈춤·시청→댓글읽기→댓글작성→전환) 중 "전환" 단계 실데이터 공급을 위해
tiomta.com(자사 랜딩)에서 branding.crowny.org(:9630)로 UTM/전환 이벤트를 전송하는 파이프라인을 구현.
무엇을 했는지
수신측 — /Users/ef/crowny-brand/서버.한선 (순수 한선씨, 확장)
POST /api/track: event/source 필수(누락 시 400), utm_/ref/path/ts 수집 → data/전환.psv append.
GET /api/track/summary: 부팅 1회 로드 + append 시 증분 인메모리 캐시(맵+키목록)로 total/byEvent/byUtmSource/bySource 집계 응답(요청마다 PSV 재파싱 금지 — 장수서버 OOM 가드레일 준수).
- CORS 화이트리스트(tiomta.com/www/127.0.0.1:9878) + OPTIONS 프리플라이트 204(신규), 상태코드 매핑표에 204 추가.
- 버그 발견+수리: WKWebView(NSURLSession) 등 일부 클라이언트가 HTTP 헤더와 본문을 별도 TCP 쓰기로 분리 전송 → 기존 단일
TCP읽기(fd,16384)로는 본문 유실(Content-Length는 있는데 실제 본문 0바이트). 메인 accept 루프에 Content-Length 기반 추가 읽기(상한 5회)를 넣어 수정.
발신측 — tiomta
- 신규
public/js/crowny-track.js(독립, 기존 파일 무수정): utm 파싱+localStorage(crowny_utm_v1) 첫방문 보존+sendBeacon(폴백 fetch keepalive)+window.CrownyTrack.conversion(name) 전역 API.
- 동반
public/js/크라우니추적.한선(같은 로직 순수 재현, 컴파일+셀프테스트 ALL_PASS).
public/index.html 끝에 스크립트 태그 1줄 추가(요청대로) — 단, 실제 라이브 루트("/")는 index.html이 아니라 public/shell/app-shell.html을 서빙(server.js:2723 reqPath === '/' → 'shell/app-shell.html')하는 것을 검증 중 발견. index.html만 수정하면 실사용자에게 절대 도달하지 않으므로, 동일한 스크립트 태그 1줄을 public/shell/app-shell.html에도 백업 후 추가(범위 확장, 보고에 명시).
실측 검증
- 컴파일: 서버.한선/크라우니추적.한선 모두 경고 0.
- track POST/summary/400/204/PSV/기존 라우트 회귀(index 200 155273, support 200 69150, 404) 전부 curl 실측 PASS.
- tiomta root 200(33473, 스크립트 1줄분 증가) / crowny-track.js 200 — 회귀 PASS.
잔여 이슈 (미해결 — 완료 아님)
- CSP connect-src 차단으로 실사용자 브라우저에서 전송 실패: server.js:2552
Content-Security-Policy: connect-src 'self' https://crowny.org — branding.crowny.org(및 로컬 127.0.0.1:9630)는 허용 목록 밖이라 sendBeacon/fetch가 브라우저에서 조용히 차단됨(콘솔에도 안 잡힘). CrownyAI 헤드리스 검증기(WKWebView)로 실제 라이브 루트("/")에 대해 E2E 재현 시 api/track/summary 카운트 증가 없음 — 이 파이프라인은 현재 상태로는 실사용자 트래픽에서 작동하지 않는다.
- 해결에는 server.js CSP connect-src에
https://branding.crowny.org(또는 프록시 경유로 crowny.org 서브패스화) 추가가 필요하나, tiomta server.js는 "3서비스 공용/라이브, 수정 금지" 대상으로 지정되어 있어 이번 작업 범위에서 변경하지 않음. 사용자 승인 필요.
- CORS 화이트리스트도 마찬가지로 branding.crowny.org 실배포 도메인 접근 시 CSP가 먼저 막으므로 CORS 통과 여부와 무관하게 무의미.
관련 파일
- /Users/ef/crowny-brand/서버.한선, /Users/ef/crowny-brand/서버.toau
- /Users/ef/crowny-tiomta/public/js/crowny-track.js
- /Users/ef/crowny-tiomta/public/js/크라우니추적.한선
- /Users/ef/crowny-tiomta/public/index.html (백업: /tmp/tiomta-index.html.bak-)
- /Users/ef/crowny-tiomta/public/shell/app-shell.html (백업: /tmp/tiomta-app-shell.html.bak-*)
- /Users/ef/crowny-brand/data/전환.psv