PHP

유효한 주민등록번호인지 검증하는 함수

개바새바 2023. 9. 7. 16:59
728x90

주민등록번호 지역번호 폐지로 인해 현재도 검증하는 공식이 맞아떨어지는지 확인할 수 없습니다.

아래는 이전 주민등록번호 생성 관련된 내용이니 참고만 부탁드립니다.

 


 

주민등록번호의 구성

주민등록번호는 다음과 같은 구성으로 이루어져 있습니다:

  1. 앞 6자리: 생년월일 (YYMMDD)
  2. 다음 1자리: 성별 (남자: 1, 3 / 여자: 2, 4 / 외국인 남자: 5, 7 / 외국인 여자: 6, 8)
  3. 다음 4자리: 등록기관번호 (출생신고를 접수 처리한 기관 코드)
  4. 다음 1자리: 접수순서
  5. 마지막 7번째 자리: 주민번호 유효성 검증 코드


주민등록번호 검증 코드 계산 방법

주민등록번호의 검증 코드는 다음과 같이 계산됩니다:

  1. 주민등록번호 전체 13자리 중에서 맨 마지막 숫자(검증 코드)를 제외한 12자리에 대해 다음과 같이 계산합니다.
    - 맨 앞부터 각 숫자를 순서대로 2, 3, 4, 5, 6, 7, 8, 9를 곱한 후, 다시 2, 3, 4, 5를 순서대로 곱합니다.
  2. 위 계산한 결과를 모두 더합니다.
  3. 합계 숫자를 11로 나누어 나머지 값을 구합니다.
  4. 나머지 값을 11에서 뺀 것이 최종 검증 숫자입니다. 단, 검증 숫자가 10이 나오면 0으로, 11이 나오면 1로 간주합니다
    예를 들어, 주민등록번호 123456-1222331의 경우 검증 코드는 다음과 같이 계산됩니다:
  • 맨 앞에서부터 2, 3, 4, 5, ... 9, 다시 2부터 3, 4, 5를 각각 곱한 후 모두 더하면 175가 됩니다.
  • 175를 11로 나누면 나머지 값은 10입니다.
  • 11에서 나머지 값인 10을 뺀 결과는 1이므로, 최종 검증 코드는 1입니다.

 

주민등록번호 검증에 대한 유의사항

  • 주민등록번호 검증 코드는 계산 공식을 통해 유효성을 검증할 뿐, 그게 실제 존재하는 유효한 주민번호인지를 확인하지는 않습니다.
  • 주민등록번호 변경 구제 제도가 있으며, 특정 상황에서 주민번호를 변경할 수 있습니다. 이 경우 성별을 제외한 모든 번호가 임의로 변경됩니다.
  • 주민번호 무단 도용 및 불법 사용은 형사 처벌을 받을 수 있으므로 주의해야 합니다.
  • 주민등록번호는 개인정보 보호와 관련된 중요한 정보이므로 항상 신중하게 다루어져야 합니다.

 

주민등록번호 검증하는 PHP 함수

function validateRRN($rrn) {
  $rrn = str_replace('-', '', $rrn); // '-' 제거
  if (strlen($rrn) !== 13) return false;

  $weights = [2, 3, 4, 5, 6, 7, 8, 9, 2, 3, 4, 5]; // 각 숫자에 곱할 가중치
  $sum = 0;

  for ($i = 0; $i < 12; $i++) {
    $sum += intval($rrn[$i]) * $weights[$i];
  }

  $checkDigit = (11 - ($sum % 11)) % 10;
  return $checkDigit === intval($rrn[12]);
}

// 테스트
$rrnToTest = '123456-1222331'; // 테스트할 주민등록번호
$isValid = validateRRN($rrnToTest);

if ($isValid) {
  echo '주민등록번호 유효성 검사 통과';
} else {
  echo '주민등록번호 유효성 검사 실패';
}

 

주민등록번호 검증하는 JavaScript 함수

function validateRRN(rrn) {
  rrn = rrn.replace(/-/g, ''); // '-' 제거
  if (rrn.length !== 13) return false;

  const weights = [2, 3, 4, 5, 6, 7, 8, 9, 2, 3, 4, 5]; // 각 숫자에 곱할 가중치
  let sum = 0;

  for (let i = 0; i < 12; i++) {
    sum += parseInt(rrn.charAt(i)) * weights[i];
  }

  const checkDigit = (11 - (sum % 11)) % 10;
  return checkDigit === parseInt(rrn.charAt(12));
}

// 테스트
const rrnToTest = '123456-1222331'; // 테스트할 주민등록번호
const isValid = validateRRN(rrnToTest);

if (isValid) {
  console.log('주민등록번호 유효성 검사 통과');
} else {
  console.log('주민등록번호 유효성 검사 실패');
}

 

728x90