1. Column-level Security (컬럼 단위 보안)
컬럼에 Masking Policy를 적용하는 기능. 두 가지 하위 기능 포함:
- Dynamic Data Masking (동적 데이터 마스킹)
- External Tokenization (외부 토큰화)
2. Dynamic Data Masking (DDM)
핵심 개념
- plain text(평문) 데이터를 Snowflake에 로드 → 쿼리 시점(query runtime)에 동적으로 마스킹
- 원본 데이터는 그대로 유지(at rest 변경 X), 전송 중(in transit)에만 마스킹
- 권한 없는 사용자/역할만 마스킹된 데이터를 봄
동작 흐름 (강의 슬라이드)
Authorized 사용자 → SELECT → Table/View(+Policy) → Unmasked 결과
3. Masking Policy 작성
기본 구조
CREATE MASKING POLICY EMAIL_MASK AS (VAL STRING) RETURNS STRING ->
CASE
WHEN CURRENT_ROLE() IN ('SUPPORT') THEN VAL
ELSE '*******'
END;
⚠️ RETURNS 데이터 타입 = 첫 입력 컬럼 데이터 타입과 반드시 일치해야 함
마스킹 유형별 예시
| 유형 | 표현식 예시 |
|---|
| Unmasked (원본) | THEN VAL |
| Partially Masked (부분 마스킹) | REGEXP_REPLACE(VAL, '.+\@', '*****@') |
| System Functions (시스템 함수) | SHA2(VAL) |
| User Defined Functions (UDF) | MASK_UDF(VAL) |
| Semi-structured (반정형) | OBJECT_INSERT(VAL, 'USER_EMAIL', '*', TRUE) |
| Fully Masked (완전 마스킹) | '*******' |
정책 적용
ALTER TABLE IF EXISTS EMP_INFO
MODIFY COLUMN USER_EMAIL SET MASKING POLICY EMAIL_MASK;
4. Masking Policy 핵심 특징 ⭐
- Schema-level object (테이블·뷰처럼 스키마 레벨 객체)
- 객체 소유자와 독립적으로 생성·적용 가능 (보안/개인정보 담당자가 결정 → Segregation of Duties)
- Nesting(중첩) 가능: 해당 테이블을 참조하는 뷰에도 적용
- SQL문에서 컬럼이 어디서 참조되든 항상 적용됨 (query runtime, 모든 위치)
- 객체 생성 시점 또는 생성 이후 모두 적용 가능
- "정책 한 번 작성 → 수천 개 컬럼에 적용" 가능 (공식 문서 benefit)
5. External Tokenization (외부 토큰화)
핵심 개념
- 토큰화된(tokenized) 데이터를 Snowflake에 로드
- 쿼리 시점에 권한 있는 사용자에게 detokenize(역토큰화)
- External Function을 호출하는 Masking Policy 사용 → 외부 토큰화 서비스(REST API) 연동
동작 흐름 (강의 슬라이드 Image 5)
Table/View(+Policy) → External Function
→ (Tokenized) → External Tokenization Service (REST API)
→ (Detokenized) → 권한 사용자 결과
DDM과의 차이점 ⭐
- 토큰화는 데이터 로드 전 에 수행 (DDM은 평문 로드)
- Masking Policy 구조는 동일하나 External Function 필수 (공식 문서 확인)
6. Row Access Policies (행 접근 정책)
핵심 개념
- 보안팀이 쿼리 결과에 반환되는 행(row)을 제한
- Authorized → 모든 행 반환(Rows unfiltered)
- Unauthorized → 행 필터링됨(Rows filtered)
정책 작성
CREATE OR REPLACE ROW ACCESS POLICY RAP_ID AS (ACC_ID VARCHAR) RETURNS BOOLEAN ->
CASE
WHEN 'ADMIN' = CURRENT_ROLE() THEN TRUE
ELSE FALSE
END;
RETURNS BOOLEAN (TRUE인 행만 반환)
정책 적용
ALTER TABLE ACCOUNTS ADD ROW ACCESS POLICY RAP_IT ON (ACC_ID);
7. Row Access vs Masking Policy ⭐⭐
공통점 (Similarities) — 강의 슬라이드
- Schema level object (스키마 레벨 객체)
- Segregation of duties (직무 분리)
- Creation and applying workflow (생성·적용 워크플로우)
- Nesting policies (정책 중첩)
⚠️ 핵심 규칙
- Row Access Policy가 Masking Policy보다 먼저 평가됨 (evaluated before)
- 같은 컬럼은 row access policy signature와 masking policy signature 양쪽에 동시 지정 불가
- 컬럼이 row access policy에서 참조되면, 그 컬럼에 masking policy 추가 시 실패
🎯 핵심 포인트
| 항목 | 핵심 |
|---|
| Masking Policy 레벨 | Schema-level object |
| DDM 마스킹 시점 | Query runtime (원본 변경 없음) |
| External Tokenization | 로드 전 토큰화 + External Function |
| Row Access Policy 반환타입 | BOOLEAN |
| 평가 순서 | Row Access → Masking |
| 같은 컬럼 중복 지정 | 불가 |