유럽 사용자의 동의 요청

Google EU 사용자 동의 정책에 따라 유럽 경제 지역(EEA)에서 사용자에게 특정 정보를 공개해야 하며, 법적으로 필요한 경우 쿠키 또는 기타 로컬 저장소를 사용하고 개인 정보(예: AdID)를 사용해 광고를 게재한다는 점에 대해 EEA 사용자의 동의를 받아야 합니다. 이 정책에는 EU 온라인 개인정보보호지침 및 개인정보 보호법(GDPR)의 요구사항이 반영되어 있습니다.

이 정책에 따른 게시자의 의무사항 준수를 지원하기 위해 Google에서는 동의 SDK를 제공하고 있습니다. 동의 SDK는 사용자의 동의를 수집하는 유틸리티 기능을 제공하는 오픈소스 라이브러리입니다. 전체 소스 코드는 GitHub에서 가져올 수 있습니다.

Google에서 게재하는 광고는 개인 맞춤 광고 또는 개인 맞춤이 아닌 광고로 분류할 수 있습니다(둘 다 EEA 사용자의 동의가 필요함). 기본적으로 Google로 보내는 광고 요청에서는 개인 맞춤 광고가 게재되며, 이전에 수집한 사용자 관련 데이터에 따라 광고를 선택합니다. 또한 Google에서는 개인 맞춤이 아닌 광고를 게재하기 위한 광고 요청 구성도 지원합니다. 개인 맞춤 광고 및 개인 맞춤이 아닌 광고 자세히 알아보기

이 가이드에서는 동의 SDK를 활용하여 사용자 동의를 얻는 방법을 설명합니다. 또한 동의를 얻은 후 Google 모바일 광고 SDK에 동의를 전달하는 방법에 대해서도 설명합니다.

기본 요건

Google의 Maven 저장소를 가리키는 Gradle 종속성을 사용하여 앱이 동의 SDK를 가져올 수 있습니다. 이 저장소를 사용하려면 앱의 프로젝트 수준 build.gradle 파일에서 저장소를 참조해야 합니다. 내 저장소를 열고 allprojects 섹션을 찾으세요.

프로젝트 수준 build.gradle 예시(발췌)

allprojects {
    repositories {
        google()
        jcenter()
    }
}

위의 google() 지침을 추가하세요(아직 없는 경우).

그런 다음, 앱의 앱 수준 build.gradle 파일을 열고 '종속성' 섹션을 찾으세요.

앱 수준 build.gradle 예시(발췌)

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.appcompat:appcompat:1.0.2'
    implementation 'com.google.android.ads.consent:consent-library:1.0.6'
}

위에서 굵게 표시된 행을 추가하세요. 이 행을 통해 Gradle이 최신 버전의 동의 SDK를 가져오도록 지시합니다. 행을 추가한 다음 파일을 저장하고 Gradle 동기화를 진행하세요.

동의 SDK의 다른 메서드를 사용하기 전에 동의 상태를 업데이트하여 AdMob UI에서 선택한 광고 기술 제공업체 관련 최신 정보를 동의 SDK에 적용해야 합니다. 사용자가 마지막으로 동의한 후 광고 기술 제공업체 목록이 변경되었다면 동의 상태가 알 수 없음으로 돌아갑니다.

미디에이션을 사용하지 않는 경우

미디에이션을 사용하지 않는 경우에는 동의 SDK를 구현하여 동의를 수집하는 옵션이 2개입니다.

먼저, 동의 SDK를 사용하여 Google에서 렌더링한 동의 양식을 사용자에게 제공하는 옵션이 있습니다. 동의 양식에는 AdMob UI에서 선택한 광고 기술 제공업체의 목록이 표시되며 동의 SDK에 사용자 동의 응답이 저장됩니다.

다른 옵션은 동의 SDK를 사용하여 AdMob에서 광고 기술 제공업체의 전체 목록을 동적으로 가져오는 방법입니다(게시자 관리 동의 수집 참고). 이 경우에는 사용자에게 제공업체 목록을 제공하는 방법을 정하고 자체 동의 양식을 사용자에게 제공해야 합니다.

