권한별 접근 비교
Admin, Analyst, Viewer 세 역할이 동일한 페이지에 접속했을 때 데이터와 기능이 어떻게 달라지는지 비교합니다.

사전 준비
- 샘플 데이터가 적재되어 있어야 합니다
- Keycloak에 admin, analyst, viewer 계정이 설정되어 있어야 합니다
- DataGrant 및 AccessPolicy가 부여되어 있어야 합니다
역할 개요
| 항목 | Admin | Analyst | Viewer |
|---|---|---|---|
| 카탈로그 가시성 | 전체 (바이패스) | DataGrant 기반 | DataGrant 기반 |
| SQL 실행 | 전체 | Row Filter + Column Mask 적용 | 불가 |
| ⚙ 관리 콘솔 | 전체 (PII, 정책, 비용, 감사 등 5그룹) | 없음 | 없음 |
| 데이터 수정 | 가능 | 제한적 | 불가 |
| AI 보안 등급 | TOP_SECRET (gend-llm-internal) | CONFIDENTIAL (gend-llm-confidential) | PUBLIC (gend-llm-external) |
1. 카탈로그 페이지 비교
Admin이 보는 카탈로그
Admin은 모든 카탈로그가 표시됩니다 (deny-by-default 바이패스):
├── iceberg
│ └── card (transactions, merchants, products, fraud_labels)
├── nessie
│ └── streaming (orders)
├── sourcedb
│ └── public (customers, accounts, credit_assessments)
├── card_crm
│ └── public (consultations, customer_segments, marketing_consents)
├── card_log
│ └── public (app_events)
├── system (Trino 내부)
├── tpch (벤치마크)
└── tpcds (벤치마크)
Analyst가 보는 카탈로그
Analyst는 DataGrant가 부여된 카탈로그만 표시됩니다:
├── iceberg
│ └── card (transactions, merchants, products)
└── sourcedb
└── public (customers, accounts)
fraud_labels는 admin 전용 접근이므로 analyst에게는 표시되지 않습니다.
Viewer가 보는 카탈로그
Viewer는 가장 제한적인 접근 권한을 가집니다:
└── iceberg
└── card (transactions)
2. SQL 에디터 비교
동일한 쿼리, 다른 결과
세 역할 모두 다음 쿼리를 실행합니다:
SELECT customer_id, name, phone, amount, channel
FROM sourcedb.public.customers c
JOIN iceberg.card.transactions t ON c.customer_id = t.customer_id
LIMIT 5;

Admin 결과 (원본 데이터)
| customer_id | name | phone | amount | channel |
|---|---|---|---|---|
| C001 | 김철수 | 010-1234-5678 | 150,000 | online |
| C002 | 이영희 | 010-9876-5432 | 85,000 | offline |
Analyst 결과 (Column Mask 적용)
| customer_id | name | phone | amount | channel |
|---|---|---|---|---|
| C001 | a3f2b1... | 010-****-5678 | 150,000 | online |
| C002 | b7e4c3... | 010-****-5432 | 85,000 | offline |
name: 해시 마스킹 → 원본 식별 불가phone: 부분 마스킹 → 중간 4자리 숨김
Viewer 결과
Error: 쿼리 실행 권한이 없습니다. Viewer 역할은 읽기 전용입니다.
Viewer는 SQL 에디터에서 쿼리를 실행할 수 없습니다. 대신 저장된 쿼리 결과나 대시보드를 통해 사전 집계된 데이터만 조회할 수 있습니다.
3. Row Filter 적용 비교
Admin — 전체 데이터
SELECT channel, COUNT(*) AS cnt
FROM iceberg.card.transactions
GROUP BY channel;
| channel | cnt |
|---|---|
| online | 350,000 |
| offline | 400,000 |
| mobile | 250,000 |
Analyst — Row Filter 적용
Analyst에게는 channel IN ('online', 'mobile') Row Filter가 적용됩니다:
-- 원본 SQL
SELECT channel, COUNT(*) FROM iceberg.card.transactions GROUP BY channel;
-- Row Filter 적용 후 (내부 변환)
SELECT channel, COUNT(*) FROM (
SELECT * FROM iceberg.card.transactions
) __policy_filtered
WHERE (channel IN ('online', 'mobile'))
GROUP BY channel;
| channel | cnt |
|---|---|
| online | 350,000 |
| mobile | 250,000 |
offline 채널 거래는 Row Filter에 의해 자동으로 제외됩니다. Analyst는 자신의 쿼리 결과가 필터링되었음을 인식하지 못할 수 있습니다.
4. 사이드바 메뉴 비교

