메뉴 건너뛰기

조회 수 3995 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

ID를 표시할때 ssoda**와 같이 마스킹 처리를 하는 Util을 구현했다.


ID는 핸드폰번호 또는 메일 주소의 포맷을 가지고 있다.


이메일 주소는 {userId}@gmail.com에서

userId.length를 기준으로 세글자 초과인 경우 뒤 세자리를 마스킹 처리하고,

세글자인 경우 뒤 두글자만 마스킹,

두글자 또는 한글자인 경우 모두 마스킹 처리했다.


핸드폰 번호는 가운데 3자리 또는 4자리를 마스킹 처리했다.

+ 핸드폰 번호가 011, 016.. 등등 다 010으로 통합한다고 했던거 같은데,

   아직 남아있는지 어떤지 몰라서 일단 기존 포맷 " 011-000(세글자)-0000 "이랑 요즘(?) 번호 포맷 " 010-0000-0000 " 둘 다 허용되도록 했다.


예외의 경우에는 인풋으로 넘어온 값을 그대로 리턴해주도록 했다.

(서비스 특성상??)

import java.util.Arrays;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

// TODO IdFormatter? 이름 다시 고민!
public class IdFormatterUtil {

private static final Logger logger = LoggerFactory.getLogger(IdFormatterUtil.class);
private static final String PHONE_NUM_PATTERN = "(01[016789])(\\d{3,4})(\\d{4})";
private static final String EMAIL_PATTERN = "^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@"
                                            + "[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$";

   /**
    * 이메일이든, 휴대폰번호든 각 포맷에 맞게 마스킹된 결과값 리턴해주는 함수
    * 포맷이 맞지 않을 경우 인풋으로 들어온 값 그대로 리턴
    *
    * public은 이거 하나! valid check류의 메서드들도 추후 필요하면 public으로 바꿀 예정
    *
    * @param id
    * @return maskedId
    */
   public static String getMaskedId(String id) {
      if (isEmail(id)) {
         return getMaskedEmail(id);
      } else if (isPhoneNum(id)) {
         return getMaskedPhoneNum(id);
      }
      return id;
   }

   /**
    * 이메일 포맷 Validator
    * @param str
    * @return isValidEmailFormat
    */
   private static boolean isEmail(final String str) {
      return isValid(EMAIL_PATTERN, str);
   }

   /**
    * 휴대폰 번호 포맷 Validator
    * @param str
    * @return isValidCellPhoneNumFormat
    */
   private static boolean isPhoneNum(final String str) {
      return isValid(PHONE_NUM_PATTERN, str);
   }

   /**
    * 문자열이 정규식에 맞는 포맷인지 체크
    * @param regex
    * @param target
    * @return isValid
    */
   private static boolean isValid(final String regex, final String target) {
      Matcher matcher = Pattern.compile(regex).matcher(target);
      return matcher.matches();
   }

   /**
    * 이메일 주소 마스킹 처리
    * @param email
    * @return maskedEmailAddress
    */
   private static String getMaskedEmail(String email) {
      /*
      * 요구되는 메일 포맷
      * {userId}@domain.com
      * */
      String regex = "\\b(\\S+)+@(\\S+.\\S+)";
      Matcher matcher = Pattern.compile(regex).matcher(email);
      if (matcher.find()) {
         String id = matcher.group(1); // 마스킹 처리할 부분인 userId
         /*
         * userId의 길이를 기준으로 세글자 초과인 경우 뒤 세자리를 마스킹 처리하고,
         * 세글자인 경우 뒤 두글자만 마스킹,
         * 세글자 미만인 경우 모두 마스킹 처리
         */
         int length = id.length();
         if (length < 3) {
            char[] c = new char[length];
            Arrays.fill(c, '*');
            return email.replace(id, String.valueOf(c));
         } else if (length == 3) {
            return email.replaceAll("\\b(\\S+)[^@][^@]+@(\\S+)", "$1**@$2");
         } else {
            return email.replaceAll("\\b(\\S+)[^@][^@][^@]+@(\\S+)", "$1***@$2");
         }
      }
      return email;
   }

   /**
    * 휴대폰 번호 마스킹 처리
    * @param phoneNum
    * @return maskedCellPhoneNumber
    */
   private static String getMaskedPhoneNum(String phoneNum) {
      /*
      * 요구되는 휴대폰 번호 포맷
      * 01055557777 또는 0113339999 로 010+네자리+네자리 또는 011~019+세자리+네자리 이!지!만!
      * 사실 0107770000 과 01188884444 같이 가운데 번호는 3자리 또는 4자리면 돈케어
      * */
      String regex = "(01[016789])(\\d{3,4})\\d{4}$";
      Matcher matcher = Pattern.compile(regex).matcher(phoneNum);
      if (matcher.find()) {
         String replaceTarget = matcher.group(2);
         char[] c = new char[replaceTarget.length()];
         Arrays.fill(c, '*');
         return phoneNum.replace(replaceTarget, String.valueOf(c));
      }
      return phoneNum;
   }

}


List of Articles
번호 제목 날짜 조회 수
91 자바 정규식 마스킹처리 file 2018.06.26 2672
» 개인정보 마스킹처리 (휴대폰번호, 이메일) 2018.06.26 3995
89 자바 날짜 포맷 변환 방법 file 2018.06.21 1485
88 JDK 9에서 eclipse 실행이 안될때 2018.06.05 1639
87 숫자형식 포멧 방법 2018.02.09 2418
86 jquery 스크롤(scroll) 따라다니는 배너 레이어 / 위로 버튼 / 화면 상단으로 이동 / scroll layer 이벤트 file 2017.07.05 4126
85 BigDecimal타입의 사칙연산 2016.12.22 3766
84 다양한 문자 조합을 이용한 카운팅 구하기 2016.12.09 4977
83 자바 JXL 엑셀파일을 읽어 배열리턴 : JAVA EXCEL ArrayList 2016.12.09 4429
82 날짜 시간 포맷 제어 자바 클래스 : JAVA DateUtils Date time file 2016.12.09 5287
81 자바 다양한 형변환. 그리고 아스키 코드 String char int : JAVA 2016.12.09 4240
80 자바 XML 제어 라이브러리 XStream : JAVA 2016.12.09 4969
79 원하는 패턴의 날짜 구하기 : JAVA 2016.12.09 3662
78 iBATIS 동적으로 맵핑하기 2016.12.09 4005
77 GET 파라메타 쿼리문자열 컨트롤 : getQueryString 2016.12.09 4772
76 접근 제한자 private/ protected/ public / default file 2016.10.06 5179
75 예외처리(Exception handling)방법 file 2016.09.21 4631
74 My-SQL 을 이용한 JDBC file 2016.09.21 4322
73 static멤버와 관련된 예제 2016.09.21 3799
72 파일 읽고쓰는 암호화/복호화 2016.09.21 7448
Board Pagination Prev 1 2 3 4 5 6 7 8 Next
/ 8

하단 정보를 입력할 수 있습니다

© k2s0o1d4e0s2i1g5n. All Rights Reserved