안드로이드에서 파이어베이스 전화번호 인증 5분 만에 구현하는 방법

2026-07-13 · 테크 · 읽는데 10분

파이어베이스 전화번호 인증은 SMS로 전송된 일회용 코드를 사용해 사용자를 로그인 처리하는 방식입니다. Firebase SDK와 기존 프로젝트 설정이 갖춰져 있다면 핵심 로직만 추가하면 되며, 5분 이내에 기본 구현이 가능합니다. 이 글에서는 안드로이드 앱에서 파이어베이스 전화번호 인증을 구현하는 전체 과정을 실제 코드 예시와 함께 설명합니다.

전화번호 인증을 시작하기 전에 준비할 것

Firebase 전화번호 인증을 사용하려면 먼저 Firebase 프로젝트와 안드로이드 앱이 연결되어 있어야 합니다. 다음 항목이 준비되었는지 확인하세요.

  • Firebase 프로젝트 생성 및 앱 등록 완료
  • Firebase 콘솔에서 인증 방법(전화번호) 활성화
  • 앱 수준의 build.gradle에 Firebase Auth 종속성 추가
// Firebase BoM 사용 권장
implementation platform('com.google.firebase:firebase-bom:32.0.0')
implementation 'com.google.firebase:firebase-auth'

Firebase BoM을 사용하면 라이브러리 버전 충돌을 피할 수 있습니다. BoM을 사용하지 않는다면 각 라이브러리 버전을 직접 명시해야 하며, 모든 Firebase 라이브러리가 호환되도록 관리해야 합니다.

Firebase 콘솔에서 인증 > 로그인 방법 메뉴로 이동해 전화번호를 사용 설정한 후 저장하는 것도 잊지 마세요.

전화번호 인증 요청을 보내는 방법

사용자에게 전화번호를 입력받는 UI를 준비한 다음, PhoneAuthProvider.verifyPhoneNumber()를 호출해 인증을 요청합니다. 이 메서드는 재진입이 가능하므로 액티비티의 onStart()에서 여러 번 호출해도 원래 요청이 시간 초과되지 않았다면 SMS를 재발송하지 않습니다.

val phoneNumber = "+82" + userInputNumber // 국가번호 +82(한국)를 앞에 붙임
val options = PhoneAuthOptions.newBuilder(auth)
    .setPhoneNumber(phoneNumber)       // 전화번호
    .setTimeout(60L, TimeUnit.SECONDS) // 타임아웃 시간
    .setActivity(this)                 // 액티비티 전달 (회전 등 대응)
    .setCallbacks(callbacks)           // 콜백 객체
    .build()
PhoneAuthProvider.verifyPhoneNumber(options)

사용자가 입력한 번호에 국가번호(+82)를 직접 붙이는 방식이 일반적입니다. 우리나라 사용자에게는 "010-1234-5678" 형태로 입력받고 코드에서 변환하는 편이 UX에 좋습니다.

인증 상태를 처리하는 콜백 구현하기

verifyPhoneNumber()를 호출할 때 반드시 OnVerificationStateChangedCallbacks 인스턴스를 제공해야 합니다. 다음 네 가지 콜백 중 필요한 것을 구현합니다.

private val callbacks = object : PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
    override fun onVerificationCompleted(credential: PhoneAuthCredential) {
        // 자동 인증 성공 시 (SMS 자동 수신 등)
        signInWithPhoneAuthCredential(credential)
    }

    override fun onVerificationFailed(e: FirebaseException) {
        // 인증 실패 시 (잘못된 번호, 네트워크 오류 등)
        Log.w(TAG, "onVerificationFailed", e)
    }

    override fun onCodeSent(
        verificationId: String,
        token: PhoneAuthProvider.ForceResendingToken
    ) {
        // SMS 코드가 전송된 후 호출
        // verificationId를 저장하고 사용자에게 코드 입력 UI를 보여줌
    }

    override fun onCodeAutoRetrievalTimeOut(verificationId: String) {
        // 자동 인증 타임아웃 발생 시
    }
}

대부분의 앱에서는 onVerificationCompleted, onVerificationFailed, onCodeSent를 구현합니다. onVerificationCompleted가 호출되면 이미 인증이 완료된 상태이므로 바로 로그인 처리를 진행하면 됩니다. onCodeSent에서는 인증 ID(verificationId)를 저장해두고, 사용자가 SMS로 받은 인증 코드를 입력했을 때 사용합니다.

사용자가 입력한 인증 코드로 로그인 처리하기