Admin 사이드바
GenD 사이드바는 워크스페이스 평면(모든 사용자 공통)과 관리 콘솔 평면(admin 전용, 사이드바 하단 ⚙ 드릴인) 두 층입니다:
공통 핀
홈 · 카탈로그 · SQL 편집기 · AI 어시스턴트(드로어)
· JDBC 연결 가이드 · MCP 도구 마켓플레이스
데이터 엔지니어링
├── 데이터 가져오기
├── 학습 데이터셋
├── DB 연결
├── 파일·문서 수집
├── 파이프라인 모니터링
├── 파이프라인 스튜디오
└── 데이터 마트
ML 허브
└── 개요 · 데이터 & 피처 · 개발 · 모델 · 배포 & 서빙 · 모니터링
인텔리전스
└── 시세 (참조 데이터·기업·공시·뉴스·토픽·AI 인사이트는 준비 중)
지식 & 시맨틱
├── 온톨로지
├── 용어 사전
└── 스키마 그래프
데이터 관측
├── 데이터 리니지
├── 스키마 변경
├── 스키마 동기화
├── 벡터 인덱스
└── 타임 트래블
거버넌스
├── 데이터 품질
└── 데이터 액세스 (요청 / 검토 / 부여된 권한 탭)
───────────────
⚙ 관리 콘솔 (admin 전용 — 사이드바 하단 드릴인)
├── 접근 제어 & 보안 — 접근 정책 · 보안 등급 · 모델 접근
│ · PII 관리 · 데이터 보존 · 컴플라이언스
├── 운영 & 모니터링 — 비용 대시보드 · 감사 로그 · 드리프트 모니터링
├── 데이터플레인 설정 — CDC 커넥터 · 공용 수집기 (관리형)
├── AI & MCP 플랫폼 — AI 모델 제공자 · 바인딩 · 사용량
│ · ML 플러그인 · MCP 게이트웨이 · MCP 도구
└── 테넌트 & 사용자 — 사용자 관리 · 서비스 클라이언트
· 워크스페이스 관리 · 워크스페이스 격리
Analyst 사이드바
사이드바 하단의 ⚙ 관리 콘솔 진입이 표시되지 않습니다. 워크스페이스 평면 기능은 동일하게 접근 가능하며, 데이터 액세스는 요청 탭만 사용할 수 있습니다(검토/부여된 권한 탭은 admin 전용).
Viewer 사이드바
SQL 편집기, 커넥터, 파이프라인, 데이터 마트 등 쓰기 기능이 제한됩니다.
5. DataGrant 관리 (Admin 전용)

Admin만 접근 가능한 사이드바 → 거버넌스 → 데이터 액세스의 부여된 권한 탭(/governance/access?tab=grants)에서 각 역할/그룹에 대한 DataGrant를 관리합니다.
권한 부여 다이얼로그

+ 권한 부여 버튼을 클릭하여 새로운 DataGrant를 생성합니다:
| 필드 | 설명 |
|---|---|
| 대상 유형 | ROLE, GROUP, USER |
| 대상 이름 | 역할명, 그룹 경로(/marketing), 사용자명 |
| 객체 유형 | CATALOG, SCHEMA, TABLE |
| 권한 | USE, SELECT, INSERT, ALL |
| 카탈로그 | 대상 카탈로그명 |
6. AccessPolicy 관리 (Admin 전용)

Admin만 접근 가능한 사이드바 하단 ⚙ 관리 콘솔 → 접근 제어 & 보안 → 접근 정책 페이지에서 Row Filter와 Column Mask를 설정합니다.
현재 적용 중인 정책 예시
| 정책명 | 유형 | 대상 | 효과 |
|---|---|---|---|
| analyst_mask_ssn | Column Mask | analyst → customers.resident_number | '***-**-****' |
| analyst_mask_phone | Column Mask | analyst → customers.phone | 010-****-XXXX |
| mkt_region_filter | Row Filter | analyst → transactions | 온라인/모바일만 |
| viewer_mask_amount | Column Mask | viewer → transactions.amount | 10만원 이상 절삭 |
7. AI 보안 등급 비교
AI 채팅에서 같은 질문을 해도, 역할에 따라 AI가 접근할 수 있는 데이터 범위가 다릅니다:
| 등급 | 역할 | AI가 참조 가능한 데이터 |
|---|---|---|
| TOP_SECRET | admin (gend-llm-internal) | 모든 테이블, PII 원본 포함 |
| CONFIDENTIAL | analyst (gend-llm-confidential) | 고객 거래 데이터, PII 마스킹 |
| PUBLIC | viewer (gend-llm-external) | 집계 데이터, 공개 메트릭만 |
대화 예시: "고객 연락처 보여줘"
- Admin: 원본 전화번호와 이메일이 표시됨
- Analyst:
010-****-5678형태로 마스킹된 결과 - Viewer: "해당 데이터에 대한 접근 권한이 없습니다" 응답
요약 비교표
| 기능 | Admin | Analyst | Viewer |
|---|---|---|---|
| 카탈로그 | 전체 8개 | Grant된 2~3개 | Grant된 1~2개 |
| SQL 실행 | 원본 데이터 | Row Filter + Column Mask | 불가 |
| AI 질의 | TOP_SECRET | CONFIDENTIAL | PUBLIC |
| ⚙ 관리 콘솔 | 5그룹 전체 | 없음 | 없음 |
| 데이터 수정 | CRUD 전체 | INSERT 가능 | 읽기만 |
| 정책 관리 | 생성/삭제 | 조회만 | 없음 |