[DEV SQL] 1. 마스킹처리 이름 아이디 (mysql/mariadb)


쿼리에서 이름 아이디 마스킹처리 (mysql/mariadb)


우선 중요한 답부터


ID 마스킹 처리

SELECT
    REGEXP_REPLACE('linked2ev', '(?<=.{3}).', '*') AS MASKINGID
FROM
    DUAL

출력 결과

  • lin**


실제로는 정규식 부분를 CDATA로 감싸줘야 한다.

<![CDATA[REGEXP_REPLACE(ID, '(?<=.{3}).', '*') AS MASKINGID]]>



이름 마스킹 처리

SELECT
    CASE WHEN CHAR_LENGTH(S1.NAME) > 2 THEN 
        CONCAT(
            SUBSTRING(S1.NAME, 1, 1)
            ,LPAD('*', CHAR_LENGTH(S1.NAME) - 2, '*')
            ,SUBSTRING(NAME, CHAR_LENGTH(S1.NAME), CHAR_LENGTH(S1.NAME))
        )
        ELSE CONCAT(
            SUBSTRING(S1.NAME, 1, 1)
            ,LPAD('*', CHAR_LENGTH(S1.NAME) - 1, '*')
        )
    END AS MASKINGNAME
FROM
	(
    SELECT
        -- 아무/아무개/아무개다
        '아무개' AS NAME
    FROM
        DUAL
    ) AS S1

출력 결과

  • 아*
  • 아*개
  • 아**다


실제로 쓰이는 부분이다.

CASE WHEN CHAR_LENGTH(S1.NAME) > 2 THEN 
    CONCAT(
        SUBSTRING(S1.NAME, 1, 1)
        ,LPAD('*', CHAR_LENGTH(S1.NAME) - 2, '*')
        ,SUBSTRING(NAME, CHAR_LENGTH(S1.NAME), CHAR_LENGTH(S1.NAME))
    )
    ELSE CONCAT(
        SUBSTRING(S1.NAME, 1, 1)
        ,LPAD('*', CHAR_LENGTH(S1.NAME) - 1, '*')
    )
END AS MASKINGNAME



밑에는 주저리주저리다.


개발하다보면 개인정보 보호를 위해 이름 또는 아이디에 마스킹처리하는 경우가 있다.

javacsript로 순수데이터를 가져온 후에 마스킹처리하는 경우도 본거 같다.. 이 방식은 이미 응답한 데이터가 노출되기 때문에 문제가 되는 방법인거 같다.

서버에서 select 한 데이터들을 다시 꺼내서 for문을 돌려서 다시 가공하는 방식도 있다. 단일 데이터인 경우나 간단하게 필요한 부분인 경우 Util로 처리하는건 좋다고 생각된다.

개인적으로 ORM을 사용하는 프로젝트가 주다 보니 이왕이면 쿼리에서 처리하는게 간결하고 개발속도가 빠르다고 생각된다. 그래서 쿼리에서 이용한 마스킹 처리이다.

다른 분들은 어떻게 처리하는지 궁금하다. 추후에 더 좋은 방법이 있다면 해당 포스팅을 다시 하겠습니다.