# Flower API Leak

> Checks Flower UI hide vs qa-api network leakage (IDs, names, forbidden resources). Use when the user says API 누수, 네트워크 검증, UI만 숨김, 응답 필드 노출, or permission UI pass but data might still leak.

- Skill: `yol-mu/flower-api-leak` (Agent Skill)
- Install (CLI): `npx skillmds@latest add yol-mu/flower-api-leak`
- Raw SKILL.md: https://api.skillmd.com/api/skills/yol-mu/flower-api-leak/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Integrations & APIs
- Author: yol-mu (https://skillmd.com/u/yol-mu)
- Updated: 2026-09-22
- Page: https://skillmd.com/skills/yol-mu/flower-api-leak

---


# Flower API Leak Check

UI에서 숨기거나 비활성인 정보가 **`/qa-api/v1/...` 응답에 그대로 오는지** 본다.
권한·CP 소유권·플랫폼 스코프 이슈에서 Critical로 자주 등장한다.

관련: [flower-authz-matrix](../flower-authz-matrix/SKILL.md) · CP feature-support test-plan

## 입력 패턴

```
API 누수 / 네트워크 검증
시나리오: (예: CP로 로그인 후 Placements·심사 화면)
숨겨야 할 것: Platform 소유 ID/이름 | 타 조직 리소스 | Device 미제공 필드 …
```

## QA API 베이스 (탐색 기준)

- 브라우저 동일 오리진: `https://flower-qa-campaign-web.anypoint.tv/qa-api/v1/...`  
- 메뉴별 화면은 [menu-map.md](../flower-menu-smoke/references/menu-map.md) — **한 기능만이 아니라** 권한 민감 화면 전부 후보:
  - System: `/system/orgs`, `/system/users`
  - Resources: content / placements / stb / cdn
  - Settings: platform properties, advertisers, DMP segments
  - Reviews: `participantId` 스코프
  - Analytics / Demand performance / Revenue / Monetization
- 자주 보는 호출:  
  - `GET /qa-api/v1/validate-token`  
  - `GET /qa-api/v1/platforms/{platformId}`  
  - `GET /qa-api/v1/placements?platformId=...&pageSize=999999...`  
  - `GET /qa-api/v1/participants/participant-search-tags?orgType=...`  
  - `GET /qa-api/v1/analytics/ad-requests/...`  
  - `GET /qa-api/v1/analytics/ads/dashboards` (Monitoring — 500 관측됨, 응답 형태도 확인)

운영/다른 테마는 엔드포인트 prefix가 다를 수 있음 → 실제 요청 URL을 기록.

## Workflow

1. **숨김 기대 정의**  
   - UI: 어떤 라벨/컬럼/메뉴가 없어야 하는지  
   - API: 어떤 필드·ID·목록이 응답에 없어야(또는 403이어야) 하는지  
   - 설계에 없으면 **확인 필요** — 추측으로 Fail 단정 금지. 단, “UI에 없는 타 조직 PII/이름이 응답에 있음”은 기본적으로 Fail 후보

2. **재현 전 network 버퍼 클리어**  
   - Playwright로 해당 화면 진입·필터 변경·탭 전환을 수행  
   - `browser_network_requests` (또는 동등)로 `qa-api` 만 필터

3. **요청 목록 점검**  
   - 4xx/5xx, 예상 밖 200, **동일 API 중복**  
   - `pageSize=999999` 등 과도한 목록 pull이 권한 없는 데이터까지 오는지

4. **응답 바디 스팟**  
   - 핵심 요청을 열어 ID·name·orgType·platformId·placement 등 검사  
   - UI에 안 보이는 **Platform 소유 리소스명/ID**, 타 CP 광고영역, 미제공 dimension 값이 있으면 기록  
   - Ad requests: 플랫폼 스위치 후 summary/time-series가 **이전 platformId**로 호출되지 않는지

5. **URL 직접 진입과 짝**  
   - 메뉴 숨김 대상 URL 진입 시 API가 200으로 전체 데이터 주면 Fail 후보  
   - UI empty인데 API 200+데이터면 “표시만 막음”으로 보고

6. **결과**

| 판정 | 조건 |
|------|------|
| Pass | 숨김 대상이 UI·API 모두 부재 또는 명시적 403/빈 스코프 |
| Fail | UI 숨김인데 응답에 민감·스코프 밖 필드/목록 |
| Blocked | 설계 미확정으로 허용 필드 범위를 알 수 없음 |

7. 증거: 요청 URL + 상태코드 + 문제 필드 경로(값은 필요 최소만) + 스크린샷  
   → 버그 시 [bug-report](../bug-report/SKILL.md)

## 체크리스트 (짧게)

- [ ] 플랫폼 전환 후 API `platformId` 일치  
- [ ] CP/비대상 역할: 메뉴 없이도 list/detail API 200 전체 조회 여부  
- [ ] UI `-` / 숨김 지표가 API에 숫자로 오는지 (Geography Imp 등)  
- [ ] 콘솔·Sentry와 별개로 **인가 누수**만 판정 (sentry envelope 200은 무시)

## 탐색에서 본 함정

- Sentry `flower-eye.anypoint.tv/.../envelope` 다수 → 누수 판정에서 제외  
- placements `pageSize=999999`는 정상 패턴일 수 있음 → **스코프 밖 항목 포함 여부**가 쟁점  
- Admin은 여러 플랫폼 태그를 볼 수 있음 → 역할 기대치를 먼저 고정

## 하지 말 것

- 토큰·비밀번호·응답 전문을 레포/스킬에 커밋  
- UI Pass만 보고 API 생략  
- 정적 JS/이미지 요청을 누수 Fail로 처리

