본문 바로가기
IT/Javascript

[Javascript] - 자바스크립트(jQuery) 유효성 검사 정규식 비밀번호 체크

by 차이나는 개발자 2021. 9. 27.
728x90
반응형

#자바스크립트(jQuery) 유효성 검사 정규식 비밀번호 체크

 

 

#비밀번호 유효성 검사, 정규식 체크

 

-예시

<script>

function fn_checkPassword(pwd, id){
  
  // 비밀번호 포맷 확인(영문, 특수문자, 숫자 포함 8자 이상)
  // test(): 찾는 문자열이, 들어있는지 아닌지를 알려준다.(boolean)
  if(!/^(?=.*[a-zA-Z])(?=.*\d)(?=.*\W).{8,20}$/.test(pwd)){
    alert("비밀번호는 영문과 특수문자 숫자를 포함하며 8자 이상이어야 합니다.");
    return false;
  }
  
  // 반복된 문자 확인
  if(/(\w)\1\1\1/.test(pwd)){
    alert("비밀번호에 동일한 문자를 과도하게 연속해서 사용할 수 없습니다.");
    $("#password").focus();
    return false;
  }
  
  // 아이디 포함 확인
  if(null != id && id != ""){
    // search(): 인덱스 위치 반환
    if(pwd.search(id) > -1){
      alert("비밀번호에 ID를 포함할 수 없습니다.");
      $("#password").focus();
      return false;
    }
  }
  
  // 특수문자 확인
  for(var i = 0; i < pwd.length; i++){
    if(/\W/.test(pwd.charAt(i))){ // 특수문자 중에서
      if(!/[!@#$^*+=-]/.test(pwd.charAt(i))){ // 포함된 문자가 아니면
        alert("비밀번호에 특수문자는 !@#$%^*+=-만 사용 가능합니다.");
        $("#password").focus();
        return false;
      }
    }
  }
  
  // 연속된 문자 확인
  var ascSeqCharCnt = 0; // 오름차순 연속 문자 카운트
  var descSeqCharCnt = 0; // 내림차순 연속 문자 카운트
  
  var char_0;
  var char_1;
  var char_2;
  
  var diff_0_1;
  var diff_1_2;
  
  for(var i = 0; i < pwd.length; i++){
    // charAt(): 문자값 반환
    char_0 = pwd.charAt(i);
    char_1 = pwd.charAt(i+1);
    char_2 = pwd.charAt(i+2);
    
    // charCodeAt(): 유니코드값 반환
    diff_0_1 = char_0.charCodeAt(0) - char_1.charCodeAt(0);
    diff_1_2 = char_1.charCodeAt(0) - char_2.charCodeAt(0);
    
    if(diff_0_1 === 1 && diff_1_2 === 1){
      ascSeqCharCnt += 1;
    }
    
    if(diff_0_1 === -1 && diff_1_2 === -1){
      descSeqCharCnt += 1;
    }
  }
    
  if(ascSeqCharCnt > 1 || descSeqCharCnt > 1){
    alert("비밀번호에 연속된 문자열을 사용할 수 없습니다.");
    $("#password").focus();
    return false;
  }
    
  var pwdCheck = $("#pwdCheck").val();
    
  // 비밀번호 일치 확인
  if(pwd != pwdCheck){
    alert("비밀번호가 일치하지 않습니다. 확인해주세요.");
    $("#pwdCheck").focus();
    return false;
  }
    
  return true;
};

<script>

 

 

 

728x90
반응형

댓글