공부/SQL

[MySQL] 개인정보 (휴대폰번호, 이름) 마스킹 처리

yeonstudy 2022. 5. 31. 15:35

개인정보 데이터를 추출하는 일이 종종 있었는데, 이를 마스킹 처리해서 추출해달라는 요청을 처음으로 받아 쿼리를 작성하는 겸 기록을 위해 포스팅을 작성한다. 

1. 휴대폰번호 마스킹 처리

-- 결과값: 010****1234
SELECT 
	REPLACE(HP_NO, SUBSTRING(HP_NO, 4, 4), '****') AS 휴대폰번호
FROM DUAL 

-- 결과값: 0101234****
SELECT 
	REPLACE(HP_NO, SUBSTRING(HP_NO, 8, 4), '****') AS 휴대폰번호
FROM DUAL

내가 데이터를 추출하는 테이블은 휴대폰번호를 01012345678 형태로 하이픈 없이 저장하고 있어 다음과 같이 쿼리를 작성했다. 휴대폰번호 사이에 하이픈이 있는 경우라면 SUBSTRING 함수의 parameter값만 변경해주면 될 듯 하다. 


2. 이름 마스킹 처리

SELECT 
	-- 이름이 2, 3글자인 경우 두 번째 글자를 마스킹함.
    -- 출력 결과: 김*, 홍*동
	CASE WHEN CHAR_LENGTH(CUST_NM) <= 3
    		THEN REPLACE(CUST_NM, SUBSTRING(CUST_NM, 2, 1), '*')
    -- 이름이 4글자 이상인 경우 첫 글자와 마지막 글자를 남기고 모두 마스킹함.
    -- 출력 결과: 가**라, 가***마, A*****G
    	 WHEN CHAR_LENGTH(CUST_NM) > 3
         	THEN REPLACE(CUST_NM, SUBSTRING(CUST_NM, SUGSTRING(CUST_NM, CHAR_LENGTH(CUST_NM) - 2), 
            	REPEAT('*', CHAR_LENGTH(CUST_NM) - 2))
    END AS 고객이름
FROM DUAL

처음에는 한국인 대부분의 이름이 세 글자라고 생각하고 단순히 이름 컬럼의 두 번째 값을 마스킹처리하려고 했었다. 하지만 실제 이름 데이터들을 확인해보니 두 글자 이름도 많고 네 글자, 심지어는 다섯 글자 이상인 이름 (외국인 이름... ) 도 많아 경우를 두 가지 (이름이 3글자 이하인 경우 / 이름이 4글자 이상인 경우) 로 나누어 쿼리를 작성했다. 

 

 

정규식으로 처리하는 경우도 있다고 하는데, 정규식을 극도로 싫어하기도 하고 단순히 데이터 추출만을 위한 마스킹이기 때문에 SQL 함수나 정규식을 사용하지 않고 SELECT 문에 바로 작성했다. 실제로 웹 화면이나 서버 쪽에서 이용되는 데이터를 마스킹해야 할 경우에는 정규식을 사용해야 할 듯 하다.