단일 사용자 인증 워크플로

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

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

사용자가 한 명뿐이므로 자체 OAuth 2.0 사용자 인증 흐름을 빌드하는 대신 gcloud CLI 또는 GenerateUserCredential 코드 예시와 같은 도구를 사용할 수 있습니다.

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

단점

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

  • 사용자 인증 워크플로를 사용하려면 Google API 콘솔에서 OAuth 2.0 클라이언트 ID와 보안 비밀을 만들어야 합니다. 이 경우 서비스 계정과 키를 만드는 것보다 더 많은 구성 단계가 필요합니다.
  • 승인된 사용자가 팀이나 회사를 떠나는 경우 계정에서 사용자를 삭제하거나 사용자 계정을 사용 중지하면 앱이 작동하지 않을 수 있습니다. 서비스 계정은 개별 사용자와 연결되지 않으므로 이러한 위험을 방지할 수 있습니다.
  • 멀웨어 또는 피싱으로 인한 계정 도용을 방지하려면 Google Ads 계정을 승인하는 사용자가 OAuth 2.0 갱신 토큰을 생성할 때 패스키로 인증해야 합니다. 서비스 계정은 패스키가 필요하지 않으며 피싱과 같은 사용자 대상 공격에 덜 취약합니다.

사용자 인증 정보 만들기

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

  2. 안내에 따라 클라이언트 ID와 클라이언트 보안 비밀번호를 만듭니다. OAuth 2.0 클라이언트를 만든 후 확인 대화상자에서 JSON 다운로드 버튼을 클릭하여 클라이언트의 JSON 파일을 다운로드합니다. 파일을 credentials.json로 저장합니다.

  3. 앱을 사용하여 관리하려는 모든 Google Ads 계정에 액세스할 수 있는 사용자 계정을 식별합니다. 액세스 권한이 없는 계정이 있는 경우 해당 사용자에게 계정 액세스 권한을 부여합니다. 이 사용자 계정에 패스키가 설정되어 있는지 확인합니다(새로 생성된 패스키가 신뢰할 수 있는 상태가 되기까지 7일 동안 보안 지연이 적용될 수 있음).

  4. gcloud CLI를 다운로드하고 설치합니다. 설치되면 명령줄 프롬프트에서 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
    
  5. 이전 단계의 credentials.json 파일로 gcloud CLI 도구를 실행하여 OAuth 2.0 갱신 토큰을 생성합니다. 갱신 토큰이 gcloud CLI의 기본 프로젝트가 아닌 Google API 콘솔 프로젝트에서 발급되도록 --client-id-file 매개변수를 전달해야 합니다.

    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
  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"
    }
    

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

클라이언트 라이브러리를 구성하는 방법에 대한 안내를 보려면 프로그래밍 언어에 해당하는 탭을 선택합니다. 승인된 사용자가 Google Ads 관리자 계정을 통해 고객 계정에 액세스하는 경우 login-customer-id (또는 loginCustomerId)를 하이픈 없이 해당 관리자 계정의 10자리 고객 ID로 설정합니다.

자바

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

api.googleads.clientId=INSERT_OAUTH2_CLIENT_ID_HERE
api.googleads.clientSecret=INSERT_OAUTH2_CLIENT_SECRET_HERE
api.googleads.refreshToken=INSERT_OAUTH2_REFRESH_TOKEN_HERE
api.googleads.loginCustomerId=INSERT_LOGIN_CUSTOMER_ID_HERE

추가 옵션은 구성 가이드를 참고하세요.

.NET

GoogleAdsConfig 인스턴스에서 OAuth 2.0 사용자 인증 정보를 설정하고 이를 사용하여 GoogleAdsClient 객체를 초기화합니다.

GoogleAdsConfig config = new GoogleAdsConfig()
{
    OAuth2Mode = OAuth2Flow.APPLICATION,
    OAuth2ClientId = "INSERT_OAUTH2_CLIENT_ID_HERE",
    OAuth2ClientSecret = "INSERT_OAUTH2_CLIENT_SECRET_HERE",
    OAuth2RefreshToken = "INSERT_OAUTH2_REFRESH_TOKEN_HERE",
    LoginCustomerId = "INSERT_LOGIN_CUSTOMER_ID_HERE",
};
GoogleAdsClient client = new GoogleAdsClient(config);

추가 옵션은 구성 가이드를 참고하세요.

Python

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

client_id: INSERT_OAUTH2_CLIENT_ID_HERE
client_secret: INSERT_OAUTH2_CLIENT_SECRET_HERE
refresh_token: INSERT_OAUTH2_REFRESH_TOKEN_HERE
login_customer_id: INSERT_LOGIN_CUSTOMER_ID_HERE
use_proto_plus: True

추가 옵션은 구성 가이드를 참고하세요.

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"

추가 옵션은 구성 가이드를 참고하세요.

Ruby

google_ads_config.rb 파일에서 다음 키를 구성합니다.

Google::Ads::GoogleAds::Config.new do |c|
  c.client_id = 'INSERT_OAUTH2_CLIENT_ID_HERE'
  c.client_secret = 'INSERT_OAUTH2_CLIENT_SECRET_HERE'
  c.refresh_token = 'INSERT_OAUTH2_REFRESH_TOKEN_HERE'
  c.login_customer_id = 'INSERT_LOGIN_CUSTOMER_ID_HERE'
end

추가 옵션은 구성 가이드를 참고하세요.

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

추가 옵션은 구성 가이드를 참고하세요.

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://oauth2.googleapis.com/token

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

curl -i -X POST \
  https://googleads.googleapis.com/v26/customers/CUSTOMER_ID/googleAds:searchStream \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer ACCESS_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"
}