개발 메모장

[MS-SQL] 마스킹 Function 본문

DBMS

[MS-SQL] 마스킹 Function

yyyyMMdd 2024. 2. 6. 10:24
728x90

#. 민감 데이터인 개인정보는 웹에서 보이지 않도록 반드시 마스킹 처리를 하여 정보를 보호해야 합니다.

#. 이러한 개인정보는 웹 곳곳에서 사용되므로 하나하나 처리하기보단 function으로 처리하는 편이 관리하기 편합니다.

#. 따라서 MSSQL에서 마스킹 function을 만들어 보고자 합니다.


#. 마스킹 처리 기준
    - 이는 명확한 기준이 없기에 처리하는 담당자마다 다르게 처리할 수 있습니다.

    - 관계된 법령이 있는지 확실치 않습니다. 있다면 알려주시길 부탁드립니다!

 

  • 이름이 2자인 경우 마지막 글자를, 3자인 경우 가운데를, 4자 이상인 경우 처음과 끝 1자리를 제외한 나머지를 마스킹합니다.

  • 전화번호의 경우 가운데 3~4자리를 마스킹합니다.

  • 주소의 경우 상세주소를 마스킹합니다.

  • 주민번호는 뒷자리를 마스킹합니다.

  • 이메일주소는 앞 2자리를 제외한 나머지부터 @ 전까지를 마스킹합니다.

  • 카드번호는 2번째 단락 3,4자리, 3번째 단락을 마스킹합니다.

  • 우선 function의 이름을 정하고 파라미터를 2개만 받도록 합니다.

  • 첫 번째 파라미터는 마스킹을 적용할 값, 두 번째 파라미터는 ID, 이름, 전화번호 등 구분을 위한 값입니다.

  • 아래와 같이 function을 create 해주도록 하고 변수를 선언해 줍니다.
CREATE FUNCTION [MASKING]
(@inputText VARCHAR(50), @type VARCHAR(2))

RETURNS VARCHAR(50)
AS
BEGIN
	/* 변수 설정 */
	Declare @returnText VARCHAR(50) = '';
	Declare @tmpText VARCHAR(50);
	Declare @textLen Int
	Declare @maskingChar Char(1)
	Declare @index Int = 1;
	
	Set @maskingChar = '*';

 


  • 이후 마스킹 타입별로 분기를 나눠줍니다.
	/* 1 = 이름 */
	IF @type = '1'
		BEGIN
			IF LEN(@inputText) = 2 -- 두글자
				BEGIN
					-- 김*
					SET @returnText = LEFT(@inputText,1) + @maskingChar
				END
			ELSE IF LEN(@inputText) = 3 -- 세글자
				BEGIN
					-- 홍*동
					SET @textLen = LEN(@inputText) - 2;
					SET @returnText = LEFT(@inputText, 1) + REPLACE(SPACE(@textLen), ' ', @maskingChar) + RIGHT(@inputText, 1);
				END
			ELSE IF LEN(@inputText) >= 4 -- 네글자 이상
				WHILE @index <= LEN(@inputText)
				BEGIN
					-- 주***김***개
					DECLARE @currentChar VARCHAR(1) = SUBSTRING(@inputText, @index, 1);
					IF @index % 4 != 1
						SET @returnText += @maskingChar;
					ELSE
						SET @returnText += @currentChar;
					SET @index += 1;
				END
			ELSE
				BEGIN
					SET @returnText = @inputText;
				END
		END

 

  • 이런 식으로 처리해 주면 됩니다.

  • 마스킹을 사용하는 방식은 법적으로 정해져 있는 것 같지 않은 것 같습니다.

  • 따라서 동일한 스타일로 적용해 주시면 됩니다.

  • 아래는 전화번호 처리방법입니다.
	/* 2 = 전화번호 */
	ELSE IF @type = '2'
		BEGIN
			SET @tmpText = @inputText;
			SET @inputText = REPLACE(REPLACE(@inputText, ' ', ''), '-', '');
			SET @textLen = LEN(@inputText);
			
			IF @textLen < 7
				BEGIN
					SET @returnText = @tmpText
				END
			ELSE IF @textLen = 7
				BEGIN
					-- 123-****
					SET @returnText = REPLACE(SPACE(3), ' ', @maskingChar) + '-' + RIGHT(@inputText, 4);
				END
			ELSE IF @textLen = 8
				BEGIN
					-- 1234-****
					SET @returnText = REPLACE(SPACE(4), ' ', @maskingChar) + '-' + RIGHT(@inputText, 4);
				END
			ELSE IF @textLen = 9
				BEGIN
					-- 02-***-4567
					SET @returnText = LEFT(@inputText, 2) + '-' + REPLACE(SPACE(3), ' ', @maskingChar) + '-' + RIGHT(@inputText, 4);
				END
			ELSE IF @textLen = 10
				BEGIN
					IF LEFT(@inputText,2) = '02'
						BEGIN
							-- 02-****-5678
							SET @returnText = LEFT(@inputText, 2) + '-' + REPLACE(SPACE(4), ' ', @maskingChar) + '-' + RIGHT(@inputText, 4);
						END
					ELSE
						BEGIN
							-- 011-***-5678
							SET @returnText = LEFT(@inputText, 3) + '-' + REPLACE(SPACE(3), ' ', @maskingChar) + '-' + RIGHT(@inputText, 4);
						END
				END
			ELSE IF @textLen = 11
				BEGIN
					-- 010-****-5678
					SET @returnText = LEFT(@inputText, 3) + '-' + REPLACE(SPACE(4), ' ', @maskingChar) + '-' + RIGHT(@inputText, 4);
				END
			ELSE IF @textLen = 12
				BEGIN
					-- 0502-****-5678
					SET @returnText = LEFT(@inputText, 4) + '-' + REPLACE(SPACE(4), ' ', @maskingChar) + '-' + RIGHT(@inputText, 4);
				END
		END
	
	RETURN @returnText
END

 

  • 국번 없는 유선번호부터 안심번호까지 처리할 수 있게 분기로 나누어 처리하였습니다.

  • 위와 같은 식으로 필요한 부분은 type을 추가하여 확장시켜 주고 type 내부적인 부분 또한 IF문을 추가하여 처리하면 됩니다.

  • 이렇게 한번 만들어놓은 함수를 이용해 필요한 부분에 추가해 사용하면 아주 간편합니다.

  • 오픈쿼리를 이용하는 경우에도 사용 가능하기에 다른 DBMS에서 처리하여 가져올 필요가 없게 됩니다.

 

 

 

===========================================================
틀린 내용이 있거나 이견 있으시면 언제든 가감 없이 말씀 부탁드립니다!
===========================================================

728x90