인증 탭을 사용하여 인증 간소화

인증 탭은 Android 앱에서 사용할 수 있는 안전하고 간소화된 인증 흐름을 제공합니다. AuthTabIntent를 만들어 실행하면 엔드 투 엔드 인증 환경을 관리하도록 설계된 특수 맞춤 탭을 호출할 수 있습니다. 탭이 간소화되어 기능이 제한되므로 사용자가 현재 작업에 집중할 수 있습니다. 완료되면 탭은 https 또는 맞춤 스키마를 사용하여 결과와 함께 애플리케이션에 콜백합니다.

모든 기능을 갖춘 맞춤 탭
그림 1. 맞춤 탭의 모든 기능을 사용할 수 있습니다.
최소한의 기능을 포함하는 인증 탭
그림 2. 최소한의 기능을 갖춘 인증 탭

Chrome 137부터 인증 탭이 기존 맞춤 탭 인증 통합을 직접 대체할 수 있습니다. 기기에서 인증 탭을 지원하지 않는 사용자의 경우 맞춤 탭으로의 대체가 자동으로 이루어집니다. 맞춤 탭에서 인증 탭으로 이전하려면 코드 몇 줄을 수정하면 됩니다.

작동 방식

인증 탭을 사용하면 클라이언트 앱이 예상되는 인증 페이지로 URL을 로드하는 브라우저 창을 표시하는 특수 맞춤 탭을 실행합니다. 완료되면 인증 탭은 콜백을 사용하여 인증 결과를 반환합니다.

인증 후 이전에 제공된 콜백 리디렉션 URI로 이동하면 리디렉션이 캡처되고 콜백을 사용하여 클라이언트 애플리케이션으로 반환됩니다. https 스키마를 사용하는 리디렉션의 경우 브라우저는 Digital Asset Links를 사용하여 리디렉션 도메인과 클라이언트 앱이 동일한 게시자 소유인지 확인합니다.

클라이언트는 제공된 콜백을 사용하여 리디렉션 스킴 (또는 https의 경우 리디렉션 호스트 및 경로)이 포함된 탐색된 URI를 수신합니다. 이 데이터에는 결과 코드와 인증 인터페이스에서 제공하는 기타 데이터가 포함됩니다. 이 데이터를 사용하여 인증을 확인하거나 성공하지 못한 시나리오를 처리할 수 있습니다.

인증 탭이 필요한 이유

인증 탭 이전에는 표준 맞춤 탭 인텐트를 사용하여 인증 흐름을 지원할 수 있었습니다. 인증 탭은 보안을 강화하고 환경을 간소화하며 클라이언트 코드에서 인증을 위한 일부 내부 요소를 추상화하므로 인증 탭을 사용하는 것이 좋습니다. 이러한 이유로 인증 탭이 더 나은 환경을 제공합니다.

향상된 보안

일반적인 맞춤 탭 구현에서는 인증을 처리하는 브라우저 창에서 데이터를 수신하는 인텐트가 필요합니다. 이렇게 하면 추가 코드가 필요하며 앱이 의도에 대한 잠재적 간섭에 노출됩니다. 인증 탭을 사용하면 콜백을 사용하여 데이터를 수신하며 Android API와 클라이언트 앱 간에 직접 데이터 전송이 이루어집니다.

간소화된 환경

맞춤 탭에서 사용자는 인증 흐름에 바람직하지 않을 수 있는 브라우저의 추가 기능에 액세스할 수 있습니다. 인증 탭은 표준 맞춤 탭에서 사용할 수 있는 대부분의 맞춤설정 옵션을 삭제하여 간소화된 환경을 제공합니다. Chrome 브라우저의 경우 최소화 버튼, 길게 누르기 컨텍스트 메뉴, 터치하여 검색, Chrome에서 열기, 북마크, 다운로드 및 공유, 홈 화면에 추가 메뉴 항목이 포함됩니다.

인증 탭은 브라우저가 이전에 저장된 비밀번호와 결제 정보를 자동 완성하고, 뒤로 또는 앞으로 이동하고, 새로고침하고, 페이지 정보를 표시하고, 페이지의 데스크톱 버전을 요청하고, 번역을 제공하는 기능을 계속 유지합니다.

데이터 추상화

인증 탭만 구현하면 인증이 제대로 작동하는 데 이전에 필요했던 AndroidManifest.xml의 인텐트 필터뿐만 아니라 브라우저에서 데이터를 수신하는 인텐트도 필요하지 않습니다. 이렇게 하면 클라이언트 측의 복잡성이 제거됩니다. 이러한 기능 중 일부는 사용자 기기에서 인증 탭을 사용할 수 없는 상황에서 맞춤 탭과의 하위 호환성을 제공하기 위해 클라이언트 코드에 포함될 수 있습니다.

인증 탭 구현

