Tenant Console 권한 매트릭스 (역할 4종 × 기능)¶
역할 4종·인증 하이브리드는 ../adr/0025에서 확정됐고, 이 문서는 잔여였던 권한 매트릭스를 확정한다. 화면·메뉴 구조는 tenant-console.md가 SSOT.
결정 — 직무 분리 모델 (2026-07-22)¶
Tenant Admin 은 전권 superset 이 아니다. 검수 결정과 정책 변경은 Compliance Reviewer 전용이며 Admin 도 우회할 수 없다. "검수 없이 고객 노출 문구가 변경되는 경로가 존재하지 않는다"(../domain/state-machine.md)의 권한 계층 대응물 — 준법감시 직무 분리는 금융권 감사에서 통제권의 근거가 된다.
역할의 성격:
| 역할 | 성격 |
|---|---|
| Tenant Admin | 시스템 관리 — 사용자·연결·커버리지 설정 |
| Compliance Reviewer | 컴플라이언스 판단 — 검수 결정·정책 발행·문구 통제 |
| Operator | 운영 대응 — 이관·중단 등 노출 축소 방향의 즉시 조치 |
| Read Only | 열람 전용 |
원칙¶
- fail-closed — 매트릭스에 없는 기능은 거부가 기본이다. 새 기능은 행을 추가하며 역할을 명시적으로 부여받는다. 미인증 전 화면 차단(ADR-0025)과 같은 결.
- 조회는 기본 허용, 민감 정보만 예외 — 업무 화면 조회는 4역할 공통. 예외는 Users & Roles(계정·역할 정보)로, Tenant Admin 전용이다.
- Operator 의 쓰기는 노출 축소 방향만 — 이관(검수 요청)·제공 중단은 보수적 방향이라 신속 대응을 위해 허용하고, 노출을 만들거나 문구를 바꾸는 액션은 없다.
- 데모에서도 동일 적용 — 데모 자체 계정(ADR-0025)도 같은 역할 클레임으로 이 매트릭스를 그대로 따른다. 간소화를 이유로 우회 경로를 만들지 않는다.
매트릭스¶
TA = Tenant Admin, CR = Compliance Reviewer, OP = Operator, RO = Read Only.
| 메뉴 | 기능 | TA | CR | OP | RO |
|---|---|---|---|---|---|
| Dashboard | 현황·요약 조회 | ✓ | ✓ | ✓ | ✓ |
| Price Movement Explanations | 목록·상세 조회 | ✓ | ✓ | ✓ | ✓ |
| 최종 문구 수정 | – | ✓ | – | – | |
| 검수로 이관 | – | ✓ | ✓ | – | |
| 제공 중단 | – | ✓ | ✓ | – | |
| Review Queue | 대기 목록·상세 조회 | ✓ | ✓ | ✓ | ✓ |
| 검수 액션(임시 저장·승인·수정 후 승인·반려·차단) | – | ✓ | – | – | |
| Compliance Policy | 정책 조회(금칙어·룰 인스턴스·처리 기준·면책 문구·버전 이력) | ✓ | ✓ | ✓ | ✓ |
| 정책 변경(금칙어 등록·토글, 자동 제공 스위치·처리 기준, 면책 문구 = 새 버전 발행) | – | ✓ | – | – | |
| Settings — 제공 범위 | 조회 | ✓ | ✓ | ✓ | ✓ |
| 커버리지 변경(시장·채널 토글) | ✓ | – | – | – | |
| 이해상충 제외 변경(종목·섹터 토글) | – | ✓ | – | – | |
| Settings — Cloud Sync | 연결 상태·이력·인증서 조회 | ✓ | ✓ | ✓ | ✓ |
| 관리(인증서 교체·재연결) | ✓ | – | – | – | |
| Settings — Users & Roles | 사용자 조회·등록·비활성화·역할 부여 | ✓ | – | – | – |
- 제공 범위 변경을 두 행으로 나눈 이유: 성격이 다른 두 통제가 한 화면에 있다 —
시장·채널 토글은 시스템 커버리지 설정(TA), 종목·섹터 제외는 이해상충
컴플라이언스 통제(CR, ../adr/0023)다.
경계는
serving_scope.scope_type과 1:1 이다(MARKET·CHANNEL = TA, INSTRUMENT·SECTOR = CR) — TA 가 CR 의 이해상충 제외를 되돌릴 수 없다. - 최종 문구 수정이 CR 전용인 이유: 노출 문구에 관한 판단은 검수 경로이며(state-machine.md), Operator 의 쓰기는 노출 축소 방향으로 한정된다. Cloud Sync 관리(인증서 교체·재연결)는 노출 축소가 아닌 시스템 관리라 TA 전용이다.
- 역할 부여의 직무 분리 보강: TA 가 스스로에게 CR 을 부여해 검수·정책 권한을 얻는 우회를 막기 위해 자기 자신에 대한 역할 변경은 금지하고, 역할 부여·회수는 전건 콘솔 감사 로그(console_action_log)에 기록한다 — 타인 계정을 경유한 우회는 차단이 아니라 감사로 추적한다(이중 통제 워크플로는 MVP 범위 밖). 운영 SSO/AD 연동 시 역할의 원천(IdP 클레임 vs 콘솔 부여)은 ALPHA-118 설계에서 확정한다.
API 매핑¶
권한의 강제 지점은 API 다 — 화면의 버튼 숨김은 UX 이고, 콘솔
API(tenant-console-api)가 세션의 역할 클레임으로 아래 표를 강제한다(이중 방어).
강제 구현 = ConsoleAuthFilter(ALPHA-118): 미인증은 전 표면 401(fail-closed),
아래 표는 필터의 라우트 정책과 1:1 이며 엔드포인트 추가 시 표와 필터에 함께
행을 더한다. 표에 없는 표면은 인증돼도 403 거부가 기본이다(fail-closed).
| 엔드포인트 | 매트릭스 행 | 요구 역할 |
|---|---|---|
POST /api/v1/auth/login |
인증(로그인) | 공개 — 유일한 비인증 표면 |
POST /api/v1/auth/logout |
인증(로그아웃) | 인증된 전 역할 |
GET /api/v1/auth/session |
인증(세션 조회) | 인증된 전 역할 |
GET /api/v1/session · PATCH /api/v1/session/profile |
세션·프로필 조회·표시 이름 변경 (member 원장, ALPHA-500) | 인증된 전 역할 |
GET /api/v1/dashboard/traffic |
Dashboard 트래픽 KPI (24시간 요청·에러) | TA·CR·OP·RO |
GET /api/v1/explanations · GET /api/v1/explanations/{id} · GET /api/v1/explanations/feed-status · GET /api/v1/explanations/status-counts |
Price Movement Explanations 목록(페이지)·단건·수신 상태·상태별 건수 조회 (실전환 ALPHA-607, 페이지네이션·단건·집계 ALPHA-914) | TA·CR·OP·RO |
PATCH /api/v1/explanations/{id}/final |
최종 문구 정정(게시본 published_summary in-place, ALPHA-613) | CR |
POST /api/v1/explanations/{id}/stop · .../move-to-review |
노출 축소 조치(제공 중단 — 사유 필수 · 검수로 이관, ALPHA-613) | CR·OP |
GET /api/v1/review/items |
Review Queue 조회 | TA·CR·OP·RO |
GET /api/v1/review/items/{id} |
검수 상세(근거·사유·검사 결과·상태 이력 — 감사 열람, ALPHA-436) | TA·CR·OP·RO |
POST /api/v1/review/items/{id}/approve |
검수 액션 — 승인(선택 의견) | CR |
POST /api/v1/review/items/{id}/approve-edited |
검수 액션 — 수정 승인(edited_summary 필수) | CR |
POST /api/v1/review/items/{id}/reject |
검수 액션 — 반려(사유 필수) | CR |
POST /api/v1/review/items/{id}/block |
검수 액션 — 차단(사유 필수) | CR |
GET /api/v1/members |
Users & Roles 조회 | TA |
POST /api/v1/members |
사용자 등록 | TA |
POST /api/v1/members/{id}/deactivate |
사용자 비활성화 | TA |
PATCH /api/v1/members/{id}/role |
역할 부여·변경 | TA — 자기 자신 대상은 서비스가 403(직무 분리) |
GET /api/v1/screening/words · .../policy · .../disclaimer · .../versions |
정책 조회(금칙어·활성 정책 스냅샷[처리 기준+룰 인스턴스, ALPHA-762]·면책 문구·버전 이력) | TA·CR·OP·RO |
POST /api/v1/screening/words · POST .../words/{id}/toggle · PATCH .../criteria · PATCH .../disclaimer |
정책 변경(= 새 버전 발행, ALPHA-438) | CR |
GET /api/v1/scope/markets · GET /api/v1/scope/stocks |
제공 범위 조회 | TA·CR·OP·RO |
POST /api/v1/scope/markets/{market}/toggle |
커버리지 변경(시장 토글, ALPHA-606) | TA |
POST /api/v1/scope/stocks/{code}/toggle |
이해상충 제외 변경(종목 토글, ALPHA-606) | CR |
콘솔 mock 한시 예외 — 종결 (2026-07-29)¶
tenant-console-ui 화면 계약대로 mock 표면을 먼저 열고 인증만 강제(전 역할 허용) 하던 한시 예외(ALPHA-513, 2026-07-23 사용자 결정)는 도메인별 DB 전환으로 전부 해제됐다 — 사용자·세션=ALPHA-500, 정책=ALPHA-438, 제공 범위=ALPHA-606, explanations=ALPHA-607(읽기)·613(쓰기). 모든 표면이 위 "API 매핑" 표의 실 역할을 강제하고 실 원장을 읽고 쓴다.
explanations 쓰기(최종 문구 정정·검수 이관·제공 중단)도 원장 전이·행위자·감사로 실전환됐다(ALPHA-613) — ExplanationMockStore 삭제로 콘솔 mock 이 완전히 소멸했다 (잔여 seam 0). 화면·IA 에 없던 approve·reject·draft(ALPHA-513 잔재)는 표면째 제거됐다: 판정 게이트(승인·반려)는 Review Queue 소관이고 explanations 는 현황판+사후 운영에 한정된다(역할 분담, 사용자 결정 2026-07-29). 시장·등락률 컬럼 복원은 별건이다(ALPHA-497 materialization 후).
인증 방식은 하이브리드(ADR-0025): 데모 = 자체 계정(부트스트랩 시드, BCrypt), 운영 = SSO/AD(같은 세션 추상화로 수렴, 실계약 시점 구현). 의도적 생략(데모 범위): 로그인 레이트리밋·계정 잠금은 온프렘 내부망 전제의 데모 경로라 두지 않는다 — 운영 SSO 모드에서는 IdP 정책이 담당한다.
후속¶
- ALPHA-118(콘솔 인증) — 역할 클레임을 세션에 싣는 구현. SSO/AD 와 데모 자체 계정이 같은 클레임 형태로 수렴한다.
- ALPHA-119(Users & Roles) — 사용자 등록 API 구현됨. 역할 부여·변경 API 는 ALPHA-499(자기 자신 변경 403·전건 감사), 화면 실데이터 전환(역할 변경 UI·세션 실전환)은 ALPHA-500 으로 구현 완료. 이 매트릭스의 Users & Roles 행이 요구 권한이다.