사용자 관리

Google 애널리틱스 관리 API를 이용하면 프로그래매틱 방식으로 사용자 권한을 관리할 수 있습니다. 이 방법은 액세스 제어 목록 (ACL)을 자주 업데이트하는 대기업에 특히 유용합니다.

소개

계정, 속성 또는 보기 (프로필)에 액세스할 수 있는 사용자를 관리하는 데 사용되는 세 가지 기본 리소스가 있습니다.

사용자 권한 쓰기 작업을 위한 특별한 일괄 처리 지원도 있습니다.

사용자 권한

Google 계정으로 표시되는 사용자에게는 Google 애널리틱스 계정, 속성 또는 보기 (프로필)에 대해 다음과 같은 수준의 액세스 권한이 부여됩니다.

  • MANAGE_USERS - 사용자 권한 API에 쓰기 요청을 하는 데 필요합니다.
  • EDIT - 데이터 관리 리소스를 수정하는 데 필요합니다.
  • COLLABORATE
  • READ_AND_ANALYZE

각 액세스 수준에 관해 자세히 알아보려면 고객센터의 사용자 권한 도움말을 참조하세요.

권한 할당

이 API는 두 가지 권한 유형인 localeffective를 노출합니다. 로컬 권한은 해당 계정, 속성 또는 보기 (프로필)에 적용됩니다. API로 권한을 할당할 때는 permissions.local 속성을 사용해야 합니다. Effective 권한은 상위 리소스에서 상속된 권한을 나타냅니다.

상속된 권한

사용자에게 계정에 대한 EDIT 권한이 부여되면 해당 계정의 모든 프로필과 속성이 이 권한을 상속받게 되며, 이는 permissions.effective 속성으로 표현됩니다.

사용 사례

Management API의 사용자 권한은 다음과 같은 사용 사례를 해결하는 데 사용할 수 있습니다.

계정의 모든 사용자 나열

계정의 속성 또는 보기 (프로필)에 대한 권한이 있는 모든 사용자를 포함하여 계정의 모든 사용자를 나열하려면 accountUserLinks 리소스의 list 메서드를 실행합니다.

많은 수의 사용자 업데이트하기

다수의 사용자의 권한을 업데이트하려면 일괄 처리를 사용하는 것이 좋습니다. 이렇게 하면 할당량을 절약할 뿐만 아니라 성능이 훨씬 향상됩니다. 자세한 내용은 아래의 일괄 처리 섹션을 참조하세요. 계정에서 이 작업을 실행하는 데 필요한 단계는 다음과 같습니다.

  1. 계정의 모든 사용자 링크를 가져옵니다.
    • 모두 accountUserLinks list
  2. 적절한 권한이 있는 각 사용자에 대한 업데이트 요청을 구성합니다.
    • accountUserLink마다 update입니다.
  3. 위의 업데이트 요청을 포함하는 사용자 300명마다 단일 일괄 요청을 생성합니다.
    • 사용자 300명마다 batch 호출

계정 계층 구조에서 사용자 삭제하기

계정 계층 구조 (예: 계정, 속성 및 보기 (프로필))에서 특정 사용자와 일치하는 항목을 모두 삭제할 수 있습니다. 이 작업을 수행하는 데 필요한 단계는 다음과 같습니다.

  1. 각 항목 수준의 모든 사용자 링크를 가져옵니다. 계정에 대해 list 요청을 3번 실행합니다.
    • 모두 accountUserLinks list
    • list 모두 webpropertyUserLinks로 설정합니다. webpropertyId 매개변수를 ~all로 설정합니다.
    • webpropertyIdprofileId 매개변수를 ~all로 설정하여 모든 profileUserLinkslist합니다.
  2. 로컬 권한이 있는 사용자를 찾아 삭제합니다. 1단계의 목록 작업 3개에서 수신된 응답마다 각 entityUserLink를 반복합니다.
    • userRef 속성이 사용자와 일치하는 경우 그리고 local 권한이 설정된 경우 그리고 리소스에 대해 delete를 실행합니다.

계정 사용자 링크, 웹 속성 사용자 링크, 보기 (프로필) 사용자 링크 리소스의 delete 메서드에 대한 자세한 내용은 API 참조를 확인하세요.

단일 사용자 업데이트

Management API를 사용하여 사용자 권한을 업데이트할 수도 있습니다. 예를 들어 뷰 (프로필) 이름 또는 ID를 모르면 사용자의 권한 수준을 READ_AND_ANALYZE에서 EDIT로 변경하는 단계는 다음과 같습니다.

  1. 각 항목 수준에 대한 모든 사용자 링크 가져오기 계정에 대해 3개의 list 요청을 실행합니다.

    • 모두 accountUserLinks list
    • list 모두 webpropertyUserLinks로 설정합니다. webpropertyId 매개변수를 ~all로 설정합니다.
    • webpropertyIdprofileId 매개변수를 ~all로 설정하여 모든 profileUserLinkslist합니다.
  2. 로컬 권한이 있는 사용자를 찾아 업데이트합니다. 1단계의 목록 작업 3개에서 수신한 응답마다 각 entityUserLink를 반복합니다.

    • userRef 속성이 사용자와 일치하고 사용자에게 READ_AND_ANALYZE 액세스 권한이 있는 local 권한이 있는 경우 그러면 리소스에서 update를 실행합니다.

