웹사이트와 Android 앱 간의 원활한 사용자 인증 정보 공유 설정

1. 개요

사용자가 웹사이트와 Android 앱 모두에서 서비스에 액세스하나요? 각 플랫폼에서 별도로 로그인하도록 강제하면 불필요한 마찰이 발생하고 이탈로 이어질 수 있습니다.

디지털 애셋 링크 (DAL)는 웹사이트와 앱 간의 연결을 선언할 수 있도록 하여 이 문제를 해결합니다. 이를 통해 Google 비밀번호 관리자와 같은 비밀번호 관리자가 저장된 비밀번호와 패스키를 서로 공유할 수 있습니다.

특히 디지털 애셋 링크 파일을 구성하려면 공유하려는 항목에 따라 다른 관계가 필요합니다.

  • 비밀번호: delegate_permission/common.get_login_creds를 포함하면 비밀번호 관리자가 웹사이트와 앱 간에 저장된 비밀번호를 공유할 수 있습니다.
  • 패스키: 패스키는 특정 웹 도메인에 엄격하게 바인딩되므로 Android에서는 도메인 소유권 증명이 필요합니다. 따라서 delegate_permission/common.handle_all_urls을 포함해야 합니다. 이 권한은 Android App Links (딥 링크)에 사용되는 권한으로 인식될 수 있지만, 한 플랫폼에서 생성된 패스키를 다른 플랫폼에서 사용할 수 있도록 허용하는 엄격한 요구사항이기도 합니다.

그 결과 사용자는 하나의 플랫폼에만 저장된 비밀번호 또는 패스키를 사용하여 제휴 플랫폼 전반에서 원활하게 로그인할 수 있습니다.

속성 간에 사용 가능한 비밀번호

원활한 사용자 인증 정보 공유를 구현하면 사용자 환경을 크게 개선할 수 있습니다. 예를 들어 eBay는 사용자 인증 정보 공유를 위해 DAL을 구현한 후 로그인 성공률이 10% 증가했습니다.

이 Codelab에서는 디지털 애셋 링크를 사용하여 웹사이트와 Android 앱 간에 사용자 인증 정보를 공유하는 방법을 알아봅니다.

기본 요건

학습할 내용

  • Google Play Console을 사용하여 사용자 인증 정보 공유를 설정하는 방법 (권장)
  • assetlinks.json 파일을 수동으로 만드는 방법
  • 수동 연결을 위해 Android 앱을 구성하는 방법
  • 웹사이트 도메인과 연결하여 Android 앱에서 패스키를 사용 설정하는 방법
  • 도구를 사용하여 설정을 생성하고 검증하는 방법

필요한 항목

  • 웹사이트: https://{your-domain}/.well-known/assetlinks.json에 JSON 파일을 호스팅할 수 있어야 합니다.
  • Android 앱:
    • Play Console 방법: Google Play에 게시된 앱
    • 수동 방법: 수정하고 빌드할 수 있는 Android 프로젝트 Google 비밀번호 관리자와 사용자 인증 정보를 공유하려면 앱이 Google Play에 게시되어 있어야 합니다.

작동 방식

사용자 인증 정보 공유가 작동하려면 양방향 신뢰를 설정해야 합니다.

  1. 웹 -> 앱: 웹사이트에서 Android 앱을 신뢰한다고 선언하는 assetlinks.json 파일을 호스팅해야 합니다.
  2. 앱 -> 웹: Android 앱이 웹사이트를 신뢰하도록 구성되어 있어야 합니다.

Google Play Console을 사용하는 자동 방식 (권장)과 디지털 애셋 링크를 직접 사용하는 수동 방식의 두 가지 방법을 살펴보겠습니다.

2. Google Play Console을 사용하여 설정 (권장)

웹사이트와 Android 앱 간에 사용자 인증 정보 공유를 사용 설정하는 가장 쉬운 방법은 Google Play Console을 사용하는 것입니다. 이 방법을 사용하면 앱의 매니페스트를 수정하거나 앱의 새 버전을 게시하지 않고도 앱을 웹사이트와 연결할 수 있습니다. Google Play에서 앱 측 연결을 관리합니다.

기본 요건

딥 링크에 관한 자세한 내용은 Android App Links를 참고하세요.

