본문 바로가기

MySql

[MySql] 데이터 마스킹 처리 방법

728x90
반응형

마스킹은 주로 개발, 테스트 환경에서 실 데이터를 사용하지 않도록 하고, 외부 접근 시 민감한 정보가 노출되지 않게 하려는 목적에서 사용된다.

MySQL 자체에는 기본적인 마스킹 기능이 없지만, 여러 가지 기법을 사용하여 데이터 마스킹을 구현할 수 있다. 대표적인 방법으로 동적 마스킹정적 마스킹을 사용할 수 있으며, SQL 쿼리나 함수, 뷰 등을 활용해 직접 구현할 수 있다.


1. MySQL에서 데이터 마스킹을 구현하는 방법

1.1. 뷰(View)로 동적 마스킹 처리

뷰(View)를 사용하여 특정 열의 데이터를 마스킹된 상태로 반환하도록 설정할 수 있다. 동적 마스킹은 데이터를 쿼리할 때 실시간으로 마스킹된 값을 반환하는 방법이다.

-- 예시: 주민등록번호 컬럼을 부분적으로 마스킹하는 뷰 생성
CREATE VIEW masked_users AS
SELECT 
    id, 
    name, 
    CONCAT(LEFT(ssn, 6), '******') AS masked_ssn
FROM users;

 

  • 위 쿼리는 users 테이블의 주민등록번호(ssn) 컬럼을 앞의 6자리만 남기고 나머지는 ******로 마스킹한다.
  • 이후 masked_users 뷰를 통해 쿼리를 실행하면, 민감한 데이터가 가려진 채로 결과가 반환된다.
SELECT * FROM masked_users;

 

1.2. SQL 함수로 마스킹 처리

MySQL에서 사용자 정의 함수(UDF)를 만들어 특정 패턴에 맞춰 데이터를 마스킹할 수 있다. 예를 들어, 신용카드 번호나 전화번호를 마스킹하는 함수를 정의할 수 있다.

-- 전화번호 마스킹 함수 예시
CREATE FUNCTION mask_phone(phone VARCHAR(15)) RETURNS VARCHAR(15)
BEGIN
    RETURN CONCAT(LEFT(phone, 3), '****', RIGHT(phone, 4)); 
END;
  • mask_phone 함수는 전화번호의 중간 4자리를 ****로 대체하여 마스킹된 값을 반환한다.
-- 함수 사용 예시
SELECT id, mask_phone(phone) FROM users;

1.3. 정적 마스킹 처리

정적 마스킹은 데이터를 영구적으로 마스킹된 상태로 변환하여 저장하는 방법이다. 이는 주로 테스트 데이터로 실제 데이터를 사용해야 할 때 사용된다.

  • 예를 들어, 전화번호를 무작위로 대체하는 쿼리는 다음과 같다.
-- 전화번호를 임의로 변경하여 정적 마스킹 처리
UPDATE users
SET phone = CONCAT(LEFT(phone, 3), '****', RIGHT(phone, 4));

이 쿼리는 users 테이블의 phone 열을 부분적으로 마스킹 처리한 후, 영구적으로 그 값을 UPDATE한다.

 

1.4. 동적 SQL 쿼리로 특정 조건에 따른 마스킹

사용자의 역할이나 권한에 따라 동적으로 마스킹을 적용할 수도 있다. 예를 들어, 관리자는 실 데이터를 볼 수 있지만, 일반 사용자는 마스킹된 데이터를 보게 할 수 있다.

SELECT 
    id,
    name,
    IF(user_role = 'admin', ssn, CONCAT(LEFT(ssn, 6), '******')) AS masked_ssn
FROM users;
  • 이 쿼리는 user_role이 admin인 경우 실 데이터를 보여주고, 그렇지 않으면 마스킹된 데이터를 반환한다.

2. MySQL에서 사용할 수 있는 데이터 마스킹 전략

2.1. 부분 마스킹

부분 마스킹은 민감한 데이터의 일부만을 가리고, 나머지 부분은 그대로 두는 방식이다. 예를 들어, 전화번호나 이메일, 주민등록번호에서 앞뒤 몇 자리를 보여주고, 나머지 부분을 숨기는 방식이다.

  • 예: john.doe@example.com → jo****@example.com
SELECT 
    CONCAT(LEFT(email, 2), '****', SUBSTRING(email, INSTR(email, '@'))) AS masked_email
FROM users;

2.2. 완전 마스킹

민감한 데이터를 전부 다른 값으로 바꾸거나, 무작위 값으로 대체하는 방식이다. 이 방식은 보통 테스트나 개발 환경에서 실 데이터 대신 무작위 데이터로 대체할 때 사용된다.

  • 예: 주민등록번호 123456-1234567 → ******-*******
SELECT 
    CONCAT(REPEAT('*', LENGTH(ssn) - 4), RIGHT(ssn, 4)) AS masked_ssn
FROM users;

2.3. 난수 생성

민감한 데이터를 무작위 숫자나 문자열로 대체하여 저장한다. 이 방식은 개인정보를 전혀 사용할 필요가 없을 때 유용하다.

-- 랜덤으로 이름 대체
UPDATE users
SET name = CONCAT('User', FLOOR(1000 + RAND() * 9000));

3. MySQL 데이터 마스킹의 주요 고려 사항

  1. 접근 제어: 민감한 정보에 접근할 수 있는 사용자를 제한하고, 마스킹된 데이터를 볼 수 있는 사용자와 그렇지 않은 사용자를 구분해야 한다. MySQL의 GRANT 명령어로 사용자 권한을 관리할 수 있다.
  2. 규제 준수: 개인정보 보호법(GDPR, CCPA 등)에서 요구하는 데이터 보호 수준을 준수하기 위해, 민감한 정보는 암호화, 마스킹 또는 기타 방법으로 보호해야 한다.
  3. 성능 고려: 마스킹된 데이터를 뷰나 SQL 함수로 처리할 때 성능 문제가 발생할 수 있다. 특히 대용량 데이터를 처리할 경우 성능 최적화를 고려해야 한다.
  4. 암호화와의 차이점: 데이터 마스킹은 데이터가 노출되는 것을 방지하는 데 중점을 두지만, 데이터 암호화는 데이터를 안전하게 보호하여 권한이 없는 사용자가 데이터를 해독하지 못하게 한다. 두 방법을 함께 사용하면 보안성을 크게 강화할 수 있다.

4. 결론

MySQL에서 데이터 마스킹을 구현하는 방법은 매우 다양하며, 조직의 보안 요구 사항과 데이터 처리 방식에 따라 적절한 전략을 선택해야 한다. 동적 마스킹은 실시간으로 데이터를 마스킹하는 데 유용하며, 정적 마스킹은 실제 데이터를 가려서 저장하거나 테스트 환경에서 실 데이터를 대신 사용할 때 적합하다. 뷰, 함수, 또는 SQL 쿼리로 마스킹 처리를 구현하면, MySQL에서도 효과적으로 민감한 데이터를 보호할 수 있다.

728x90
반응형

'MySql' 카테고리의 다른 글

[MySql] 서브쿼리 사용법  (0) 2024.08.31
[MySql] DATE_FORMAT 함수  (0) 2024.08.30
[MySql] UNION이란?  (0) 2024.08.26
[MySql] JOIN이란?  (0) 2024.08.25
[MySql] LIKE 사용법  (0) 2024.08.24