사용자가 동의를 선택하면 동의 SDK에 사용자의 동의 선택을 저장하도록 요청할 수 있습니다(게시자 관리 동의 저장의 설명 참고).

동의를 수집할 때 사용자가 개인 맞춤이 아닌 광고만 수신하는 데 동의했다면 Google 모바일 광고 SDK에 동의를 전달해야 합니다.

AdMob 미디에이션을 사용하는 경우

동의 SDK를 사용하여 AdMob에서 광고 기술 제공업체의 전체 목록을 동적으로 가져올 수 있습니다(게시자 관리 동의 수집 참고). 동의를 위해 다른 광고 네트워크에서 사용자에게 제시해야 하는 광고 기술 제공업체를 정해야 합니다.

앱 개발자는 동의 SDK가 반환한 광고 기술 제공업체와 다른 광고 네트워크의 제공업체 모두에 대해 사용자 동의를 수집해야 합니다. 또한 사용자가 개인 맞춤이 아닌 광고만 수신하는 데 동의한 경우에는 사용자 동의 응답을 직접 저장하고 동의를 Google 모바일 광고 SDK에 전달해야 합니다.

현재 Google에서는 미디에이션 네트워크에 대한 동의를 받거나 처리하지 못하므로 각 광고 네트워크에 대한 동의를 개별적으로 받아서 처리해야 합니다. Google에서는 업데이트된 설명서를 통해 오픈소스 및 버전이 지정된 미디에이션 네트워크 전체에 동의 전달 방법에 대한 세부정보를 적극적으로 제공하고 있습니다. 아래의 미디에이션 네트워크의 경우 온라인 설명서가 이미 제공되고 있습니다.

동의 상태 업데이트

동의 SDK를 사용할 때 앱을 실행할 때마다 사용자의 동의 상태를 확인하는 것이 좋습니다. 이렇게 하려면 ConsentInformation 인스턴스에서 requestConsentInfoUpdate()를 호출하세요.

import com.google.ads.consent.*;

public class MainActivity extends Activity {
    ...

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        ConsentInformation consentInformation = ConsentInformation.getInstance(context);
        String[] publisherIds = {"pub-0123456789012345"};
        consentInformation.requestConsentInfoUpdate(publisherIds, new ConsentInfoUpdateListener() {
            @Override
            public void onConsentInfoUpdated(ConsentStatus consentStatus) {
                 // User's consent status successfully updated.
            }

            @Override
            public void onFailedToUpdateConsentInfo(String errorDescription) {
                 // User's consent status failed to update.
            }
        });
        ...
    }
    ...
}

requestConsentInfoUpdate() 호출에서는 다음과 같은 두 개의 인수가 필요합니다.

  • 앱에서 광고를 요청하는 일련의 유효하고 완전히 활성화된 게시자 ID입니다. 게시자 ID를 찾으세요.

  • ConsentInfoUpdateListener의 인스턴스.

동의 정보가 성공적으로 업데이트되면 업데이트된 동의 상태가 ConsentInfoUpdateListeneronConsentInfoUpdated() 메서드를 통해 제공됩니다. 반환된 ConsentStatus에 나타날 수 있는 값은 다음과 같습니다.

동의 상태 정의
ConsentStatus.PERSONALIZED 사용자가 개인 맞춤 광고에 대해 동의했습니다.
ConsentStatus.NON_PERSONALIZED 사용자가 개인 맞춤이 아닌 광고에 대해 동의했습니다.
ConsentStatus.UNKNOWN 사용자가 개인 맞춤 광고 또는 개인 맞춤이 아닌 광고에 대해 동의하지도 거부하지도 않았습니다.

동의 정보가 성공적으로 업데이트되면 ConsentInformation.getInstance(context).isRequestLocationInEeaOrUnknown()을 통해 사용자가 유럽 경제 지역에 거주하는지 또는 요청 위치를 알 수 없는지를 확인할 수 있습니다.

