---
title: "WS-I 크롬 확장 완료 (PR #11) — center.balerion.cloud iframe 오버레이 + 셀렉터 폴백 + frame-ancestors"
from: claude-code
to: ["jadong"]
project: "callcenter-os"
date: 2026-07-05T23:54:00.605395+09:00
status: sent
type: report
---

# WS-I 크롬 확장 완료 — center.balerion.cloud iframe 오버레이

**PR #11** (OPEN·MERGEABLE, 머지는 PM) · 브랜치 `feat/ws-i-extension` · 2026-07-05

## BLUF
키퍼 어드민 등 폐쇄 외부 전산 위에 콕핏(`center.balerion.cloud/app`)을 **iframe 오버레이**로 얹는 MV3 크롬 확장 신규. DC 원형을 계승하되 **셀렉터 실패 폴백**과 **frame-ancestors 프레이밍 정책**을 추가해 실전 취약점을 제거.

## DC 원형 대비 개선 (핵심)
- **신뢰성 역전** — 우하단 FAB를 즉시·무조건 마운트 → 사이드바 주입 실패해도 항상 기동. (원형은 주입 성공 시에만 진입점 → 해시 깨지면 조용히 죽음)
- **셀렉터 다중전략** — `nav[class*=sc-]` / `aside nav ul` / `[role=navigation]` 폴백 → `sc-aa3c1307` 정확 해시 의존 제거 (ADR-001 line 77 실현)
- **오버레이 드로어** — host `<main>` 스왑 대신 host 무관 고정 오버레이
- **설정/확장** — chrome.storage 옵션(기본 center.balerion.cloud/app/, 테넌트 경로), 툴바 activeTab 원클릭, 추가 도메인 동적 등록

## 프레이밍 정책 (frame-ancestors)
`deploy/Caddyfile`(WS-C 소유)에 `frame-ancestors 'self' https://admin.keeperplatform.com chrome-extension:` append + `-X-Frame-Options`. **전면개방 금지** — 키퍼 어드민 + 확장 컨텍스트만. WS-C 재배포 후 발효.

## 검증 (증거 기반)
| 항목 | 결과 |
|------|------|
| 확장 주입/폴백 (jsdom) | 13/13 |
| 콕핏 screenHash | 9/9 |
| 프론트 회귀 | 84 (기존 75 유지) |
| 백엔드 회귀 | 134 |
| 콕핏 build | OK |
| 실브라우저 (Playwright 독립 Chromium) | 사이드바+FAB 주입 / 폴백(FAB only) / 라이브 콕핏 iframe 실로드(title="다이렉트마켓 콜센터") / 탭→#screen 갱신 |

## PM 확인 / 미배포 주의
- Caddyfile frame-ancestors는 **WS-C 재배포해야 실적용**. 테넌트 도메인 추가 시 allowlist 확장.
- `cockpit/src/App.tsx` 해시 수신 1블록 append (F/G의 Console.tsx 접촉과 무관).
- 확장 테스트는 콕핏 build 오염 회피 위해 `extension/` 자체 vitest(`cd extension && npm test`)로 분리.
- 스토어 배포 비범위(개발자 모드 로드 — `extension/README.md`). DC 레포 무수정.
