DB
[ORACLE] 개인정보에 따른 마스킹 처리 방법
엠케이로그
2024. 7. 8. 00:04
1. 개인정보 마스킹
개인정보 마스킹은 개인정보를 보호하기 위해 일부 또는 전체 정보를 비식별화하는 방법을 의미
개인정보보호법 및 관련 규정에 따라 다양한 마스킹 방법이 사용
2. 마스킹 필요 예시
더보기
이름, 주소지, 등등 타인에게 노출될 수 있을 때 마스킹 필요
3. 개인정보에 따른 마스킹 처리 방법
이름
- 마스킹 방법: 성을 제외한 나머지 부분을 마스킹
- 예시: 하○○, 박○○
-- ORACLE
WITH ORDER_USER AS (
SELECT '하이요' AS NAME FROM DUAL UNION ALL
SELECT '김코딩' AS NAME FROM DUAL UNION ALL
SELECT '박개발' AS NAME FROM DUAL
)
SELECT
NAME,
SUBSTR(NAME, 1, 1) || LPAD('*', LENGTH(NAME) - 1, '*') AS MASKING_NAME
FROM
ORDER_USER;
- SUBSTR(NAME, 1, 1): 이름의 첫 글자를 추출
- LENGTH(NAME) - 1: 이름의 길이에서 첫 글자를 제외한 나머지 길이를 계산
- LPAD('*', LENGTH(NAME) - 1, '*'): 나머지 길이만큼 '*'로 채우기
- SUBSTR(NAME, 1, 1) || LPAD('*', LENGTH(NAME) - 1, '*'): 첫 글자와 '*'로 채운 문자열을 결합해서 마스킹처리
더보기
*LPAD 함수
- 문자열의 왼쪽에 지정된 문자로 패딩(padding)을 추가하여 지정된 길이만큼 문자열을 확장하는 데 사용
SELECT LPAD('Hello', 10, '*') AS padded_string FROM dual;
padded_string
-------------
*****Hello
-- MYSQL
WITH ORDER_USER AS (
SELECT '하이요' AS NAME
UNION ALL
SELECT '김코딩' AS NAME
UNION ALL
SELECT '박개발' AS NAME
)
SELECT
NAME,
CONCAT(SUBSTRING(NAME, 1, 1), REPEAT('*', CHAR_LENGTH(NAME) - 1)) AS MASKING_NAME
FROM
ORDER_USER;
[MYSQL]
- SUBSTRING(NAME, 1, 1): 이름의 첫 글자를 추출.
- CHAR_LENGTH(NAME) - 1: 이름의 길이에서 첫 글자를 제외한 나머지 길이를 계산
- REPEAT('*', CHAR_LENGTH(NAME) - 1): 나머지 길이만큼 '*'로 채우기
- CONCAT(SUBSTRING(NAME, 1, 1), REPEAT('*', CHAR_LENGTH(NAME) - 1)): 첫 글자와 '*'로 채운 문자열을 결합해서 마스킹처리
주소
- 마스킹 방법: 상세 주소 마스킹
- 예시: 서울특별시 강남구 테헤란로 123 (중간 부분 생략)
-- ORACLE
WITH address_table AS (
SELECT '서울특별시 강남구 역삼동 123-45' AS address FROM dual UNION ALL
SELECT '부산광역시 해운대구 우동 678-90' AS address FROM dual UNION ALL
SELECT '대구광역시 수성구 범어동 111-22' AS address FROM dual
)
SELECT
address,
REGEXP_REPLACE(address, '^([^ ]+ [^ ]+ ).+', '\1*') AS masked_address
FROM
address_table;
^([^ ]+ [^ ]+ ).+: 정규표현식 패턴
- ^: 문자열의 시작을 의미.
- ([^ ]+ [^ ]+ ): 두 개의 단어(시와 구 단위)를 캡처. 여기서 각각의 [^ ]+는 공백이 아닌 문자의 연속을 의미함.
- .+: 나머지 모든 문자를 의미
- \1*: 대체 문자열
- \1: 첫 번째 캡처 그룹을 참조 (시와 구 단위).
- *: 나머지 주소를 대체할 문자
시/구 단위까지만 남기고 그 뒤의 주소를 *로 대체
-- MYSQL
SELECT
address,
CONCAT(
LEFT(address, LOCATE(' ', address, LOCATE(' ', address) + 1) - 1),
' *'
) AS masked_address
FROM
(
SELECT '서울특별시 강남구 역삼동 000-00' AS address
UNION ALL
SELECT '경기도 수원시 팔달구 111-11' AS address
UNION ALL
SELECT '대구광역시 수성구 범어동 222-22' AS address
) AS address_table;
주민등록번호
- 마스킹 방법: 뒤 7자리 마스킹
- 예시: 900101-1******
SELECT SUBSTR(주민등록번호, 1, 6) || '-' || RPAD('*', 7, '*') AS 마스킹된_주민등록번호
FROM 사용자;
전화번호
- 마스킹 방법: 가운데 4자리 마스킹
- 예시: 010-****-5678
SELECT SUBSTR(전화번호, 1, 3) || '-****-' || SUBSTR(전화번호, 9, 4) AS 마스킹된_전화번호
FROM 사용자;
이메일 주소
- 마스킹 방법: '@' 이전 부분을 부분 마스킹
- 예시: joh****@example.com
SELECT SUBSTR(이메일, 1, 3) || RPAD('*', INSTR(이메일, '@') - 4, '*') || SUBSTR(이메일, INSTR(이메일, '@')) AS 마스킹된_이메일
FROM 사용자;
카드번호
- 마스킹 방법: 중간 8자리 마스킹
- 예시: 1234---5678
SELECT SUBSTR(카드번호, 1, 4) || '-' || RPAD('*', 4, '*') || '-' || RPAD('*', 4, '*') || '-' || SUBSTR(카드번호, -4) AS 마스킹된_카드번호
FROM 사용자;
계좌번호
- 마스킹 방법: 중간 자리 마스킹
- 예시: 123-****-567890
SELECT SUBSTR(계좌번호, 1, 4) || RPAD('*', 3, '*') || SUBSTR(계좌번호, 7) AS 마스킹된_계좌번호
FROM 사용자;
4. 데이터 마스킹 처리에 많이 사용되는 함수 Oracle 함수
1) SUBSTR 함수
: 문자열의 일부분을 추출
SUBSTR(string, start_position, length)
-- 예시
SELECT SUBSTR('서울특별시 강남구 테헤란로 123', 1, 5) FROM DUAL;
-- 결과: '서울특별시'
2) INSTR 함수
: 문자열 내에서 특정 문자의 위치를 반환
INSTR(string, substring, start_position, occurrence)
-- 예시
SELECT INSTR('john.doe@example.com', '@') FROM DUAL;
-- 결과: 9
3) LENGTH 함수
: 문자열의 길이를 반환
LENGTH(string)
-- 예시
SELECT LENGTH('서울특별시 강남구 테헤란로 123') FROM DUAL;
-- 결과: 18
4) RPAD 함수
: 문자열의 오른쪽에 지정된 길이가 될 때까지 특정 문자를 추가
RPAD(string, length, pad_string)
-- 예시
SELECT RPAD('김', 3, '*') FROM DUAL;
-- 결과: '김**'
5) LPAD 함수
: 문자열의 왼쪽에 지정된 길이가 될 때까지 특정 문자를 추가
LPAD(string, length, pad_string)
-- 예시
SELECT LPAD('5432', 8, '*') FROM DUAL;
-- 결과: '****5432'
6) CONCAT 함수
: 두 개의 문자열을 결합
CONCAT(string1, string2)
-- 예시
SELECT CONCAT('김', '**') FROM DUAL;
-- 결과: '김**'