MySQL에서 데이터 필드의 값을 외부에 노출되지 않도록 숨기고 싶을 때 마스킹(masking) 기법을 사용할 수 있습니다. 이 글에서는 CONCAT() 함수와 REPEAT() 함수를 조합하여 비밀번호처럼 민감한 데이터를 '#' 문자로 마스킹하는 방법을 실제 예제와 함께 살펴보겠습니다.
1. 테이블 생성하기
먼저 마스킹 연습에 사용할 테이블을 생성합니다. 비밀번호 값을 저장할 Password 컬럼 하나로 구성된 간단한 테이블입니다.
mysql> create table DemoTable1410 -> ( -> Password varchar(80) -> ); Query OK, 0 rows affected (0.51 sec)
2. 샘플 데이터 삽입하기
INSERT 문을 사용해 테이블에 몇 개의 레코드를 추가합니다.
mysql> insert into DemoTable1410 values('John12345678');
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable1410 values('Carol_897');
Query OK, 1 row affected (0.20 sec)
mysql> insert into DemoTable1410 values('David_5647383');
Query OK, 1 row affected (0.17 sec)
3. 현재 데이터 확인하기
SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select * from DemoTable1410;
실행 결과는 다음과 같습니다.
+---------------+ | Password | +---------------+ | John12345678 | | Carol_897 | | David_5647383 | +---------------+ 3 rows in set (0.00 sec)
4. 데이터 마스킹 쿼리 실행하기
이제 핵심인 마스킹 쿼리입니다. SUBSTR()로 앞 5자리만 남기고, 나머지 자릿수만큼 REPEAT('#', ...)으로 '#' 문자를 반복 생성한 뒤 CONCAT()으로 두 부분을 연결합니다.
mysql> update DemoTable1410
-> set Password=concat(substr(Password, 1, 5), repeat('#', char_length(Password) - 5));
Query OK, 3 rows affected (0.16 sec)
Rows matched: 3 Changed: 3 Warnings: 0
여기서 CHAR_LENGTH()는 문자열의 전체 길이를 반환하므로, '전체 길이 - 5' 만큼의 '#'가 뒤에 덧붙여지는 구조입니다.
5. 마스킹 결과 확인하기
업데이트 후 테이블을 다시 조회해 보겠습니다.
mysql> select * from DemoTable1410;
결과를 보면 앞 5자리를 제외한 나머지 값이 모두 '#'로 대체된 것을 확인할 수 있습니다.
+---------------+ | Password | +---------------+ | John1####### | | Carol#### | | David######## | +---------------+ 3 rows in set (0.00 sec)
정리
이처럼 MySQL에서는 CONCAT(), SUBSTR(), REPEAT(), CHAR_LENGTH() 함수를 조합하면 별도의 프로그래밍 로직 없이 SQL만으로 손쉽게 데이터를 마스킹할 수 있습니다. 이 방법은 비밀번호, 전화번호, 계좌번호 등 민감한 정보를 화면에 표시하거나 로그로 남길 때 유용하게 활용될 수 있습니다. 노출하고 싶은 자릿수를 조절하고 싶다면 SUBSTR()의 세 번째 인자와 REPEAT()의 반복 횟수 계산식에서 숫자 5를 원하는 값으로 변경하면 됩니다.