서버에서 SMS 인증 실행

전화번호를 자동으로 확인하려면 인증 흐름에서 클라이언트와 서버 부분을 모두 구현해야 합니다. 이 문서에서는 서버 부분을 구현하는 방법을 설명합니다.

전화 인증 서버는 다음 세 가지 작업을 수행합니다.

  1. 일회성 코드가 포함되며 클라이언트 측 SMS Retriever API가 예상하는 형식을 사용하는 인증 메시지를 구성합니다.
  2. 사용자의 기기로 확인 메시지 전송
  3. 코드가 서버로 다시 전송될 때 일회용 코드를 확인하고 백엔드가 요구하는 사후 작업 완료

앱이 서버와 상호작용하는 방식에 관한 세부정보는 개발자에게 달려 있습니다. 일반적인 방법은 두 가지 엔드포인트가 있는 REST API를 노출하는 것입니다. 엔드포인트는 특정 전화번호 인증 요청을 수신하고 SMS 인증 메시지를 전송하며, 두 번째 엔드포인트는 앱에서 일회성 코드를 수신합니다.

1. 인증 메시지 작성하기

서버에서 전화번호 인증 요청을 수신하면 먼저 사용자의 기기로 전송할 확인 메시지를 작성합니다. 이 메시지는 다음을 충족해야 합니다.

  • 140바이트 이하여야 합니다.
  • 클라이언트가 서버로 다시 전송하여 인증 절차를 완료하는 일회성 코드를 포함합니다 (일회용 코드 생성 참고).
  • 앱을 식별하는 11자 해시 문자열을 포함합니다 (앱 해시 문자열 계산 참고).

그렇지 않으면 인증 메시지의 내용을 원하는 대로 선택할 수 있습니다. 나중에 일회용 코드를 쉽게 추출할 수 있는 메시지를 만드는 것이 좋습니다. 예를 들어 유효한 확인 메시지는 다음과 같습니다.

Your ExampleApp code is: 123ABC78

FA+9qCX9VSu

일회용 코드 생성

코드가 명확하지 않고 클라이언트 앱이 서버에 다시 전송할 때 코드를 사용자 또는 전화번호에 연결할 수 있다면 여러 가지 방법으로 일회용 코드를 구현할 수 있습니다. 사용자가 코드를 수동으로 입력해야 하는 상황에 맞게 코드를 쉽게 입력할 수 있도록 해야 합니다.

일회용 코드를 구현하는 한 가지 방법은 랜덤 숫자를 생성하여 데이터베이스 테이블에서 키로 사용하는 것입니다. 예를 들어 다음과 같은 PendingVerifications 테이블이 있을 수 있습니다.

ID 사용자 만료
123456789... 1234 2017년 3월 14일 1:59

base32로 인코딩된 ID를 일회용 코드로 사용할 수 있습니다.

앱의 해시 문자열 계산

Google Play 서비스는 해시 문자열을 사용하여 앱에 전송할 확인 메시지를 결정합니다. 해시 문자열은 앱의 패키지 이름과 앱의 공개 키 인증서로 구성됩니다. 해시 문자열을 생성하려면 다음 안내를 따르세요.

  1. Google Play 앱 서명을 사용하는 경우 Google Play Console앱 서명 섹션에서 앱 서명 인증서(deployment_cert.der)를 다운로드합니다.

    그런 다음 앱 서명 인증서를 임시 키 저장소로 가져옵니다.

    keytool -importcert -file deployment_cert.der -keystore temporary.keystore -alias PlayDeploymentCert
    

    APK에 직접 서명하는 경우 이 단계를 건너뛰세요.

  2. 앱 서명 인증서(위에서 가져온 인증서 또는 APK에 직접 서명하는 데 사용하는 인증서)를 16진수 소문자로 가져옵니다.

    예를 들어 위에서 만든 임시 키 저장소의 16진수 문자열을 가져오려면

    keytool -exportcert -keystore temporary.keystore -alias PlayDeploymentCert | xxd -p | tr -d "[:space:]"
    
    명령어를 입력합니다.

    APK에 직접 서명하는 경우 프로덕션 키 저장소와 인증서 별칭을 지정합니다.

  3. 임시 키 저장소를 만든 경우 삭제합니다.

  4. 앱의 패키지 이름에 16진수 문자열을 단일 공백으로 구분하여 추가합니다.

  5. 결합된 문자열의 SHA-256 sum을 계산합니다. SHA-256 합계를 계산하기 전에 문자열에서 선행 또는 후행 공백을 삭제해야 합니다.

  6. SHA-256 sum의 바이너리 값을 Base64로 인코딩합니다. 먼저 출력 형식에서 SHA-256 sum을 디코딩해야 할 수 있습니다.

  7. 앱의 해시 문자열은 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. 코드가 반환되면 일회용 코드를 확인하세요.

일반적으로 전화번호 확인 서버에는 클라이언트 앱에서 일회성 코드를 수신하는 데 사용하는 두 번째 엔드포인트가 있습니다. 서버가 앱 엔드포인트에서 이 엔드포인트의 일회용 코드를 받으면 다음 단계를 따르세요.

  1. 일회성 코드가 유효하고 만료되지 않았는지 확인합니다.
  2. 일회성 코드에 연결된 사용자가 전화번호 인증을 완료했음을 기록합니다.
  3. 일회성 코드를 삭제하거나 다른 방식으로 동일한 코드를 다시 사용할 수 없도록 합니다.

사용자의 인증 상태를 기록하고 데이터베이스에서 일회용 코드를 삭제하면 인증이 완료됩니다.