데이터를 지키는 법: 데이터 마스킹 심층 탐구
Nishant Sharma
2025년 9월 5일
서론
데이터 프라이버시가 무엇보다 중요한 시대에, 민감한 정보를 보호하는 것은 더 이상 단순한 권장사항이 아니라 필수입니다. GDPR, HIPAA 같은 규제 프레임워크는 **개인 식별 정보(PII)**에 대해 엄격한 통제를 요구합니다. 여기서 데이터베이스 관리자의 핵심 도구 중 하나가 바로 **데이터 마스킹(data masking)**과 **데이터 리덕션(data redaction)**입니다.
데이터 마스킹이란?
Wikipedia에 따르면, 데이터 마스킹은 민감한 데이터를 소프트웨어와 권한 있는 사용자에게는 활용 가능하면서도 권한 없는 사용자에게는 거의 가치가 없게끔 수정하는 과정입니다. 핵심은 허구이지만 현실적인 데이터를 만드는 데 있습니다.
예를 들어, 실제 이름 'Amul Sul'
을 'Jeevan Chalke'
로 바꾸거나, 진짜 신용카드 번호를 겉보기에 유효해 보이는 가짜 번호로 대체하는 방식입니다. 이 과정에서 원본 데이터는 데이터베이스 내에서 영구적으로 변경됩니다.
반면, 데이터 리덕션은 데이터를 변경하지 않습니다. 특정 사용자에게 표시될 때만 일부를 가리거나 대체합니다. 예를 들어, 주민등록번호의 마지막 4자리만 보여주고 나머지는 숨기는 방식입니다.
구분 | 데이터 마스킹 | 데이터 리덕션 |
---|---|---|
DB 내 데이터 | 영구적으로 변경됨 | 원본 그대로 유지됨 |
데이터 현실성 | 허구이지만 그럴듯함 | 비현실적(예: xxx-xx-9567) |
목적 | 민감 데이터 보호 | 민감 데이터 보호 |
PostgreSQL Anonymizer (pg_anonymizer)의 힘
PostgreSQL Anonymizer는 PostgreSQL, EPAS, PGE에서 데이터를 마스킹하거나 대체할 수 있는 확장(extension)입니다.
특징은 **프라이버시 중심 설계(privacy by design)**로, PostgreSQL의 **DDL(Data Definition Language)**에 직접 마스킹 규칙을 포함할 수 있다는 점입니다.
지원하는 주요 방식은 다음과 같습니다:
- Anonymous Dumps:
pg_dump
를 통해 마스킹된 데이터를 SQL 파일로 내보내 백업이나 테스트 환경 생성에 활용 - Static Masking: 실제 DB 데이터를 영구적으로 바꿔 민감 정보를 인공값으로 대체
- Dynamic Masking: 특정 역할(role)만 데이터를 마스킹된 값으로 보게 하고, 다른 역할은 원본을 그대로 볼 수 있도록 설정 (데이터 리덕션의 한 형태)
- Masking Views: 마스킹된 데이터를 보여주는 뷰 생성
- Masking Data Wrappers: 외부 데이터 소스에도 FDW(Foreign Data Wrappers)로 마스킹 적용
제공되는 주요 마스킹 함수들
- Destruction: 데이터 영구 삭제
- Noise 추가: 데이터에 무작위 변동치 추가
- Randomization: 특정 범위 내 무작위 값 생성
- Faking: 이름, 주소 등 현실적인 가짜 데이터로 대체
- Advanced Faking: 더 복잡한 페이크 값 생성
- Pseudonymization: 가역적 가명으로 대체
- Hashing: 단방향 해시로 변환
- Partial Scrambling: 데이터 문자열 일부만 섞음
- Conditional Masking: 조건부로 마스킹 적용
- Generalization: 나이 → 나이 구간 등 범주화
- pg_catalog 활용: Postgres 내장 함수 사용
- Image Blurring: 이미지 블러 처리
- Custom Mask 작성: 직접 마스킹 함수 작성 가능
실습 예제: Dynamic vs Static Masking
Dynamic Masking
개발·교육 환경에서 유용하며, 사용자 역할(role)에 따라 다른 데이터를 보게 할 수 있습니다.
\connect edb edb
CREATE ROLE masked_user LOGIN;
SECURITY LABEL FOR anon ON ROLE masked_user IS 'MASKED';
GRANT pg_read_all_data TO masked_user;
다음 단계로, Dynamic Masking을 활성화하고 특정 컬럼에 마스킹 함수를 적용합니다. 여기서는 anon.fake_first_name() 함수를 사용합니다.
ALTER DATABASE edb SET anon.transparent_dynamic_masking TO true;
SECURITY LABEL FOR anon ON COLUMN test.name IS 'MASKED WITH FUNCTION anon.fake_first_name()';
- 일반 사용자 조회 결과
\connect edb edb
SELECT * FROM test;
name | phone
------+-------
ABCD | 12345
EFGH | 67890
- masked_user 조회 결과
\connect - masked_user
SELECT * FROM test;
name | phone
---------+-------
Hayley | 12345
Olivia | 67890
Static Masking
**정적 마스킹(Static Masking)**은 데이터를 영구적으로 익명화해야 할 때 사용합니다. 예를 들어, 운영 데이터베이스 덤프를 개발팀에 전달하기 전에 민감 정보를 보호해야 하는 경우에 적합합니다.
edb
역할로 접근하면 원본 데이터는 다음과 같이 보입니다:
\connect - edb
SELECT * FROM test;
name | phone
------+-------
ABCD | 12345
EFGH | 67890
데이터를 영구적으로 익명화하려면 anonymize_table
함수를 실행하면 됩니다:
SELECT anon.anonymize_table('test');
anonymize_table
-----------------
t
이제 테이블의 데이터는 영구적으로 변경됩니다.
SELECT * FROM test;
name | phone
---------+-------
Phillip | 12345
Mariah | 67890
Shuffle 개념: 데이터를 세로로 섞기
pg_anonymizer
확장의 독특한 기능 중 하나는 shuffle_column()
함수입니다.
이 함수는 전통적인 마스킹 방식과 달리 컬럼 내 값들을 세로 방향으로 섞어버리는 기능을 제공합니다. 따라서 Dynamic Masking에는 사용할 수 없습니다.
예를 들어, 이름(name)과 ID(id)를 가진 테이블이 있을 때, id
컬럼을 셔플하면 각 이름과 ID 간의 원래 매핑 관계가 무너져 특정 이름을 원래의 ID와 연결하기 어렵게 만듭니다.
SELECT * FROM test;
name | alpha | id
------+-------+----
A | a | 1
B | b | 2
C | c | 3
D | d | 4
id
컬럼을 셔플한 뒤:
SELECT anon.shuffle_column('test', 'id', 'id');
SELECT * FROM test;
name | alpha | id
------+-------+----
C | c | 3
A | a | 2
B | b | 4
D | d | 1
데이터 마스킹 활용 사례
데이터 마스킹은 단순한 보안 조치를 넘어, 다양한 비즈니스 및 개발 상황에서 전략적 도구로 쓰입니다:
- 소프트웨어 개발: 개발자가 운영 데이터 복사본에서 데이터 유출 위험 없이 현실적인 데이터를 활용 가능
- 소프트웨어 테스트: 운영 환경을 모방한 데이터로 철저한 테스트 가능, 개인정보 침해 우려 없음
- 사용자 교육 & 세일즈 데모: 익명화된 데이터로 현실적인 시나리오 제공
- 컴플라이언스 & 거버넌스: 운영 외 환경에서도 민감 데이터가 보호되도록 하여 규제 요건 충족
결론
데이터 마스킹은 현대 데이터베이스 관리에서 민감 정보를 보호하기 위한 필수 관행입니다.pg_anonymizer
확장은 선언적 방식으로 데이터베이스 스키마에 직접 마스킹 규칙을 적용할 수 있어, 조직이 개발·테스트·운영 환경 전반에서 프라이버시를 설계 단계부터 보장하도록 돕습니다.
또한, 완전한 데이터 리대액션 기능이 필요하다면 EPAS의 DBMS_REDACT
를 참고할 수 있습니다.
참고 자료
pg_anonymizer
확장 상세 정보: [PostgreSQL_Anonymizer]- 데이터 마스킹 & 리대액션 관련 EDB 블로그: [여기], [여기], [여기]
- EPAS & PGE에서의
pg_anonymizer
설치 가이드: [Installing pg_anonymizer]