계정 사용자 링크, 웹 속성 사용자 링크, 보기 (프로필) 사용자 링크 리소스의 update 메서드에 대한 자세한 내용은 API 참조를 확인하세요.

단일 사용자 추가

계정 계층 구조(예: 보기(프로필))에 사용자를 추가하려면 다음 단계를 따라야 합니다.

  1. Management API 또는 웹 인터페이스를 사용하여 계정, 속성, 보기 (프로필)의 ID를 가져옵니다.
  2. profileUserLinks 리소스의 insert 메서드를 실행하여 사용자를 추가합니다.

일괄 처리

권한 API 쓰기 (삭제, 삽입, 업데이트) 요청을 일괄 처리하면 성능 향상과 할당량 인센티브가 있습니다.

  • 사용자 권한 요청을 일괄 처리하면 백엔드 최적화를 활용하고 상당한 성능 향상을 기대할 수 있습니다.
  • 일괄 사용자 권한 API 요청 30개마다 단일 쓰기 작업으로 계산됩니다.
  • 단일 일괄 요청에서 최대 300개의 사용자 권한 API 요청을 할 수 있으므로 사용자당 제한 QPS를 더 높일 수 있습니다.

이러한 성능 향상을 최대한 활용하려면 몇 가지 조치를 취해야 합니다.

  • API 요청을 사용자별로 그룹화합니다.
  • 계정 1개에 대한 일괄 요청만 가능합니다. 2개 이상의 Google 애널리틱스 계정에서 사용자 권한을 일괄 요청하면 다음 메시지와 함께 오류가 발생합니다. All batched requests must be under the same account

오류 처리

일괄 요청의 모든 권한 호출은 단일 트랜잭션으로 취급됩니다. 즉, 변형에 오류가 있는 경우 변경사항이 적용되지 않습니다. 이를 단일 호출로 처리하는 이유는 다음과 같습니다.

  • 단일 사용자의 권한을 조정하려면 여러 번 수정해야 할 수도 있습니다. 수정사항 중 하나의 형식이 잘못된 경우 일괄 작업의 일부를 커밋하면 사용자의 권한이 원하지 않는 상태가 될 수 있습니다.
  • 수정사항을 단일 거래로 처리하여 트래픽을 최적화하고 호출에 필요한 할당량을 줄일 수 있습니다.

일괄 처리 예시 - Python

다음은 사용자 목록을 뷰 집합 (프로필)에 추가하는 요청을 일괄 처리하는 방법을 Python에서 보여주는 간단한 예입니다. 이 예에서는 승인된 사용자의 계정을 반복하며 각 계정에 대해 단일 일괄 요청을 만듭니다. 각 일괄 요청 내에서 특정 사용자에 대한 모든 변경사항을 그룹화합니다.


"""A simple example of Google Analytics batched user permissions."""
import json
from googleapiclient.errors import HttpError
from googleapiclient.http import BatchHttpRequest

def call_back(request_id, response, exception):
  """Handle batched request responses."""
  print request_id
  if exception is not None:
    if isinstance(exception, HttpError):
      message = json.loads(exception.content)['error']['message']
      print ('Request %s returned API error : %s : %s ' %
             (request_id, exception.resp.status, message))
  else:
    print response


def add_users(users, permissions):
  """Adds users to every view (profile) with the given permissions.

  Args:
    users: A list of user email addresses.
    permissions: A list of user permissions.
  Note: this code assumes you have MANAGE_USERS level permissions
  to each profile and an authorized Google Analytics service object.
  """

  # Get the a full set of account summaries.
  account_summaries = analytics.management().accountSummaries().list().execute()

  # Loop through each account.
  for account in account_summaries.get('items', []):
    account_id = account.get('id')

    # Loop through each user.
    for user in users:
      # Create the BatchHttpRequest object.
      batch = BatchHttpRequest(callback=call_back)

      # Loop through each property.
      for property_summary in account.get('webProperties', []):
        property_id = property_summary.get('id')

        # Loop through each view (profile).
        for view in property_summary.get('profiles', []):
          view_id = view.get('id')

          # Construct the Profile User Link.
          link = analytics.management().profileUserLinks().insert(
              accountId=account_id,
              webPropertyId=property_id,
              profileId=view_id,
              body={
                  'permissions': {
                      'local': permissions
                  },
                  'userRef': {
                      'email': user
                  }
              }
          )
          batch.add(link)

      # Execute the batch request for each user.
      batch.execute()

if __name__ == '__main__':

  # Construct a list of users.
  emails = ['ona@gmail.com', 'emi@gmail.com', 'sue@gmail.com', 'liz@gmail.com']

  # call the add_users function with the list of desired permissions.
  add_users(emails, ['READ_AND_ANALYZE'])

다음 단계

다음으로 Google 애널리틱스 관리 API를 사용하여 다양한 데이터 리소스를 구성하는 방법을 살펴보겠습니다.