단일 사용자 인증 워크플로

[서비스 계정 워크플로][service-account-workflow]와 마찬가지로 단일 사용자 인증 흐름은 Google Ads UI에서 제공하는 승인 및 사용자 관리 기능을 사용하여 앱에 필요한 모든 계정에 대한 액세스 권한을 부여합니다. 이 인증 워크플로에는 두 단계가 있습니다.

  • 앱에서 관리해야 하는 모든 Google Ads 계정 에 대한 액세스 권한을 단일 사용자에게 부여합니다.
  • 사용자가 앱에 Google Ads 계정을 대신 관리할 수 있는 권한을 부여하여 앱에 모든 Google Ads 계정에 대한 액세스 권한을 부여합니다.

사용자가 한 명만 있으므로 자체 OAuth 2.0 사용자 인증 흐름을 빌드하는 대신 [gcloud CLI][gcloud-cli] 또는 [GenerateUserCredential 코드 예시][generate-user-credentials-example] 와 같은 도구를 사용할 수 있습니다.

이 워크플로와 관련된 사용 사례는 소수의 사용자 로그인 (예: 3~4명의 사용자)을 통해 계정에 액세스할 수 있는 경우입니다. 따라서 완전한 OAuth 사용자 인증 워크플로를 빌드하는 데 드는 개발 노력은 gcloud CLI와 같은 명령줄 도구를 사용하여 3~4명의 사용자에 대한 승인을 얻는 데 드는 노력과 비교했을 때 정당화되지 않습니다.

단점

서비스 계정 워크플로와 비교했을 때 이 흐름에는 몇 가지 단점이 있습니다.

  1. 사용자 인증 워크플로를 사용하려면 Google Cloud 콘솔에서 OAuth 2.0 클라이언트 ID와 보안 비밀을 만들어야 합니다. 서비스 계정과 키를 만드는 것보다 더 많은 구성 단계가 필요합니다.
  2. 앱이 추가 [Google Cloud 앱 인증 절차][app-verification]를 거쳐야 할 수 있습니다.
  3. 승인된 사용자가 팀 또는 회사를 떠나면 계정에서 사용자를 삭제하거나 사용자 계정을 사용 중지할 경우 앱이 작동하지 않을 수 있습니다. 서비스 계정은 개별 사용자와 연결되지 않으므로 이 위험을 방지할 수 있습니다.
  4. Google Ads 계정을 승인하는 사용자는 보안 취약점, 멀웨어 또는 피싱으로 인해 Google 계정이 도용되는 것을 방지하기 위해 [2단계 인증 사용 설정][2fa] 과 같은 추가 예방 조치를 취해야 합니다. 서비스 계정은 이러한 공격 모드 중 일부가 서비스 계정에 직접 적용되지 않으므로 이 문제에 더 취약하지 않습니다.