인증 탭에는 AndroidX 브라우저 인증 라이브러리가 필요합니다. AndroidX 브라우저 라이브러리는 프로젝트의 build.gradle 파일의 종속 항목 섹션에 추가할 수 있습니다. API는 알파 빌드에서 사용할 수 있습니다. 빌드 파일에 다음을 추가합니다.

dependencies {
    implementation 'androidx.browser:browser:1.9.0'
}

인증 탭을 실행하기 전에 ActivityResultCallerActivityResultCallback를 모두 사용하는 ActivityResultLauncher를 선언합니다. 이는 활동이나 프래그먼트가 생성되기 전에 실행됩니다.

// In your activity

private final ActivityResultLauncher<Intent> mLauncher =
    AuthTabIntent.registerActivityResultLauncher(this, this::handleAuthResult);

private void handleAuthResult(AuthResult result) {
    String message = switch (result.resultCode) {
        case AuthTabIntent.RESULT_OK -> "Received auth result.";
        case AuthTabIntent.RESULT_CANCELED -> "AuthTab canceled.";
        case AuthTabIntent.RESULT_VERIFICATION_FAILED -> "Verification failed.";
        case AuthTabIntent.RESULT_VERIFICATION_TIMED_OUT -> "Verification timed out.";
    }

    if (result.resultCode == AuthTabIntent.RESULT_OK) {
        message += " Uri: " + result.resultUri;
    }

    Toast.makeText(this, message, Toast.LENGTH_LONG).show();  
}

다음으로 AuthTabIntent.Builder을 사용하여 AuthTabIntent을 빌드한 다음 launch 메서드를 호출합니다. 실행 메서드는 필요한 스키마에 따라 다음 두 매개변수 집합 중 하나를 허용합니다.

  • redirectScheme: 맞춤 리디렉션 스킴의 경우 브라우저가 리디렉션되고 제공된 스킴으로 URI를 반환합니다.

  • redirectHost, redirectPath: https 리디렉션 스킴의 경우 브라우저가 리디렉션을 감지하고 URI를 반환하려면 API에 별도의 호스트와 경로가 필요합니다. https를 사용하는 경우 디지털 애셋 링크 확인이 필요합니다.

private void launchAuthTab() {
    AuthTabIntent authTabIntent = new AuthTabIntent.Builder.build();
    authTabIntent.launch(mLauncher, Uri.parse("https://www.example.com/auth"), "mycustomscheme");
}

private void launchAuthTabHttps() {
    String host = "your_host";
    String path = "your_path";
    AuthTabIntent authTabIntent = new AuthTabIntent.Builder.build();
    authTabIntent.launch(mLauncher, Uri.parse("https://www.example.com/auth", host, path);
}

맞춤 탭에서 인증 탭으로 이전

맞춤 탭 인텐트를 새 인증 탭 인텐트로 수정하여 기존 맞춤 탭 인증 구현을 업데이트합니다. 코드를 추가한 후 맞춤 탭 인텐트를 찾아 새 인증 탭 인텐트로 수정합니다.

CustomTabsIntent customTabsIntent = new CustomTabsIntent.Builder().build();
customTabsIntent.launchUrl(context, uri)

// change to -->

AuthTabIntent authTabIntent = new AuthTabIntent.Builder.build();

authTabIntent.launch(mLauncher, Uri.parse("https://www.example.com/auth", "mycustomscheme");

/* - OR - */

authTabIntent.launch(mLauncher, Uri.parse("https://www.example.com/auth", host, path);

맞춤 탭으로 대체

사용자의 기기에 인증 탭을 처리할 기능이 없는 경우 일부 구현에서는 인증이 필요할 수 있습니다. 예를 들어 기본 브라우저가 인증 탭을 지원하지 않거나 기본 브라우저의 버전이 필요한 수준이 아닌 경우에 이 문제가 발생할 수 있습니다. 이러한 경우 인증 탭 인텐트는 맞춤 탭을 지원하는 브라우저의 경우 대신 맞춤 탭을 자동으로 실행합니다.

CustomTabsClient#isAuthTabSupported()를 사용하여 브라우저에서 인증 탭이 지원되는지 확인할 수 있습니다. 이 방법을 사용하면 앱이 브라우저 기능을 기반으로 인증 탭 또는 맞춤 탭 흐름을 동적으로 선택할 수 있습니다. 인증 탭이 지원되지 않는 상황을 원활하게 처리하려면 기존 맞춤 탭 코드에서 인증 흐름을 대체로 처리하도록 유지하면서 인증 탭 구현을 추가하세요.

ActivityResultCallback 또는 활동 인텐트로 전송될 수 있는 데이터를 처리해야 합니다. AuthTabIntent를 사용하여 대체 환경을 실행하고 현재 브라우저에서 인증 탭을 지원하지 않는 경우 맞춤 탭이 닫히면 앱에서 Activity.RESULT_CANCELED 결과를 수신합니다.

맞춤 탭으로 대체되는 인증 탭 구현의 예는 Android 브라우저 도우미 라이브러리에서 확인할 수 있습니다.

추가 리소스