단계

  1. Play Console에서 성장 > 딥 링크로 이동합니다.
  2. 도메인이 목록에 없으면 앱 구성 아래의 도메인 추가를 클릭합니다.
  3. 도메인을 찾아 사용자 인증 정보 공유 열을 찾습니다. 사용 설정을 클릭합니다 (또는 새 도메인의 경우 사용자 인증 정보 공유 사용 설정이 사용 설정되어 있는지 확인).
  4. Play Console에서 생성된 JSON 스니펫을 복사합니다.
  5. 이 JSON 콘텐츠를 https://{your-domain}/.well-known/assetlinks.json에 게시합니다. (이 파일이 이미 있는 경우 새 문장을 추가하세요.)
  6. Play Console로 돌아가 웹사이트 연결 만들기 또는 사용자 인증 정보 공유 사용 설정을 클릭합니다.

이제 Play Console에서 호스팅 설정을 확인합니다.

Play Console 딥 링크

사용자 인증 정보 공유가 작동하려면 웹사이트 호스트가 다음 요구사항을 충족해야 합니다.

  • URL에 HTTPS를 통해 액세스할 수 있습니다.
  • 서버가 Content-Type: application/json로 응답합니다.
  • 리디렉션 없이 URL에 액세스할 수 있습니다.

인증이 완료되면 사용자 인증 정보 공유가 활성화됩니다. 구성 변경사항이 전파되는 데 1~2주가 걸릴 수 있습니다.

3. 디지털 애셋 링크를 사용하여 수동으로 설정

세부적인 관리를 원하는 경우 또는 Play Console에 액세스할 수 없나요? 웹사이트와 Android 앱 간의 사용자 인증 정보 공유를 수동으로 구성할 수 있습니다. 여기에는 사이트에 JSON 파일을 호스팅하고 Android 앱 매니페스트를 업데이트하는 두 가지 주요 작업이 포함됩니다.

1. 앱의 디지털 지문 가져오기

원활한 사용자 인증 정보 공유를 설정하기 전에 각 플랫폼에 다음이 있는지 확인하세요.

각 Android 앱의 경우:

2. 연결 파일 만들기

웹사이트와 앱 간의 관계를 선언하는 assetlinks.json 파일을 만들어야 합니다. delegate_permission/common.get_login_creds를 사용하여 비밀번호 공유 권한을 부여하고 delegate_permission/common.handle_all_urls를 사용하여 딥 링크를 사용 설정하고 패스키를 공유합니다.

다음 콘텐츠를 포함한 assetlinks.json 파일을 만듭니다. 예시 값을 사이트 URL, 패키지 이름, 지문으로 바꿉니다.

[{
  "relation": [
    "delegate_permission/common.handle_all_urls",
    "delegate_permission/common.get_login_creds"
    ],
  "target": {
    "namespace": "android_app",
    "package_name": "com.example.app",
    "sha256_cert_fingerprints":
    ["14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"]
  }
}]

3. 파일 호스팅

assetlinks.json 파일을 도메인의 루트에 있는 .well-known 디렉터리에 업로드합니다.

위치: https://{your-domain}/.well-known/assetlinks.json

사용자 인증 정보 공유가 작동하려면 웹사이트 호스트가 다음 요구사항을 충족해야 합니다.

  • URL에 HTTPS를 통해 액세스할 수 있습니다.
  • 서버가 Content-Type: application/json로 응답합니다.
  • 리디렉션 없이 URL에 액세스할 수 있습니다.

웹에서 앱으로

4. Android 앱 구성

이제 Android 앱이 웹사이트를 신뢰하도록 지시합니다. assetlinks.json URL이 포함된 리소스 파일을 가리키는 참조를 매니페스트에 추가합니다.

1. 문자열 리소스 추가

res/values/strings.xml에서 새 문자열 asset_statements을 추가합니다. 이스케이프된 따옴표를 확인하세요.

<resources>
    <string name="asset_statements" translatable="false">
      [{
        \"include\": \"https://www.example.com/.well-known/assetlinks.json\"
      }]
    </string>
</resources>

2. 매니페스트에 메타데이터 추가

AndroidManifest.xml에서 이 문자열 리소스를 참조하는 <application> 요소 내에 <meta-data> 태그를 추가합니다.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.app">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme">

        <meta-data
            android:name="asset_statements"
            android:resource="@string/asset_statements" />

        <activity android:name=".MainActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    </manifest>

