서버에서 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 합계를 계산합니다. SHA-256 합계를 계산하기 전에 문자열에서 선행 또는 후행 공백을 삭제해야 합니다.

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

  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. 일회성 코드의 데이터베이스 레코드를 삭제하거나 다른 방법으로 동일한 코드를 다시 사용할 수 없도록 합니다.

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