사용자 인증 정보 만들기

  1. [안내][configure-oauth-consent] 에 따라 애플리케이션의 OAuth 동의 화면을 구성하고 https://www.googleapis.com/auth/adwords를 OAuth 2.0 범위로 추가합니다. 자세한 내용은 OAuth 동의 화면 설정 을 참고하세요.

  2. [안내][create-credentials]에 따라 클라이언트 ID와 클라이언트 보안 비밀번호를 만듭니다. OAuth 2.0 클라이언트를 만든 후 먼저 OAuth 클라이언트 다운로드 아이콘을 클릭한 다음 다음 화면에서 JSON 다운로드 버튼을 클릭하여 클라이언트의 JSON 파일을 다운로드합니다. 파일을 credentials.json으로 저장합니다.

  3. 앱을 사용하여 관리하려는 모든 Google Ads 계정에 액세스할 수 있는 사용자 계정을 식별합니다. 액세스 권한이 없는 계정이 있는 경우 [안내][grant-access] 에 따라 필요한 액세스 권한을 부여합니다.

  4. gcloud CLI를 [다운로드하고 설치][install-gcloud] 합니다. 설치 후 명령줄 프롬프트에서 gcloud version 명령어를 실행하여 도구가 올바르게 작동하는지 확인합니다. 출력은 다음과 같을 수 있습니다.

    :~$ gcloud version
    Google Cloud SDK 492.0.0
    alpha 2024.09.06
    beta 2024.09.06
    bq 2.1.8
    bundled-python3-unix 3.11.9
    core 2024.09.06
    enterprise-certificate-proxy 0.3.2
    gcloud-crc32c 1.0.0
    gsutil 5.30
  5. gcloud CLI 도구를 실행하여 OAuth 2.0 갱신 토큰을 생성합니다.

    gcloud auth application-default 
    login --scopes=https://www.googleapis.com/auth/adwords,https://www.googleapis.com/auth/cloud-platform
    --client-id-file=<path_to_credentials.json>

    credentials.json 파일은 이전 단계에서 가져온 것입니다.

  6. gcloud 명령어는 새 브라우저 창에서 Google 계정 로그인 창을 열고 OAuth 2.0 인증 단계를 안내합니다. 이전 단계에서 선택한 사용자로 로그인해야 합니다. 앱이 인증되지 않은 경우 경고 화면이 표시될 수 있습니다. 이 경우 고급 옵션 표시 링크를 클릭하고 PROJECT_NAME (인증되지 않음)으로 이동 옵션을 클릭해도 안전합니다.

  7. 범위를 확인한 후 계속 버튼을 클릭하여 권한을 부여합니다. 브라우저가 https://cloud.google.com/sdk/auth_success로 이동하여 인증이 성공했음을 나타냅니다. 페이지에 다음 메시지가 표시됩니다.

    Authorization code granted. Close this tab.

    gcloud 명령어는 다음 메시지를 출력합니다.

    Credentials saved to file: [/****/.config/gcloud/application_default_credentials.json]

    이제 application_default_credentials.json 파일을 엽니다. 내용은 다음과 유사해야 합니다.

    {
    "account": "",
    "client_id": "******.apps.googleusercontent.com",
    "client_secret": "******",
    "refresh_token": "******",
    "type": "authorized_user",
    "universe_domain": "googleapis.com"
    }
    

클라이언트 라이브러리 구성

클라이언트 라이브러리를 구성하는 방법에 대한 안내는 프로그래밍 언어에 해당하는 탭을 선택하세요.

자바

ads.properties 파일에서 다음 키를 구성합니다.

api.googleads.clientId=INSERT_CLIENT_ID_HERE
api.googleads.clientSecret=INSERT_CLIENT_SECRET_HERE
api.googleads.refreshToken=INSERT_REFRESH_TOKEN_HERE
api.googleads.loginCustomerId=INSERT_LOGIN_CUSTOMER_ID_HERE

추가 옵션은 [구성 가이드][java-config-guide] 를 참고하세요.

.NET

API 호출을 수행하는 계정의 사용자로부터 가져온 사용자 인증 정보를 사용하여 런타임에 GoogleAdsClient 인스턴스를 초기화할 수 있습니다.

GoogleAdsConfig config = new GoogleAdsConfig()
{
    OAuth2Mode = OAuth2Flow.APPLICATION,
    OAuth2ClientId = "INSERT_OAUTH2_CLIENT_ID",
    OAuth2ClientSecret = "INSERT_OAUTH2_CLIENT_SECRET",
    OAuth2RefreshToken = "INSERT_OAUTH2_REFRESH_TOKEN",
    ...
};
GoogleAdsClient client = new GoogleAdsClient(config);

추가 옵션은 [구성 가이드][dotnet-config-guide] 를 참고하세요.

Python

google-ads.yaml 파일에서 다음 키를 구성합니다.

client_id: INSERT_OAUTH2_CLIENT_ID_HERE
client_secret: INSERT_OAUTH2_CLIENT_SECRET_HERE
refresh_token: INSERT_REFRESH_TOKEN_HERE
login_customer_id: INSERT_LOGIN_CUSTOMER_ID_HERE

추가 옵션은 [구성 가이드][python-config-guide] 를 참고하세요.

PHP

google_ads_php.ini에서 다음 키를 구성합니다.

[GOOGLE_ADS]
loginCustomerId = "INSERT_LOGIN_CUSTOMER_ID_HERE"