이 단계를 완료하고 새 버전의 Android 앱을 게시하면 디지털 애셋 링크를 지원하는 비밀번호 관리자 (예: Google 비밀번호 관리자)가 사용자가 com.example.app에 로그인하려고 할 때 www.example.com에 저장된 사용자 인증 정보를 제안할 수 있으며 그 반대의 경우도 마찬가지입니다.

4. 설정 확인

배송하기 전에 디지털 애셋 링크 구성을 확인하는 것이 중요합니다. 잘못된 JSON 또는 연결할 수 없는 파일은 자동으로 실패합니다.

공식 명령문 생성기 및 검사기 도구를 사용합니다.

명세 생성기 및 검사기

  1. 사이트 도메인앱 패키지 이름을 입력합니다.
  2. 테스트 문장을 클릭합니다.
  3. 이 도구는 assetlinks.json 파일이 올바르게 호스팅되고 유효한 연결이 포함되어 있는지 확인합니다.

5. 여러 웹사이트 간 사용자 인증 정보 공유

웹에서 앱으로

동일한 로그인 시스템을 공유하는 웹사이트가 여러 개 있는 경우 (예: example.comexample.co.uk) 사용자 인증 정보가 웹사이트 간에 공유될 수 있도록 제휴사로 선언할 수 있습니다.

여러 웹사이트 간에 비밀번호 공유

웹사이트 간에 비밀번호를 공유하려면 delegate_permission/common.get_login_creds를 사용하여 web-web 연결을 선언하면 됩니다.

예를 들어 example.comexample.co.uk와 비밀번호를 공유하려면 https://example.com/.well-known/assetlinks.json에 호스팅된 assetlinks.json 파일에 example.co.uk을 타겟팅하는 문이 포함되어야 합니다.

[{
  "relation": ["delegate_permission/common.get_login_creds"],
  "target": {
    "namespace": "web",
    "site": "https://example.co.uk"
  }
}]

마찬가지로 https://example.co.uk/.well-known/assetlinks.json에는 example.com을 타겟팅하는 문이 포함되어야 합니다.

여러 웹사이트 간에 패스키 공유

여러 웹사이트가 동일한 패스키를 공유하려면 동일한 신뢰 당사자 ID (RP ID)를 사용해야 합니다. WebAuthn 및 패스키에서 RP ID는 도메인 이름으로 사용자 인증 정보의 범위를 지정합니다. 패스키를 만들면 특정 RP ID에 연결되며 해당 ID의 범위에 속하는 도메인에서만 사용할 수 있습니다. RP ID를 올바르게 정의하면 하위 도메인, 교차 사이트 출처, 퍼스트 파티 모바일 앱에서 원활한 패스키 환경을 보장할 수 있습니다. 신뢰 당사자 ID (RP ID) 이해에서 RP ID 설정에 대해 자세히 알아볼 수 있습니다. 관련 출처 요청을 사용하면 한 웹사이트에서 RP ID를 사용할 수 있는 다른 출처를 지정하여 사용자가 운영하는 여러 사이트에서 동일한 패스키를 재사용할 수 있습니다. 이는 디지털 애셋 링크에서 delegate_permission/common.handle_all_urls를 사용하는 웹사이트와 Android 앱 간의 패스키 공유와는 다릅니다.

예를 들어 example.comexample.co.uk가 패스키를 공유하도록 하려면 example.com를 표준 RP ID로 결정하면 됩니다. 이 작업을 수행하려면 example.co.uk가 WebAuthn API 호출에서 rpId: 'example.com'을 사용해야 하고 example.comhttps://example.com/.well-known/webauthn에 파일을 호스팅하여 example.co.uk를 허용 목록에 추가해야 합니다.

{
  "origins": [
    "https://example.co.uk"
  ]
}

이를 통해 example.co.ukexample.com와 연결된 패스키를 만들고 사용할 수 있습니다.

6. 결론

축하합니다. 원활한 사용자 인증 정보 공유를 설정했습니다.

이제 사용자는 웹사이트에 비밀번호와 패스키를 저장하고 이를 사용하여 탭 한 번으로 Android 앱에 로그인할 수 있습니다 (그 반대도 가능). 이 간단한 변경으로 로그인 전환율과 사용자 만족도를 크게 높일 수 있습니다.

다음 단계