isRequestLocationInEeaOrUnknown() 메서드가 false를 반환하면 사용자가 유럽 경제 지역에 거주하지 않는 것으로 EU 사용자 동의 정책에 동의하지 않아도 됩니다. Google 모바일 광고 SDK에 광고를 요청할 수 있습니다.

isRequestLocationInEeaOrUnknown() 메서드가 true를 반환하는 경우:

  • 반환된 ConsentStatusPERSONALIZED또는 NON_PERSONALIZED이면 사용자가 이미 동의한 것입니다. 이제 동의를 Google 모바일 광고 SDK에 전달할 수 있습니다.

  • 반환된 ConsentStatusUNKNOWN인 경우에는 동의를 수집하는 유틸리티 메서드의 사용에 대해 설명한 동의 수집 섹션을 참고하세요.

Google의 동의 SDK 에서는 두 가지 방법으로 사용자 동의를 수집할 수 있습니다.

사용자에게 동의 변경 또는 철회 옵션을 제공해야 합니다.

Google이 렌더링한 동의 양식은 앱의 콘텐츠 위에 전체 화면으로 표시됩니다. 사용자에게 다음과 같은 옵션의 조합이 표시되도록 동의 양식을 구성할 수 있습니다.

  • 개인 맞춤 광고 보기에 대한 동의
  • 개인 맞춤이 아닌 광고 보기에 대한 동의
  • 광고를 보는 대신 유료 버전의 앱 사용

동의 문구를 신중하게 검토해야 합니다. 기본으로 표시되는 문구는 Google을 활용해 앱에서 수익을 창출하는 경우에 적합할 수 있는 메시지입니다. 단, Google에서는 게시자에게 적합한 동의 문구에 대해 법률 자문을 제공할 수 없습니다. Google이 렌더링한 동의 양식의 동의 문구를 업데이트하려면 필요에 따라 동의 SDK에 포함된 consentform.html 파일을 수정하세요.

Google이 렌더링한 동의 양식은 ConsentForm 클래스를 이용해 구성 및 표시됩니다. 다음 코드에는 세 가지 동의 옵션을 모두 사용하여 ConsentForm을 생성하는 방법이 나와 있습니다.

URL privacyUrl = null;
try {
    // TODO: Replace with your app's privacy policy URL.
    privacyUrl = new URL("https://www.your.com/privacyurl");
} catch (MalformedURLException e) {
    e.printStackTrace();
    // Handle error.
}
ConsentForm form = new ConsentForm.Builder(context, privacyUrl)
    .withListener(new ConsentFormListener() {
        @Override
        public void onConsentFormLoaded() {
            // Consent form loaded successfully.
        }

        @Override
        public void onConsentFormOpened() {
            // Consent form was displayed.
        }

        @Override
        public void onConsentFormClosed(
                ConsentStatus consentStatus, Boolean userPrefersAdFree) {
            // Consent form was closed.
        }

        @Override
        public void onConsentFormError(String errorDescription) {
            // Consent form error.
        }
    })
    .withPersonalizedAdsOption()
    .withNonPersonalizedAdsOption()
    .withAdFreeOption()
    .build();

위의 메서드에서는 Google이 렌더링한 동의 양식을 다음 옵션과 함께 준비합니다.

withListener()
ConsentForm의 리스너를 등록합니다. ConsentFormListener에서 재정의할 수 있는 각 메서드는 동의 양식의 수명 주기에서 발생하는 이벤트 하나에 해당합니다.
재정의가 가능한 메서드
onConsentFormLoaded 동의 양식을 성공적으로 로드했습니다.
onConsentFormError 동의 양식을 로드하지 못했습니다. errorDescription 매개변수는 오류에 대한 설명을 제공합니다.
onConsentFormOpened 동의 양식이 열렸습니다.
onConsentFormClosed 동의 양식이 닫혔습니다. 메서드의 매개변수를 통해 다음 정보를 제공합니다.
  • consentStatus는 사용자의 업데이트된 동의 상태를 설명하는 ConsentStatus 값입니다.
  • 사용자가 광고를 보는 대신 유료 버전의 앱을 사용하기로 선택한 경우에는 userPrefersAdFreetrue 값이 적용됩니다.