[OAUTH2]
clientId = "INSERT_OAUTH2_CLIENT_ID_HERE"
clientSecret = "INSERT_OAUTH2_CLIENT_SECRET_HERE"
refreshToken = "INSERT_OAUTH2_REFRESH_TOKEN_HERE"

추가 옵션은 [구성 가이드][php-config-guide] 를 참고하세요.

Ruby

[google_ads_config.rb][ruby-config-file] 파일에서 다음 키를 구성합니다.

  Google::Ads::GoogleAds::Config.new do |c|
     c.client_id = 'INSERT_CLIENT_ID_HERE'
     c.client_secret = 'INSERT_CLIENT_SECRET_HERE'
     c.refresh_token = 'INSERT_REFRESH_TOKEN_HERE'
     c.developer_token = 'INSERT_DEVELOPER_TOKEN_HERE'
     c.login_customer_id = 'INSERT_LOGIN_CUSTOMER_ID_HERE'
  end

추가 옵션은 [구성 가이드][ruby-config-guide] 를 참고하세요.

Perl

googleads.properties 파일에서 다음 키를 구성합니다.

 clientId=INSERT_OAUTH2_CLIENT_ID_HERE
 clientSecret=INSERT_OAUTH2_CLIENT_SECRET_HERE
 refreshToken=INSERT_OAUTH2_REFRESH_TOKEN_HERE
 loginCustomerId=INSERT_LOGIN_CUSTOMER_ID_HERE
 

추가 옵션은 [구성 가이드][perl-config-guide] 를 참고하세요.

curl

먼저 HTTP 클라이언트를 사용하여 OAuth 2.0 액세스 토큰을 가져옵니다. 이 가이드에서는 curl 명령어를 사용합니다.

curl \
  --data "grant_type=refresh_token" \
  --data "client_id=CLIENT_ID" \
  --data "client_secret=CLIENT_SECRET" \
  --data "refresh_token=REFRESH_TOKEN" \
  https://www.googleapis.com/oauth2/v3/token

이제 API 호출에서 액세스 토큰을 사용할 수 있습니다. 다음 예에서는 GoogleAdsService.SearchStream 메서드를 사용하여 계정의 캠페인을 가져오는 캠페인 보고서를 실행하는 방법을 보여줍니다. 이 가이드에서는 보고서의 세부정보를 다루지 않습니다. 보고.

curl -i -X POST https://googleads.googleapis.com/v24/customers/CUSTOMER_ID/googleAds:searchStream \
   -H "Content-Type: application/json" \
   -H "Authorization: Bearer ACCESS_TOKEN" \
   -H "developer-token: DEVELOPER_TOKEN" \
   -H "login-customer-id: LOGIN_CUSTOMER_ID" \
   --data-binary "@query.json"

query.json의 내용은 다음과 같습니다.

{
  "query": "SELECT campaign.id, campaign.name, campaign.network_settings.target_content_network FROM campaign ORDER BY campaign.id"
}

[service-account-workflow]: /google-ads/api/docs/oauth/service-accounts [gcloud-cli]: https://cloud.google.com/sdk/gcloud [generate-user-credentials-example]: /google-ads/api/samples/generate-user-credentials [app-verification]: //support.google.com/cloud/answer/13461325 [2fa]: //support.google.com/google-ads/answer/12864186 [configure-oauth-consent]: /workspace/guides/configure-oauth-consent [create-credentials]: /workspace/guides/create-credentials#desktop-app [grant-access]: //support.google.com/google-ads/answer/6372672 [install-gcloud]: //cloud.google.com/sdk/docs/install [java-config-guide]: /google-ads/api/docs/client-libs/java/config-file [dotnet-config-guide]: /google-ads/api/docs/client-libs/dotnet/configuration [python-config-guide]: /google-ads/api/docs/client-libs/python/configuration [php-config-guide]: /google-ads/api/docs/client-libs/php/configuration [ruby-config-file]: //github.com/googleads/google-ads-ruby/blob/HEAD/google_ads_config.rb [ruby-config-guide]: /google-ads/api/docs/client-libs/ruby/configuration [perl-config-guide]: /google-ads/api/docs/client-libs/perl/configuration [oauth-playground]: /oauthplayground/ [playground-video]: //www.youtube.com/watch?v=KFICa7Ngzng