Computer >> 컴퓨터 >  >> 프로그래밍 >> PHP

PHP로 숫자 일회용 비밀번호(OTP) 생성하는 프로그램

웹 개발에서 회원 인증, 본인 확인 등의 절차에 일회용 비밀번호(OTP, One-Time Password)가 널리 사용됩니다. 이번 글에서는 PHP를 이용해 원하는 길이의 숫자형 OTP를 생성하는 방법을 알아보겠습니다.

기본 구현 예제

아래 코드는 지정한 자릿수만큼 무작위 숫자로 구성된 일회용 비밀번호를 생성하는 함수입니다.

<?php
function generate_otp($n)
{
    $gen = "1357902468";
    $res = "";
    for ($i = 1; $i <= $n; $i++) {
        $res .= substr($gen, (rand() % strlen($gen)), 1);
    }
    return $res;
}
$num = 8;
print_r("생성된 일회용 비밀번호 : ");
print_r(generate_otp($num));
?>

실행 결과

생성된 일회용 비밀번호 : 52471609

코드 동작 원리

이 코드의 작동 과정을 단계별로 살펴보면 다음과 같습니다.

1. 함수 정의

먼저 generate_otp라는 이름의 함수를 정의하고, 매개변수 $n으로 생성할 비밀번호의 길이(자릿수)를 전달받습니다.

2. 숫자 문자열 준비

변수 $gen에는 0부터 9까지의 숫자가 포함된 문자열이 저장됩니다. 이 문자열은 무작위 숫자를 뽑아올 '재료' 역할을 합니다.

3. 반복문을 통한 무작위 숫자 추출

for 반복문이 지정된 길이만큼 실행되며, 매 반복마다 rand() 함수로 생성된 무작위 인덱스를 이용해 substr()로 숫자 하나를 추출합니다. 추출된 숫자는 결과 문자열 $res에 차례대로 연결됩니다.

4. 결과 반환 및 출력

모든 자릿수가 채워지면 완성된 숫자 비밀번호를 반환하고, print_r()을 통해 화면에 출력합니다. 위 예제에서는 8자리 OTP를 생성하도록 설정했습니다.

더 안전한 방법: random_int() 활용

PHP 7 이상을 사용한다면 보안성이 중요한 OTP 생성 시 rand() 대신 암호학적으로 안전한 난수를 제공하는 random_int() 함수를 사용하는 것이 좋습니다.

<?php
function generate_secure_otp($length)
{
    $otp = "";
    for ($i = 0; $i < $length; $i++) {
        $otp .= random_int(0, 9);
    }
    return $otp;
}
echo generate_secure_otp(8); // 예: 73910462
?>

random_int()는 CSPRNG(Cryptographically Secure Pseudo-Random Number Generator) 기반으로 동작하기 때문에 인증용 OTP처럼 예측 가능성이 낮아야 하는 상황에 적합합니다.

마무리

이처럼 PHP에서는 간단한 함수 몇 줄만으로 원하는 길이의 숫자형 일회용 비밀번호를 손쉽게 생성할 수 있습니다. 실제 서비스에 적용할 때는 보안 요구 수준에 따라 random_int() 사용 여부와 함께, 생성된 OTP의 유효 시간 관리·저장 방식 등도 함께 고려하는 것이 바람직합니다.