withPersonalizedAdsOption()
동의 양식에 개인 맞춤 광고 옵션이 표시되어야 함을 나타냅니다.
withNonPersonalizedAdsOption()
동의 양식에 개인 맞춤이 아닌 광고 옵션이 표시되어야 함을 나타냅니다.
withAdFreeOption()
동의 양식에 무광고 앱 옵션이 표시되어야 함을 나타냅니다.

ConsentForm 객체를 만들고 구성한 후에는 아래와 같이 ConsentFormload() 메서드를 실행하여 동의 양식을 로드하세요.

form.load();

Google이 렌더링한 동의 양식을 사용자에게 제공하려면 아래에 나온 것처럼 ConsentForm 인스턴스에서 show()를 호출하세요.

form.show();

사용자가 옵션을 선택하고 양식을 닫으면 동의 SDK가 사용자의 선택 정보를 저장하고 onConsentFormClosed 이벤트를 실행합니다. 이 이벤트를 수신하고 동의를 Google 모바일 광고 SDK에 전달할 수 있습니다.

게시자 관리 동의 수집

동의를 직접 수집하기로 선택한 경우 ConsentInformation 클래스의 getAdProviders() 메서드를 이용해 앱에서 사용된 게시자 ID와 연결된 광고 기술 제공업체를 가져올 수 있습니다. 게시자 ID로 구성된 광고 기술 제공업체의 전체 목록에 대해 동의가 필요합니다.

getAdProviders()를 호출할 수 있으려면 먼저 ConsentInfoUpdateListeneronConsentInfoUpdate() 메서드를 기다려야 합니다(동의 상태 업데이트 섹션 참고).

List<AdProvider> adProviders =
    ConsentInformation.getInstance(context).getAdProviders();

그런 다음 광고 기술 제공업체 목록을 사용하여 동의를 직접 받을 수 있습니다.

동의를 받으면 ConsentInformation 클래스의 setConsentStatus() 메서드를 이용해 사용자의 응답에 해당하는 ConsentStatus를 기록하세요.

ConsentInformation.getInstance(context)
    .setConsentStatus(ConsentStatus.PERSONALIZED);

동의 SDK에 동의를 보고한 후 동의를 Google 모바일 광고 SDK에 전달할 수 있습니다.

사용자가 동의를 업데이트할 수 있게 하려면, 사용자가 동의 상태를 업데이트하기로 선택할 때 동의 수집 섹션에 설명된 단계를 반복하기만 하면 됩니다.

사용자가 동의 연령 미만임을 게시자가 알고 있는 경우 모든 광고 요청에서 TFUA(유럽 동의 연령 미만 사용자용 태그)를 설정해야 합니다. 앱에서 실행하는 모든 광고 요청에 이 태그를 포함하려면 setTagForUnderAgeOfConsent(true)를 호출하세요. 이 설정은 이후의 모든 광고 요청에 적용됩니다.

ConsentInformation.getInstance(context).setTagForUnderAgeOfConsent(true);

TFUA 설정을 사용하면 Google이 렌더링한 동의 양식이 로드되지 않습니다. TFUA가 포함된 광고 요청으로는 개인 맞춤 광고 및 리마케팅을 사용할 수 없습니다. TFUA는 광고 측정 픽셀 및 외부 광고 서버와 같은 제3자 광고 기술 제공업체에 대한 요청을 비활성화합니다.

광고 요청에서 TFUA를 삭제하려면 setTagForUnderAgeOfConsent(false)를 호출하세요.

테스트

동의 SDK는 ConsentInformation.getInstance(context).isRequestLocationInEeaOrUnknown()의 값에 따라 작동 방식이 달라집니다. 예를 들어 사용자가 EEA에 거주하지 않으면 동의 양식이 로드되지 않습니다.