사용자가 SMS로 받은 인증 코드를 입력하면, 저장해둔 verificationId와 코드를 조합해 PhoneAuthCredential을 생성합니다. 그런 다음 FirebaseAuth.signInWithCredential()을 호출해 로그인을 완료합니다.

fun verifyCode(code: String) {
    val credential = PhoneAuthProvider.getCredential(verificationId, code)
    signInWithPhoneAuthCredential(credential)
}

private fun signInWithPhoneAuthCredential(credential: PhoneAuthCredential) {
    auth.signInWithCredential(credential)
        .addOnCompleteListener(this) { task ->
            if (task.isSuccessful) {
                // 로그인 성공
                val user = task.result?.user
            } else {
                // 로그인 실패
                Log.w(TAG, "signInWithCredential:failure", task.exception)
            }
        }
}

onVerificationCompleted 콜백에서 이미 PhoneAuthCredential을 받은 경우에는 이 단계를 건너뛰고 바로 signInWithCredential()을 호출하면 됩니다.

테스트 전화번호로 개발 중 문제 피하기

실제 전화번호로 인증 테스트를 여러 번 하면 Google의 스팸 방지 정책에 의해 해당 기기에서 일시적으로 인증 요청이 차단될 수 있습니다. Firebase 콘솔에서 가상 전화번호를 설정해 테스트하는 것이 안전합니다.

Firebase 콘솔 > 인증 > 전화번호(로그인 방법) > 테스트 전화번호 메뉴에서 전화번호와 인증 코드를 등록합니다. 예를 들어 전화번호는 +82 10 0000 0000, 인증 코드는 123456처럼 입력합니다.

  • 가상 번호로 테스트하면 실제 SMS가 발송되지 않음
  • 정해진 인증 코드를 입력해 로그인 완료 가능
  • 할당량 제한이나 SIM 카드 없이도 Android 에뮬레이터에서 테스트 가능

테스트 완료 후에는 앱을 배포하기 전에 Firebase 콘솔에서 앱 인증 사용 중지 설정을 반드시 해제해야 합니다. Play 스토어에 게시된 앱에서 이 기능이 활성화되어 있으면 실제 사용자가 인증을 통과하지 못할 수 있습니다.

전화번호 인증 시 주의할 점

전화번호 인증은 편리하지만 보안 측면에서 한계가 있습니다. 전화번호 소유권은 사용자 간에 쉽게 이전될 수 있고, 기기에 여러 사용자 프로필이 있는 경우 SMS를 받을 수 있는 사람이라면 누구든지 로그인할 수 있습니다.

  • 더 안전한 로그인 방법과 병행하는 것이 좋습니다. 예를 들어 이메일 로그인이나 Google 로그인을 기본으로 제공하고, 전화번호 인증은 추가 옵션으로 두는 방식입니다.
  • 사용자에게 고지해야 합니다. 전화번호 로그인을 사용하면 인증용 SMS가 발송되고 일반 요금이 부과될 수 있다는 점, 그리고 이 방식이 다른 방법보다 보안성이 낮을 수 있다는 점을 알리는 것이 바람직합니다.
  • SMS 메시지 현지화가 가능합니다. FirebaseAuth 인스턴스의 setLanguageCode("ko")를 호출하면 SMS 메시지가 한국어로 전송됩니다.

자주 묻는 질문

Q. 전화번호 인증 요청을 여러 번 하면 문자가 오지 않습니다. 어떻게 해결하나요?

Google의 스팸 방지 정책 때문에 일정 시간 동안 인증 요청이 차단된 상태입니다. 일반적으로 몇 시간에서 하루 정도 지나면 다시 요청할 수 있습니다. 개발 중에는 Firebase 콘솔에서 테스트 전화번호를 등록해 사용하는 것을 권장합니다.

Q. Firebase 로그인이 안 된 상태에서 전화번호 인증을 구현하려면 어떻게 하나요?

onVerificationCompleted() 콜백이 호출되지 않을 수 있습니다. 이 경우 onCodeSent()에서 받은 verificationId와 사용자가 입력한 인증 코드를 이용해 PhoneAuthCredential을 생성하고, signInWithCredential()을 호출해 로그인을 처리해야 합니다. 별도의 이메일 로그인 등 사전 인증이 필요하지 않습니다.

Q. Android 에뮬레이터에서도 전화번호 인증을 테스트할 수 있나요?

가능합니다. Firebase 콘솔에서 테스트 전화번호를 등록한 후, 앱 인증 사용 중지 설정을 활성화하면 에뮬레이터에서도 SMS 없이 인증 코드를 입력해 테스트할 수 있습니다. 단, 가상 전화번호만 사용 가능하며 실제 번호로는 로그인에 실패합니다.