250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- jqGrid
- 대용량 업로드
- Jenkins
- 자바8
- mom
- java
- 자동빌드
- DevOps
- ci/cd
- Javascript
- 그리드
- rabbitmq
- poi
- 보안
- 제이쿼리그리드
- Stream
- spring
- mssql
- 스트림
- JQuery
- MessageQueue
- 엑셀 업로드
- apache.poi
- 자동배포
- JPA
- QueryDSL
- ORM
- sqlserver
- docker
- stream api
Archives
- Today
- Total
개발 메모장
[MS-SQL] 마스킹 Function 본문
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
'DBMS' 카테고리의 다른 글
[Redis] Redis CLI 명령어 모음 (0) | 2024.04.12 |
---|---|
[Oracle] WITH문 사용방법 (0) | 2024.04.08 |
[Oracle] SQL 튜닝 (2) | 2023.12.05 |
[MS-SQL] 프로시저 오류 발생 시 메일 발송(장단점, SMTP, 스케줄러) (0) | 2023.11.28 |
[Oracle] TimeStamp - 데이터 원복 (0) | 2023.11.23 |