출처 - https://developers-kr.googleblog.com/2017/11/effective-phone-number-verification.html
<블로그 원문은 여기에서 확인하실 수 있으며, 블로그 번역 리뷰는 양찬석(Google)님이 참여해 주셨습니다.>
게시자: Steven Soneff, 신원 확인 제품 관리자
전화번호를 활용하는 앱을 만들 때, 사용자가 전화번호를 소유하고 있는지 인증할 필요가 있습니다. 하지만 전화 번호 인증은 여러가지 면에서 까다로올 수 있습니다. UX 관점에서 여러 로케일의 전화번호 형식을 지원해야 하고, 간편한 사용자 인증을 위해 사용자의 SMS를 확인하기 위해서 위험한 등급의 사용자 권한을 요구해야합니다.
Firebase 전화 인증과 같이 미리 구현된 전화 인증 라이브러리가 있지만, 이러한 기능을 직접 만들어야 하는 경우, Google Play Service에서 새롭게 제공하는 두 가지 API인 Phone Selector와 SMS Retriever를 활용할 수 있습니다. 이를 활용해, 추가 적인 기기 권한 요청 없이 SMS를 통해 사용자 전화 번호를 확인하고 바로 인증을 진행할 수 있습니다. Flipkart와 같은 앱에서는 이 방법을 사용하여 전화번호 가입 과정 성공률을 12% 높일 수 있었습니다.
서버에서 이러한 API를 활용하기 위한 단계는 다음에서 확인할 수 있습니다.
그럼 전화번호 선택기를 제공하는 방법과 이 후 SMS Retriever API를 활용해, 서버로부터 인증 코드를 요청하는 방법을 살펴보겠습니다. 결과적으로 안드로이드 디바이스 상에서 사용자 입력 과정 없이 자동으로 인증 코드를 수신하여 파싱할 수 있습니다.
참고: 시작하기 전에 전화 번호가 있고, SMS를 수신할 수 있으며, Google Play Service 10.2.x 이상이 설치된 기기에서 아래 기능을 테스트할 수 있습니다.
Phone Selector를 사용하여 전화번호 가져오기
첫 번째 단계에서는 사용자가 앱 내에서 SMS 인증을 시작하도록 합니다. 앱에서 전화번호를 입력하라는 메시지를 사용자에게 표시합니다. 다음과 같이 Phone Selector를 사용해 이 기능을 쉽게 구현할 수 있습니다.
// Construct a request for phone numbers and show the picker private void requestHint() { HintRequest hintRequest = new HintRequest.Builder() .setPhoneNumberIdentifierSupported(true) .build(); PendingIntent intent = Auth.CredentialsApi.getHintPickerIntent( apiClient, hintRequest); startIntentSenderForResult(intent.getIntentSender(), RESOLVE_HINT, null, 0, 0, 0); }
HintRequest 빌더는 전화번호 식별자가 필요하다는 사실을 Play Service에 알립니다. 그 후, 사용자가 전화번호를 선택할 수 있는 Play Service 대화상자를 표시하기 위한 인텐트를 만듭니다. 이 API는 어떠한 사용 권한도 요구하지 않고, 휴대폰 또는 Google 계정에서 얻을 수 있는 번호를 사용자가 선택할 수 있도록 표시합니다.
사용자가 전화번호를 선택하면 최신 버전의 Play Service를 실행하는 기기에서 E164 형식으로 onActivityResult에서 애플리케이션에 이 전화번호가 반환됩니다. 어떤 경우에는 휴대폰에 따라 전화번호를 가져오지 못할 수도 있으므로 자격 증명이 null이 아닌지 여부를 확인해야 합니다. 전화번호가 없으면 사용자가 수동으로 입력할 수 있는 방법을 제공할 필요가 있습니다.
// Obtain the phone number from the result @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == RESOLVE_HINT) { if (resultCode == RESULT_OK) { Credential credential = data.getParcelableExtra(Credential.EXTRA_KEY); // credential.getId(); <-- E.164 format phone number on 10.2.+ devices } } }
이제, 사용자 전화번호를 확인했습니다. 이 방법이 유용하기는 하지만, 개발자는 해당 사용자가 이 전화번호를 소유하고 있는지 인증해야합니다. 예를 들어, 이 번호를 사용하여 다른 사용자와 메시지를 주고받거나 이 번호로 사용자 자신의 신원을 확인할 수 있는지 여부를 확인하고 싶을 것입니다.
SMS Verification API를 활용하여 전화번호 인증
전화번호 소유 여부를 확인하는 간단한 방법은 일회성 인증 코드를 포함한 SMS를 해당 번호로 보내고 앱에 입력하도록 하는 것입니다. SMS Verification API는 앱이 들어오는 SMS를 수신할 수 있는 기능을 제공합니다. 그러면 앱이 이렇게 이 SMS에서 자동으로 코드를 파싱할 수 있습니다.
앱은 다음과 같이 SmsRetrieverClient
를 구현합니다..
SmsRetrieverClient client = SmsRetriever.getClient(this /* context */); Task<Void> task = client.startSmsRetriever(); task.addOnSuccessListener(new OnSuccessListener<Void>() { @Override public void onSuccess(Void aVoid) { // successfully started an SMS Retriever for one SMS message } }); task.addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { }); );
그 후, 작업을 시작하기만 하면 됩니다. on Success 리스너뿐만 아니라, 문제가 발생한 경우 이를 처리하기 위한 on Failure 리스너도 포함되어 있습니다. SMS Retriever를 시작한 후에는 사용자의 전화번호를 서버로 보내고 메시지를 생성하여 해당 번호로 보내기 위한 워크플로를 시작해야 합니다.
이 메시지는 특정 방식으로 구성되어야 합니다. 메시지는 SMS 메시지 크기에 맞아야 하므로, 140바이트를 초과할 수 없습니다. '<#>' 또는 두 개의 연속되고 폭이 없는 공백 문자(U + 200B)를 특정 접두사로 사용하여 시작해야 합니다. 자세한 내용은 해당 문서를 참조하세요. 아래의 설명과 같이 앱을 식별하는 11자 길이의 해시로 끝나야 합니다.
예: <#> Use 123456 as your verification code in Example App!
FA+9qCX9VSu
일회성 인증 코드는 어떠한 문자열이든 가능하며, 단순하게 임의의 숫자를 생성해도 됩니다. 메시지는 여기에 제시된 절차에 따라 판별되는 해시로 끝나야 합니다. Google Play Service는 이 해시를 사용하여 인증 메시지에 해당하는 앱을 결정합니다. 앱 패키지 및 서명 인증서용으로 이 해시를 한 번만 생성하면 됩니다. 이 해시는 변경되지 않으며 클라이언트 앱에서 제공되지 않습니다.
그러면 서버가 기존에 구축한 SMS 인프라 또는 서비스를 사용하여 휴대폰으로 메시지를 보낼 수 있습니다. 이 메시지가 수신되면 Google Play Service가 메시지의 텍스트를 포함하는 인텐트를 브로드캐스트합니다. 코드는 다음과 같습니다.
public class MySMSBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (SmsRetriever.SMS_RETRIEVED_ACTION.equals(intent.getAction())) { Bundle extras = intent.getExtras(); Status status = (Status) extras.get(SmsRetriever.EXTRA_STATUS); switch(status.getStatusCode()) { case CommonStatusCodes.SUCCESS: String message = (String) extras.get(SmsRetriever.EXTRA_SMS_MESSAGE); break; case CommonStatusCodes.TIMEOUT: break; } } } }
브로드캐스트 리시버의 onReceive에서 추가 항목을 얻고 그곳에서 상태를 확인합니다. 메시지가 성공적으로 수신된 경우, 추가 항목에서 메시지를 확인 할 수 있습니다. 여기에서 인증 코드를 파싱하고 서버로 다시 전송하여 전화번호 소유 여부를 확인할 수 있습니다.
자세한 내용은 전체 문서와 올해 진행된 Google I/O 세션을 확인하시기 바랍니다.
얼리 어답터의 사용 후기
이 API를 일찍 사용해 본 파트너들은 긍정적인 반응을 보이고 있습니다. 다음은 이들 파트너의 사용 후기를 일부 발췌한 내용입니다.
Twilio는 안드로이드 SMS 인증이 그 어느 때보다도 쉬워졌다는 사실을 확인하고는 이에 대한 내용을 블로그에 올렸습니다.
"전화번호를 사용해 사용자 계정을 등록하고 식별하는 안드로이드용 모바일 앱을 빌드하는 개발자라면 안드로이드용 Twilio Verification SDK를 꼭 사용해 보세요. 그러면 매끄럽고 안전하고 쉬운 가입 절차 제공 문제를 그 어느 때보다도 빠르게 해결하실 수 있을 겁니다." - Simil Thorpe, Twilio의 제품 소유자
Authy는 이러한 API가 많은 변경 사항을 수행할 필요 없이 기존의 SMS 인프라와 잘 연동된다는 사실에 만족감을 표시했습니다.
"Phone Selector와 SMS Retriever를 Authy 2FA 앱에 추가하면 애플리케이션에 필요한 높은 수준의 보안을 유지하는 동시에 사용자에게 놀라울 정도로 뛰어난 UX를 제공할 수 있습니다." - Serge Kruppa, Authy 엔지니어링 책임자
Telesign은 동일한 백엔드 프레임워크에서 UX가 향상되고 보안이 강화되며 전환율이 증가한다는 점을 확인했습니다.
"번거로운 부분이 줄어든 이러한 인증 모드를 통해 얻을 수 있는 유의미한 장점 중 하나는 고객이 사용자 가입 및 등록 과정에서 전환율이 증가하는 것을 눈으로 볼 수 있다는 점입니다.
Google Play Service는 SMS 메시지를 해당 메시지 내의 애플리케이션 해시를 기반으로 대상 애플리케이션만 액세스할 수 있도록 허용하므로, 이를 통해 보안 강화라는 이점도 얻을 수 있습니다."- Priyesh Jain(게시물 작성자)
'개발 > Google Developers korea 블로그' 카테고리의 다른 글
개발자를 위한 안드로이드 9 파이 (Pie)를 소개합니다 (0) | 2018.09.06 |
---|---|
최신 안드로이드 버전인 Android P를 소개합니다. (0) | 2018.03.29 |
최신 디바이스의 더 커진 화면을 위해 새로운 화면비(Screen Aspect Ratio)를 설정해 보세요. (0) | 2017.04.11 |
새로운 폰트, Noto Serif CJK를 지금 바로 확인해 보세요! (0) | 2017.04.11 |
안드로이드 O의 첫번째 Developer Preview가 찾아왔습니다! (1) | 2017.04.11 |
댓글