전화번호를 자동으로 인증하려면 인증 흐름의 클라이언트 부분과 서버 부분을 모두 구현해야 합니다. 이 문서에서는 서버 부분을 구현하는 방법을 설명합니다.
전화 인증 서버는 세 가지 작업을 담당합니다.
- 일회용 코드를 포함하고 클라이언트 측 SMS Retriever API에 필요한 형식을 갖는 인증 메시지 구성
- 사용자 기기로 인증 메시지 전송
- 코드가 서버로 다시 전송될 때 일회성 코드를 확인하고 백엔드에 필요한 사후 확인 작업을 완료합니다.
앱이 서버와 상호작용하는 방식의 세부 사항은 개발자가 결정합니다. 일반적인 방법은 두 개의 엔드포인트로 REST API를 노출하는 것입니다. 하나는 지정된 전화번호 인증 요청을 수신하고 SMS 확인 메시지를 전송하는 엔드포인트이고, 다른 하나는 앱에서 일회성 코드를 수신하는 두 번째 엔드포인트입니다.
1. 인증 메시지 작성
서버가 전화번호 인증 요청을 수신하면 먼저 사용자의 기기로 보낼 인증 메시지를 작성합니다. 이 메시지는 다음 조건을 충족해야 합니다.
- 140바이트 이하여야 합니다.
- 클라이언트가 인증 과정을 완료하기 위해 서버로 다시 전송하는 일회성 코드를 포함합니다 (일회용 코드 생성 참조).
- 앱을 식별하는 11자 해시 문자열을 포함합니다 (앱 해시 문자열 계산 참고).
그 외에는 확인 메일의 내용을 원하는 대로 선택할 수 있습니다. 나중에 일회용 코드를 쉽게 추출할 수 있는 메시지를 만들면 유용합니다. 예를 들어 유효한 확인 메시지는 다음과 같을 수 있습니다.
Your ExampleApp code is: 123ABC78FA+9qCX9VSu
일회용 코드 생성
코드를 추측할 수 없다면 다양한 방식으로 일회용 코드를 구현할 수 있으며 클라이언트 앱에서 코드를 서버로 다시 보낼 때 코드를 사용자 또는 전화번호에 연결할 수 있습니다. 사용자가 코드를 수동으로 입력해야 하는 상황을 수용할 수 있도록 코드를 쉽게 입력할 수 있도록 해야 합니다.
일회성 코드를 구현하는 한 가지 방법은 데이터베이스 표에서 키로 사용하는 랜덤 숫자를 생성하는 것입니다. 예를 들어 다음과 같은 PendingVerifications 테이블이 있을 수 있습니다.
ID | 사용자 | 만료 |
---|---|---|
123456789... | 1234 | 2017-3-14 1:59 |
base32로 인코딩된 ID를 일회성 코드로 사용할 수 있습니다.
앱의 해시 문자열 계산
Google Play 서비스는 해시 문자열을 사용하여 앱에 전송할 확인 메시지를 결정합니다. 해시 문자열은 앱의 패키지 이름과 앱의 공개키 인증서로 구성됩니다. 해시 문자열을 생성하려면 다음 안내를 따르세요.
Google Play 앱 서명을 사용하는 경우 Google Play Console의 앱 서명 섹션에서 앱 서명 인증서 (
deployment_cert.der
)를 다운로드합니다.그런 다음 앱 서명 인증서를 임시 키 저장소로 가져옵니다.
keytool -importcert -file deployment_cert.der -keystore temporary.keystore -alias PlayDeploymentCert
APK에 직접 서명하는 경우 이 단계를 건너뛰세요.
앱 서명 인증서(위에서 가져온 인증서 또는 APK에 직접 서명하는 데 사용하는 인증서)를 소문자 16진수 문자열로 가져옵니다.
예를 들어 위에서 만든 임시 키 저장소에서 16진수 문자열을 가져오려면 다음 명령어를 입력합니다.
keytool -exportcert -keystore temporary.keystore -alias PlayDeploymentCert | xxd -p | tr -d "[:space:]"
APK에 직접 서명하는 경우 프로덕션 키 저장소와 인증서 별칭을 지정합니다.
임시 키 저장소를 생성했다면 삭제합니다.
앱의 패키지 이름에 16진수 문자열을 공백으로 구분하여 추가합니다.
결합된 문자열의 SHA-256 합계를 계산합니다. SHA-256 합계를 계산하기 전에 문자열에서 선행 또는 후행 공백을 삭제해야 합니다.
SHA-256 합계의 바이너리 값을 Base64로 인코딩합니다. 먼저 출력 형식에서 SHA-256 합계를 디코딩해야 할 수도 있습니다.
앱의 해시 문자열은 base64로 인코딩된 해시의 처음 11자입니다.
다음 명령어는 앱의 프로덕션 키 저장소에서 해시 문자열을 계산합니다.
keytool -exportcert -alias PlayDeploymentCert -keystore MyProductionKeys.keystore | xxd -p | tr -d "[:space:]" | echo -n com.example.myapp `cat` | sha256sum | tr -d "[:space:]-" | xxd -r -p | base64 | cut -c1-11
또는 SMS 검색기 샘플 앱에서 AppSignatureHelper 클래스를 사용하여 앱의 해시 문자열을 가져올 수 있습니다. 그러나 도우미 클래스를 사용하는 경우 해시 문자열을 가져온 후 앱에서 삭제해야 합니다. 클라이언트에서 동적으로 계산된 해시 문자열을 인증 메시지에 사용하지 마세요.
2. SMS로 확인 메시지 보내기
인증 메시지를 작성한 후 SMS 시스템을 사용하여 사용자의 전화번호로 메시지를 보냅니다.
예를 들어 Twilio의 개발자 사이트에 있는 Twilio SMS를 사용하여 앱 확인을 참조하세요.
사용자 기기가 이 메시지를 수신하면 메시지가 앱으로 전달됩니다. 앱에서 일회용 코드를 추출하여 서버로 다시 전송하여 인증 절차를 완료합니다.
3. 일회용 코드가 반환되면 인증
전화번호 확인 서버에는 일반적으로 클라이언트 앱에서 일회성 코드를 다시 수신하는 데 사용하는 두 번째 엔드포인트가 있습니다. 서버가 이 엔드포인트에서 앱에서 일회성 코드를 수신하면 다음 단계를 따르세요.
- 일회용 코드가 올바르고 만료되지 않았는지 확인하세요.
- 일회용 코드에 연결된 사용자가 전화번호 인증을 완료했음을 기록합니다.
- 일회성 코드의 데이터베이스 레코드를 삭제하거나 다른 방법으로 동일한 코드를 다시 사용할 수 없도록 합니다.
사용자의 확인 상태를 기록하고 데이터베이스에서 일회성 코드를 삭제하면 확인이 완료됩니다.