phpsource/회원인증2002. 2. 25. 13:29
파일 구성
login.php - 홈페이지에서 입력된 주민등록번호를 가지고 성인 인증을 수행함
로직
< 홈페이지 로직 >
처음 접속자 확인, 주민등록번호 2차 검증 및 성인 판정에 따른 분기
PHP 4.0.0 ~ 4.0.3일 때
[code php;gutter:false] session_start(); if (!isset($HTTP_SESSION_VARS["AdultCard"])) { // // 웹사이트에 처음 접속했거나 로그아웃한 경우 // ?> <META http-equiv='refresh' content='0; url=home.php'> <?php exit; } $AdultCard = $HTTP_SESSION_VARS["AdultCard"]; if ($birth=check_jumin($HTTP_POST_VARS["j1"], $HTTP_POST_VARS["j2"])) { // // 주민등록번호가 정상적으로 입력된 경우 // if (19 <= check_age(substr($birth, 0, -1))) { // // 성인(만19세 이상)인 경우 // $AdultCard["permission"] = "ok"; ?> <META http-equiv='refresh' content='0; url=adult.php'> <?php exit; } } // // 주민등록번호가 틀렸거나 성인이 아닌 경우 // $AdultCard["permission"] = "no"; ?> <META http-equiv='refresh' content='0; url=home.php'> <?php exit; [/code]
PHP 4.0.4 ~ 4.0.5일 때
[code php;gutter:false] session_start(); if (!isset($HTTP_SESSION_VARS["AdultCard"])) { // // 웹사이트에 처음 접속했거나 로그아웃한 경우 // ?> <META http-equiv='refresh' content='0; url=home.php'> <?php exit; } $AdultCard = & $HTTP_SESSION_VARS["AdultCard"]; if ($birth=check_jumin($HTTP_POST_VARS["j1"], $HTTP_POST_VARS["j2"])) { // // 주민등록번호가 정상적으로 입력된 경우 // if (19 <= check_age(substr($birth, 0, -1))) { // // 성인(만19세 이상)인 경우 // $HTTP_SESSION_VARS["AdultCard"]["permission"] = "ok"; ?> <META http-equiv='refresh' content='0; url=adult.php'> <?php exit; } } // // 주민등록번호가 틀렸거나 성인이 아닌 경우 // $HTTP_SESSION_VARS["AdultCard"]["permission"] = "no"; ?> <META http-equiv='refresh' content='0; url=home.php'> <?php exit; [/code]
PHP 4.1.0 ~ 일 때
[code php;gutter:false] session_start(); if (!isset($_SESSION["AdultCard"])) { // // 웹사이트에 처음 접속했거나 로그아웃한 경우 // ?> <META http-equiv='refresh' content='0; url=home.php'> <?php exit; } if ($birth=check_jumin($_POST["j1"], $_POST["j2"])) { // // 주민등록번호가 정상적으로 입력된 경우 // if (19 <= check_age(substr($birth, 0, -1))) { // // 성인(만19세 이상)인 경우 // $_SESSION["AdultCard"]["permission"] = "ok"; ?> <META http-equiv='refresh' content='0; url=adult.php'> <?php exit; } } // // 주민등록번호가 틀렸거나 성인이 아닌 경우 // $_SESSION["AdultCard"]["permission"] = "no"; ?> <META http-equiv='refresh' content='0; url=home.php'> <?php exit; [/code]
주민등록번호 2차 검증
주민등록번호 체계
현재 주민등록번호는 1975년부터 사용된 것으로 모두 13개 숫자로 돼 있습니다. 최초 6개 숫자는 생년월일을 나타내고, 뒤쪽 7개 숫자는 출생연대, 성별, 주민등록번호 발급기관, 신고순위 등으로 이루어진 다소 복잡한 구조로된 조합으로 그 조합체계는 공개되어 있지 않습니다.
조합체계에 대한 정확한 내용은 알 수 없으나 아래에 있는 주민등록법 개정행동연대에서 올린 "주민등록번호 체계"에 대한 글을 보시면 그 체계의 일부나마 알 수 있을 것입니다. 확인된 바는 없지만 이러한 조합체계는 시대에 따라(?) 약간의 유동이 있었던 것 같습니다. 따라서 현재 공개되는 주민등록번호 유효성 검증 소스들에는 거의 모두 약간의 오류를 포함하고 있지 않나 생각합니다.
주민등록번호 체계 -- 주민등록법개정행동연대
(수정:2010.1.11) 오래된 문서라서 현재는 링크가 깨진 상태입니다. 주민등록번호 체계에 대하여는 아래를 참조하세요.
우리나라의 주민등록제도는 1962년 주민등록법의 제정으로 처음 도입되었으며, 1975년 주민등록법시행령과 시행규칙의 개정으로 생년월일, 성별, 지역을 식별할 수 있도록 된 13자리의 숫자체제로 바뀌어 현재까지 사용되고 있습니다.
앞의 여섯자리 숫자는 생년월일을 나타냅니다. 뒤의 7자리 숫자는 출생연대, 성별, 주민등록번호 발급기관, 신고순위 및 오류검증번호를 나타냅니다.
뒤의 7자리 숫자 중 맨 앞자리 숫자는 출생연대와 성별을 나타냅니다. 예를 들면, 1900년대에 태어난 남자는 1번, 여자는 2번, 2000년대에 태어난 남자는 3번, 여자는 4번이 부여됩니다.
두 번째 자리부터 다섯번째 자리까지의 네자리 숫자는 최초 주민등록번호 발급기관의 고유번호, 여섯번째 자리는 신고순위, 마지막 일곱번째 숫자는 주민등록번호가 맞는지 여부를 증명해주는 오류수정 번호입니다.
주민번호체계 : YYMMDD - ABCDEFG

YYMMDD : 생년월일
예) 790309

A는 성별을 표시합니다.
예) 2000년대 남자 - 3, 여자 - 4
1900년대 남자 - 1, 여자 - 2
1800년대 남자 - 9, 여자 - 0

BCDE : 최초 주민등록번호 발급기관의 고유번호

F : 주민등록지에서 그 생년월일로 신고된 순서

G : 앞의 숫자들을 조합, 계산하여 산출되는 오류검증번호
주민등록번호 검증 함수
[code php;gutter:false] check_jumin($jumin1, $jumin2) [/code]
지정된 주민등록번호가 유효하면 생년월일 및 성별을 나타내는 문자열을, 틀리면 false를 반환한다. $jumin1은 주민등록번호 중 앞쪽 6자리의 숫자를 나타내는 문자열이며, $jumin2는 뒷쪽 7자리의 숫자를 나타내는 문자열입니다.
반환되는 값의 예를 보면 1991년 1월 12일에 출생한 남성이라면 "19910112M"을 반환하고 여성이라면 "19910112F"를 반환합니다. 아래는 이 함수에 대한 전체 소스입니다. 참고로 말씀드린다면 이와같은 검증 소스를 응용하여 주민등록번호를 임의로 생성해 주는 소스를 제작, 배포하는 것은 현행법상 엄연한 범법행위로 처벌받게 된다는 것을 명심하시기 바랍니다.
[code php;gutter:false] function check_jumin($jumin1, $jumin2) { if(strlen($jumin1) != 6 || strlen($jumin2) != 7) { return false; } $jumin = $jumin1 . $jumin2; for ($i=$sum=0;$i<12;$i++) { $sum += intval($jumin[$i]) * (($i % 8) + 2); } // // Checksum // if ((11 - ($sum % 11)) % 10 != intval($jumin[12])) { return false; } // // 총13자리의 주민등록번호 중 7번째의 숫자는 1부터 4까지의 값을 갖는다. // 이 값에 따라 성별 및 Y2K가 확인된다. // $a = intval($jumin[6]); if ($a < 1 || 4 < $a) { return false; } $sex = ($a % 2) ? "M" : "F"; $year = ($a < 3) ? 1900 : 2000; // // 출생년 확인 // $year += intval(substr($jumin1, 0, 2)); // // 출생월 확인 // $month = intval(substr($jumin1, 2, 2)); if($month < 1 || 12 < $month) { return false; } // // 출생일 확인(각 달에 따른 날수 차이 및 윤달 고려) // $day = intval(substr($jumin1, 4, 2)); $days = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); // // 2월생이면 윤달 확인 // if (2 == $month && check_leapyear($year)) { $days[1] = 29; } if(($day < 1) || ($days[$month-1] < $day)) { return false; } // // 반환값 // // 남성이면 "yyyymmddM", 여성이면 "yyyymmddF" // return "$year" . substr($jumin1, 2) . $sex; } [/code]
여기에 기술된 소스는 제가 작성한 것이 아니고 아래의 출처에서 밝힌 바와 같이 김순제 님이 작성하신 것에 약간의 수정만 가한 것입니다. 이 소스가 정확히 주민등록번호를 검증할 수 있는 것인지에 대하여는 확신할 수가 없네요. 제가 정확한 주민등록번호 검증 알고리즘을 본 일이 없기 때문에 이미 공개된 것을 그대로 가져왔습니다.
제작 : 김순제 님(soonj@lct.co.kr)
수정 : 후키(hwooky@phpclass.com)
따라서 여기서 공개된 성인 인증 소스는 공부삼아 보시기 바라며 진짜로 성인 사이트를 제작하시려거든 아래 업체에서 제공하는 실명확인 서비스를 받아 성인 인증을 수행하기 바랍니다. 실명확인 서비스란 실명과 주민등록번호가 일치하는지 확인해 주는 서비스를 의미하며 이를 이용하기 위해서는 아래 업체에서 해당 서비스를 신청하여야 합니다.
한국신용평가정보㈜(www.kisinfo.co.kr)
정보통신진흥협회(www.kait.or.kr)
한국신용정보(www.idcheck.co.kr)
윤년 확인 함수
주민등록번호의 유효성을 검증하는 과정에서 윤년 여부를 확인하게 됩니다. 아래와 같은 윤년 확인 로직에 의해 출생년도가 윤년인지 확인한 후 윤년인 경우에는 2월달을 29일까지 계산하면 윤년이 아닌 경우에는 28일까지 계산하여 주민등록번호 유효성을 검증합니다.
< 윤년 확인 로직 >
이러한 기능을 수행하는 것이 check_leapyear 함수이며 이 함수를 실행한 결과 윤년이면 true를, 윤년이 아니면 false를 반환합니다.
[code php;gutter:false] check_leapyear($year) [/code]
성인 확인
정보통신망이용촉진및정보보호 등에 관한 법률 및 청소년보호법 모두를 만족하는 성인 나이가 만 19세 이상인지 연 19세 이상인지는 제가 법률적 지식이 없어 잘 모르겠으나 현재 대부분의 성인 사이트들이 만19세 이상을 성인으로 인증하고 있으며 이에 따라 제가 공개하는 성인 사이트용 인증 소스도 만 19세 이상을 기준으로 인증하고 있습니다. 만약 향후 만 19세 이상이 아니고 연 19세 이상으로 그 기준이 변경되었을 경우에는 성인 확인 부분을 약간 수정하셔야 할 것입니다. 그러나 연나이는 우리나라 나이보다 1살 적기 때문에 "현재년도 - 주민등록년도"라는 수식으로 쉽게 구할 수 있습니다.
참고삼아 말씀드린다면 2001년 5월 24일 개정된 청소년보호법 제2조제1호에 의하면 청소년의 기준이 만나이에서 연나이로 변경되었는데 그 내용을 보면 아래와 같이 정의되어 있습니다.
"청소년"이라 함은 만 19세 미만의 자를 말한다.
다만, 만 19세에 도달하는 해의 1월 1일을 맞이한 자를 제외한다.
<<시행일 2001.8.25>>
`年나이'는 생일로부터 다음해 1월 1일을 지난 횟수만큼을 나이로 인정해 주는 방법으로 예를 들어 2001년 8월23일을 기준으로 1999년 9월 9일생의 경우 `滿나이'로는 한 살, 통상 국내에서 통용하는 나이개념으로는 세 살이 되지만 年나이로는 1월1일을 두 차례 지났기 때문에 두살이 됩니다.
`年나이 19세미만'으로 바뀌면 정상 나이의 대학 1년생의 경우 대학에 입학하는 해 1월1일부터 12월31일까지의 연 나이가 만19세로 돼 청소년보호법의 적용을 받지 않게 됩니다. 이는 생년월일에 따라 만 18세에서 만 19세로 전환되는 시점이 개인마다 달라 생일을 일일이 따져야 하는 불편과 대학 1년생에 대해서는 성인으로 간주하는 사회적 통념과의 괴리를 없애기 위한 것입니다.
滿나이 계산 함수
우리의 전통적인 나이 계산법에 의하면 아래와 같이 나이를 구할 수 있을 것입니다.
우리나라 나이 = 현재년도 - 주민등록년도 + 1
반면 서양식 나이 계산법인 만나이는 현재 생일이 지났을 경우에는 우리나라 나이보다 1살이 적고, 생일이 지나지 않았을 경우에는 2살이 적은 나이입니다. 이러한 만나이를 구하는 함수가 check_age입니다. 이 함수의 입력값으로는 "yyyymmdd" 형태의 문자열을 지정하여 줍니다. 예를 들면 1999년 5월 20일 생이면 "19990520"이 되는 것입니다. 이 함수를 실행하면 정수값으로 만나이를 반환시켜 줍니다.
[code php;gutter:false] check_age($birth) [/code]
이 함수의 전체 소스를 살펴보면 다음과 같습니다. 중간에 있는 $cur_year - $birth_year 의 결과가 바로 연나이에 해당합니다.
[code php;gutter:false] function check_age($birth) { $cur_year = intval(date("Y")); $birth_year = intval(substr($birth, 0, 4)); // // $age + 1 이 우리나라 나이임 // $age = $cur_year - $birth_year; // // month = 01 ~ 12 // day = 01 ~ 31 // $cur_day = intval(date("md")); $birth_day = intval(substr($birth, 4)); if ($cur_day <= $birth_day) { // // 생일이 지나지 않았으면 // $age--; } return $age; } [/code]

Posted by 방글24