동의 SDK는 EEA 안팎에서 앱을 더 쉽게 테스트할 수 있도록 디버그 옵션을 지원합니다. 이 옵션은 동의 SDK의 다른 메서드를 호출하기 전에 설정할 수 있습니다.

  1. 동의 상태 업데이트 섹션의 안내에 따라 requestConsentInfoUpdate를 호출하세요. 그런 다음 앱을 실행하세요. logcat 출력에서 다음 로그를 확인하세요.

    I/ConsentInformation: Use
    ConsentInformation.getInstance(context).addTestDevice("33BE2250B43518CCDA7DE426D04EE231")
    to get test ads on this device.
  2. logcat의 광고 ID를 이용해 내 기기를 허용 목록에 디버그 기기로 등록하세요.

    ConsentInformation.getInstance(context).addTestDevice("33BE2250B43518CCDA7DE426D04EE231");
  3. 마지막으로, 테스트할 지역을 설정하기 위해 setDebugGeography를 호출하세요.

    // Geography appears as in EEA for test devices.
    ConsentInformation.getInstance(context).
        setDebugGeography(DebugGeography.DEBUG_GEOGRAPHY_EEA);
    // Geography appears as not in EEA for debug devices.
    ConsentInformation.getInstance(context).
        setDebugGeography(DebugGeography.DEBUG_GEOGRAPHY_NOT_EEA);

이 단계를 완료하면 동의 상태 업데이트 호출에서 디버그 지역을 고려합니다.

이 섹션의 코드는 모든 버전의 Google 모바일 광고 SDK에서 사용할 수 있습니다. 이때 동의 SDK를 사용하여 동의를 수집했는지는 고려하지 않습니다.

Google 모바일 광고 SDK는 기본적으로 개인 맞춤 광고를 게재합니다. 사용자가 개인 맞춤이 아닌 광고만 수신하는 데 동의한 경우에는 개인 맞춤이 아닌 광고만 요청하도록 AdRequest 객체를 구성할 수 있습니다. 다음 코드를 사용하면 사용자가 EEA에 거주하는지에 관계없이 개인 맞춤이 아닌 광고를 요청합니다.

Bundle extras = new Bundle();
extras.putString("npa", "1");

AdRequest request = new AdRequest.Builder()
        .addNetworkExtrasBundle(AdMobAdapter.class, extras)
        .build();

현재 개인 맞춤이 아닌 광고를 요청하면 광고 요청 URL에 &npa=1이 포함됩니다. 이는 Google 모바일 광고 SDK의 내부 구현사항이며 변경될 수 있습니다.

앱 측정 지연(선택사항)

기본적으로 Google 모바일 광고 SDK는 앱 측정을 초기화하고 앱이 시작되는 즉시 사용자 수준 이벤트 데이터를 Google에 전송하기 시작합니다. 이 초기화 동작을 통해 코드를 추가로 변경하지 않고도 AdMob 사용자 측정항목을 사용할 수 있습니다.

하지만 이 이벤트를 전송하기 전에 앱에 사용자 동의가 필요한 경우 명시적으로 모바일 광고 SDK를 초기화하거나 광고를 로드할 때까지 앱 측정을 지연시킬 수 있습니다.

앱 측정을 지연하려면 AndroidManifest.xml에 다음 <meta-data> 태그를 추가하세요.

<manifest>
     <application>
        <!-- Delay app measurement until MobileAds.initialize() is called. -->
        <meta-data
            android:name="com.google.android.gms.ads.DELAY_APP_MEASUREMENT_INIT"
            android:value="true"/>
    </application>
</manifest>

FAQ

동의 SDK에서는 몇 군데의 광고 기술 제공업체를 지원하나요?
동의 SDK에서는 게시자가 사용하기로 선택하는 광고 기술 제공업체의 수에 제한을 두지 않습니다.
AdMob UI에서 내 선택 정보를 변경하면 SDK에서 반환한 광고 기술 제공업체 목록이 자동으로 업데이트되나요?
예, 맞습니다. AdMob UI에서 광고 기술 제공업체 목록을 변경하면 약 1시간 후에 변경사항이 Google 광고 서버에 전송됩니다.