컴퓨터 이야기/프로그래밍

[자바스크립트] 주민번호를 기준으로 만 나이 체크

래빗 크리스 2010. 12. 15. 10:21


이곳에 구현해 놓은 내용은..
만 14세 미만인 사람이 회원가입을 할때 부모 동의를 얻기 위해 부모 주민번호를 입력받는 상황에서,
부모가 만 19세 이상 성년자 인지를 확인하기 위해 주민번호를 기준으로 만 나이를 체크하는 것입니다.
물론, https:// 프로토콜을 사용하여 SSL 로 서버단 프로그램을 구현해야 되겠구요.
이외에 i-Pin 을 이용한 방법을 사용할 수도 있어야 합니다만..
여기서는 클라이언트단의 주민번호 기준 만 나이 체크를 하는 부분입니다.

isUnderAge 함수는 input 태그에 입력된 값이 만 나이 기준으로 파라미터값 미만인지 점검.
만 14세, 만 19세 등의 기준으로 체크 가능.

input 태그의 onBlur 에 isUnderAge(14) 대신에 if(isUnderAge(14)); 이 필요할 수도..
onBlur 시의 오류를 무시하고 form 을 사용하려고 할때,
chkValid 함수에 isUnderAge 함수를 다시 한번 입력.

chkAge 함수는 파라미터가 주민번호일때 내국인/외국인을 구분해서 만 나이를 점검.
isNumber6 과 isNumber7 함수는 input 태그에 입력된 값이 숫자로 6개 또는 7개인지를 점검.

<form name="frmBasic">
  <input name="parentUserNo1" value="123456" onBlur="isUnderAge(14)" maxLength="6" />
  <input name="parentUserNo2" value="7890123" onBlur="isUnderAge(14)" maxLength="7" />
</form>

<script>
function isUnderAge(n){
  var f = document.frmBasic;
  var v1 = f.parentUserNo1.value;
  var v2 = f.parentUserNo2.value;
  if(isNumber6(v1) && isNumber7(v2)){ // 아직 입력 중일 때는 만 나이를 체크할 수가 없고, 13 자리가 모두 차야 합니다
    if(chkAge(v1+v2) < n){ alert('만 나이로 '+n+' 세 미만입니다. '); return false; }
    else return true;
  }else return false;
}

function isNumber6(v){ return /^[0-9]{6}$/.test(v); } // 공백이 있어도 안 됩니다만..
function isNumber7(v){ return /^[0-9]{7}$/.test(v); }

function chkAge(s){ // s 은 13자리 주민번호
  var v1 = Number(s.substring(0,2));
  var v2 = Number(s.substring(6,7));
  var vy = (v2==1 || v2==2 || v2==5 || v2==6) ? 1900 +v1 : ((v2==3 || v2==4 || v2==7 || v2==8) ? 2000 +v1 : 0);
  var vm = Number(s.substring(2,4));
  var vd = Number(s.substring(4,6));
  var today = new Date();
  var thisYear = today.getYear();
  var thisMonth = today.getMonth()+1; // Date 를 사용할때 getMonth 는 0 이 1월이므로 1을 더한다
  var thisDay = today.getDate();
  var dy = thisYear - vy; // 년차
  var dmd = (thisMonth - vm) *100 + (thisDay - vd); // 단순 비교이므로, 월에 30을 곱할 필요 없음
  return dmd>=0 ? dy -1 : dy; // 생일이 지나지 않았으면 년차에서 1년을 제하고, 지났으면 년차값이 만 나이
}

function chkValid(){
  var f = document.frmBasic;
  if(!isUnderAge(14)) return false; // 이 부분 앞에서 주민번호 입력이 정확한지 체크하는 로직은 따로 만들어야 겠죠.
  return true;
}
</script>