세분화된 권한 처리 방법

개요

세분화된 권한을 통해 소비자가 어떤 계정 데이터를 더욱 세밀하게 제어할 수 있는지 확인할 수 있습니다. 각 앱과 공유하기로 선택하는 것입니다. 더 나은 서비스를 제공하여 사용자와 개발자 모두에게 제어, 투명성, 보안을 갖추고 있습니다 이 가이드를 통해 세분화된 권한을 처리하도록 애플리케이션을 업데이트하는 데 필요한 변경사항과 단계를 이해할 수 있습니다.

세분화된 권한이란 무엇인가요?

이메일과 캘린더 범위를 모두 요청하는 생산성 앱을 개발한다고 가정해 보겠습니다. 사용자는 Gmail이 아닌 Google Calendar에만 애플리케이션을 사용하고 싶어 할 수 있습니다. 세분화된 OAuth 사용 권한이 있는 경우 사용자는 Google Calendar 권한만 부여할 수 있고 Gmail 권한은 부여할 수 없습니다. 사용자가 특정 데이터에 대한 액세스 권한을 부여하도록 허용함으로써 데이터 노출, 신뢰를 형성하고 사용자에게 개인 정보 보호를 최우선으로 하여 디지털 생활을 제어할 수 있도록 지원합니다. 중요한 점은 이러한 시나리오를 처리하도록 애플리케이션을 설계합니다.

비로그인 범위가 2개 이상 요청된 경우

로그인 및 비로그인 범위

로그인 범위와 로그인 이외의 범위를 모두 요청하는 애플리케이션의 경우 사용자에게 먼저 동의가 표시됩니다. 로그인 범위 페이지 (email, profile, openid). 사용자가 동의한 후 기본 신원 정보 (이름, 이메일 주소, 프로필 사진)를 공유하는 경우 로그인 이외의 범위에 대한 상세 권한 동의 화면 이 경우 애플리케이션은 사용자가 부여한 범위를 확인해야 하며 사용자가 요청한 모든 범위를 부여한다고 가정할 수 없습니다. 다음 예에서 웹 애플리케이션은 세 가지 로그인 범위와 Google Drive의 비로그인 범위입니다. 사용자가 로그인 범위에 동의하면 Google Drive 권한에 대한 상세 권한 동의 화면:

로그인 및 비로그인 범위

로그인 외 범위 2개 이상

애플리케이션에서 추가 권한을 요청할 때 사용자에게 세부적인 권한 동의 화면이 표시됩니다. 있습니다. 사용자는 공유를 승인할 권한을 선택할 수 있습니다. 애플리케이션입니다. 다음은 세분화된 권한 동의 화면을 요청하는 예입니다. 사용자의 Gmail 메일 및 Google Calendar 데이터에 대한 액세스:

로그인 외 범위 2개 이상

로그인만 요청하는 애플리케이션의 경우 범위 (email, profile, openid)로, 세분화된 권한 동의 화면을 적용할 수 없습니다. 사용자가 전체 로그인을 승인 또는 거부함 합니다. 즉, 애플리케이션이 로그인 범위 (하나, 두 개 또는 모두)만 요청하는 경우 셋째) 세부적인 권한 동의 화면이 적용되지 않습니다.

로그인 이외의 범위를 하나만 요청하는 애플리케이션의 경우 세분화된 권한 동의 화면은 적용되지 않습니다. 즉, 사용자는 승인하거나 전체 요청을 거부하며, 동의 화면에 체크박스가 없습니다. 다음 표 세부적인 권한 동의 화면이 표시되는 시점이 요약되어 표시됩니다.

로그인 범위 수 비로그인 범위 수 세분화된 권한 동의 화면
1-3 0 해당 사항 없음
1-3 1+ 적용 가능
0 1 해당 사항 없음
0 2+ 적용 가능

애플리케이션이 영향을 받는지 확인

신청서에서 다음에 해당하는 모든 섹션을 철저하게 검토하세요. Google OAuth 2.0 승인 엔드포인트는 권한 요청에 활용됩니다. 여러 범위를 요청하는 앱은 사용자에게 표시되는 세분화된 권한 동의 화면을 활성화하므로 주의하세요. 이러한 경우 코드에서 사용자가 일부 범위를 승인합니다.

애플리케이션이 여러 범위를 사용하고 있는지 확인하는 방법

앱 코드 검사 또는 발신 네트워크 호출을 설정하여 Google이 OAuth 2.0 앱에서 승인 요청을 하면 상세 권한 동의 화면이 표시됩니다. 표시됩니다.

애플리케이션 코드 검사

Google OAuth 승인 엔드포인트를 호출하여 사용자에게 권한을 요청하는 애플리케이션 코드의 섹션을 검토합니다. Google API 중 하나를 사용하는 경우 클라이언트 라이브러리를 사용하면 클라이언트에서 애플리케이션이 요청하는 범위를 자주 확인할 수 있습니다. 자동화합니다. 다음 섹션에 몇 가지 예가 나와 있습니다. 자세한 내용은 애플리케이션이 Google OAuth 2.0을 처리하는 데 사용하는 SDK 문서를 참조하세요. 다음 예에 나와 있는 가이드를 사용해 참조

Google ID 서비스

다음 Google ID 서비스 JavaScript 라이브러리 코드 스니펫은 TokenClient를 있습니다. 다음과 같은 경우 상세 권한 동의 화면이 표시됩니다. 앱이 사용자에게 승인을 요청합니다.

const client = google.accounts.oauth2.initTokenClient({
  client_id: 'YOUR_CLIENT_ID',
  scope: 'https://www.googleapis.com/auth/calendar.readonly \
  https://www.googleapis.com/auth/contacts.readonly',
  callback: (response) => {
    ...
  },
});

Python

다음 코드 스니펫은 google-auth-oauthlib.flow 모듈을 사용하여 승인 요청을 구성합니다. scope 매개변수에는 있습니다. 웹 애플리케이션이 사용자에게 승인을 요청하면 세분화된 권한 동의 화면이 표시됩니다.

import google.oauth2.credentials
import google_auth_oauthlib.flow

# Use the client_secret.json file to identify the application requesting
# authorization. The client ID (from that file) and access scopes are required.
flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file(
    'client_secret.json',
    scopes=['https://www.googleapis.com/auth/calendar.readonly',
                    'https://www.googleapis.com/auth/contacts.readonly'])

Node.js

다음 코드 스니펫은 google.auth.OAuth2 객체를 만듭니다. 이 객체는 scope 매개변수에 2개가 포함된 승인 요청의 매개변수 있습니다. 웹 앱이 사용자에게 승인을 요청합니다.

const {google} = require('googleapis');

/**
  * To use OAuth2 authentication, we need access to a CLIENT_ID, CLIENT_SECRET, AND REDIRECT_URI
  * from the client_secret.json file. To get these credentials for your application, visit
  * https://console.cloud.google.com/apis/credentials.
  */
const oauth2Client = new google.auth.OAuth2(
  YOUR_CLIENT_ID,
  YOUR_CLIENT_SECRET,
  YOUR_REDIRECT_URL
);

// Access scopes for read-only Calendar and Contacts.
const scopes = [
  'https://www.googleapis.com/auth/calendar.readonly',
  'https://www.googleapis.com/auth/contacts.readonly']
];

// Generate a url that asks permissions
const authorizationUrl = oauth2Client.generateAuthUrl({
  // 'online' (default) or 'offline' (gets refresh_token)
  access_type: 'offline',
  /** Pass in the scopes array defined above.
    * Alternatively, if only one scope is needed, you can pass a scope URL as a string */
  scope: scopes,
  // Enable incremental authorization. Recommended as best practices.
  include_granted_scopes: true
});

발신 네트워크 호출 검사

네트워크 호출을 검사하는 방법은 애플리케이션 클라이언트 유형입니다.

네트워크 호출을 검사하는 동안 Google OAuth 승인 엔드포인트를 검토하고 scope 매개변수를 확인합니다.

이러한 값으로 인해 세분화된 권한 동의 화면이 표시됩니다.

  • scope 매개변수에는 로그인 범위와 로그인 이외의 범위가 포함되어 있습니다.

    다음 샘플 요청에는 3개의 로그인 범위와 1개의 비로그인 범위가 모두 포함되어 있습니다. 사용자의 Google Drive 파일 메타데이터를 확인하려면 다음 단계를 따르세요.

    https://accounts.google.com/o/oauth2/v2/auth?
    access_type=offline&
    scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.profile%20openid%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive.metadata.readonly&
    include_granted_scopes=true&
    response_type=code&
    redirect_uri=YOUR_REDIRECT_URL&
    client_id=YOUR_CLIENT_ID
  • scope 매개변수에 로그인 외 범위가 2개 이상 포함되어 있습니다.

    다음 샘플 요청에는 사용자의 Google Drive를 보기 위한 2개의 비 로그인 범위가 포함되어 있습니다. 특정 Google Drive 파일을 관리하고 메타데이터를 공유할 수 있습니다.

  • https://accounts.google.com/o/oauth2/v2/auth?
    access_type=offline&
    scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive.metadata.readonly%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive.file&
    include_granted_scopes=true&
    response_type=code&
    redirect_uri=YOUR_REDIRECT_URL&
    client_id=YOUR_CLIENT_ID

세분화된 권한 처리를 위한 권장사항

애플리케이션을 처리해야 권한을 세분화해야 하는 경우 동의를 제대로 처리하도록 코드를 업데이트해야 합니다. 사용할 수 있습니다 모든 애플리케이션은 다음 권장사항을 준수해야 합니다.

  1. 검토 'Google API 서비스: 사용자 데이터 정책'을 검토하고 이를 준수해야 합니다.
  2. 태스크에 필요한 특정 범위를 요청합니다. 나 Google OAuth 2.0 정책을 준수해야 합니다. 요청하는 범위만 제공합니다. 여러 번 질문하거나 앱의 핵심 기능에 꼭 필요한 경우가 아니면 로그인 시 범위를 제한합니다. 번들 특히 처음 사용하는 분들을 위해 관리하며 관리해야 하는 이러한 기능의 필요성을 이해하기가 어려울 수 있습니다 권한을 부여할 수 있습니다 이렇게 하면 경보가 울리고 사용자가 더 이상 앱에 참여하는 것을 막을 수 있습니다. 애플리케이션입니다.
  3. 사용자에게 질문하기 전에 사용자에게 이유를 제공합니다. 승인 요청을 제출할 수 있습니다. 애플리케이션에 요청된 권한이 필요한 이유를 명확하게 설명합니다. 사용자 데이터로 수행할 작업 및 사용자가 요청을 승인하여 얻게 되는 이점을 이해하는 데 도움이 됩니다. Google의 연구에 따르면 이러한 설명은 사용자의 신뢰와 참여도를 높입니다.
  4. 애플리케이션이 범위를 요청할 때마다 증분 승인사용하여 여러 액세스 토큰을 관리하지 않아도 됩니다.
  5. 사용자가 부여한 범위를 확인합니다. 한 번에 여러 범위를 요청하면 사용자가 앱에서 요청하는 모든 범위를 부여하지 않을 수 있습니다. 앱은 항상 사용자가 부여한 범위를 확인하고 관련 범위를 사용 중지하여 범위 거부를 처리합니다. 기능을 살펴보겠습니다 Google OAuth 2.0 정책 준수 여러 광고 요청에 대한 범위를 설정하고 사용자에게 범위가 필요한 특정 기능을 사용하기 위한 인텐트

세분화된 권한을 처리하도록 애플리케이션 업데이트

Android 애플리케이션

Google OAuth 2.0 및 다음에 따라 세분화된 권한을 처리하도록 애플리케이션을 업데이트하고, 권장사항에 대해 자세히 알아보세요.

auth.api.signin Google OAuth 2.0과 상호작용하려면 requestPermissions 함수를 사용하여 필요한 가장 작은 범위 집합을 요청하고, 및 hasPermissions 함수를 사용하여 특정 액세스 권한이 부여되었을 때 사용자가 부여한 범위를 확인합니다. 세분화되어 있는 권한을 요청하는 데 사용됩니다.

Chrome 확장 프로그램 애플리케이션

이때 크롬 Identity API권장사항에 대해 자세히 알아보세요.

다음 예는 세분화된 권한을 올바르게 처리하는 방법을 보여줍니다.

manifest.json

예시 매니페스트 파일에서 Chrome 확장 프로그램에 로그인이 아닌 범위 2개를 선언함 애플리케이션입니다.

{
  "name": "Example Chrome extension application",
  ...
  "permissions": [
      "identity"
    ],
  "oauth2" : {
      "client_id": "YOUR_CLIENT_ID",
      "scopes":["https://www.googleapis.com/auth/calendar.readonly",
                "https://www.googleapis.com/auth/contacts.readonly"]
  }
}

잘못된 접근 방식

모두 또는 전혀 없음

사용자가 버튼을 클릭하면 승인 프로세스가 시작됩니다. 이 코드 스니펫은 사용자에게 manifest.json 파일에 지정된 두 범위에 대한 '전부 또는 전혀' 동의 화면이 표시된다고 가정합니다. 사용자가 부여한 범위를 확인하지 않습니다.

oauth.js

...
document.querySelector('button').addEventListener('click', function () {
  chrome.identity.getAuthToken({ interactive: true },
      function (token) {
          if (token === undefined) {
            // User didn't authorize both scopes.
            // Updating the UX and application accordingly
            ...
          } else {
            // User authorized both or one of the scopes.
            // It neglects to check which scopes users granted and assumes users granted all scopes.

            // Calling the APIs, etc.
            ...
          }
      });
});

올바른 접근 방식

가장 작은 범위

필요한 최소 범위 집합 선택

애플리케이션은 필요한 최소 범위 집합만 요청해야 합니다. 애플리케이션은 작업을 완료하는 데 필요한 경우 한 번에 하나의 범위를 요청하는 것이 좋습니다.

이 예에서는 manifest.json에 선언된 두 범위가 모두 있다고 가정합니다. 파일은 필요한 가장 작은 범위 집합입니다. oauth.js 파일은 Chrome Identity API를 사용하여 Google과의 승인 프로세스를 시작합니다. 선택해야 합니다. 세부적인 권한을 사용 설정하여 사용자가 애플리케이션입니다. 애플리케이션은 사용자가 승인하는 범위를 지정합니다

oauth.js

...
document.querySelector('button').addEventListener('click', function () {
  chrome.identity.getAuthToken({ interactive: true, enableGranularPermissions: true },
      function (token, grantedScopes) {
          if (token === undefined) {
            // User didn't authorize any scope.
            // Updating the UX and application accordingly
            ...
          } else {
            // User authorized the request. Now, check which scopes were granted.
            if (grantedScopes.includes('https://www.googleapis.com/auth/calendar.readonly'))
            {
              // User authorized Calendar read permission.
              // Calling the APIs, etc.
              ...
            }
            else
            {
              // User didn't authorize Calendar read permission.
              // Update UX and application accordingly
              ...
            }

            if (grantedScopes.includes('https://www.googleapis.com/auth/contacts.readonly'))
            {
              // User authorized Contacts read permission.
              // Calling the APIs, etc.
              ...
            }
            else
            {
              // User didn't authorize Contacts read permission.
              // Update UX and application accordingly
              ...
            }
          }
      });
});

iOS, iPadOS, macOS 애플리케이션

Google OAuth 2.0 및 다음에 따라 세분화된 권한을 처리하도록 애플리케이션을 업데이트하고, 권장사항에 대해 자세히 알아보세요.

iOS 및 macOS용 Google 로그인 라이브러리를 사용하는 경우 Google OAuth 2.0과 상호작용하려면 세분화된 처리 방법에 대한 문서 권한을 부여할 수 있습니다

웹 애플리케이션

Google OAuth 2.0 및 다음에 따라 세분화된 권한을 처리하도록 애플리케이션을 업데이트하고, 권장사항에 대해 자세히 알아보세요.

서버 측 (오프라인) 액세스

서버 측 (오프라인) 액세스 모드를 사용하려면 다음을 수행해야 합니다.
  • 서버를 설정하고 공개적으로 액세스할 수 있는 엔드포인트를 정의하여 승인을 받습니다. 생성합니다.
  • Google Cloud 콘솔의 Credentials page 에서 공개 엔드포인트의 리디렉션 URI를 구성합니다.

다음 코드 스니펫은 NodeJS 예시가 2개의 비로그인 범위를 요청하는 것을 보여줍니다. 사용자가 수행하는 작업 상세 권한 동의 화면이 표시됩니다.

잘못된 접근 방식

'모두 또는 아무것도'

사용자가 승인 URL로 리디렉션됩니다. 이 코드 스니펫은 사용자가 '모 아니면 도' 아래의 두 범위에 대한 동의 화면 scopes 아라리. 사용자가 부여한 범위를 확인하지 않습니다.

main.js

...
const oauth2Client = new google.auth.OAuth2(
  YOUR_CLIENT_ID,
  YOUR_CLIENT_SECRET,
  YOUR_REDIRECT_URL
);

// Access scopes for two non-Sign-In scopes - Google Calendar and Contacts
const scopes = [
  'https://www.googleapis.com/auth/contacts.readonly',
  'https://www.googleapis.com/auth/calendar.readonly'
];

// Generate a url that asks permissions for the Google Calendar and Contacts scopes
const authorizationUrl = oauth2Client.generateAuthUrl({
  // 'online' (default) or 'offline' (gets refresh_token)
  access_type: 'offline',
  // Pass in the scopes array defined above
  scope: scopes,
  // Enable incremental authorization. Recommended as best practices.
  include_granted_scopes: true
});

async function main() {
  const server = http.createServer(async function (req, res) {
    // Example on redirecting user to Google OAuth 2.0 server.
    if (req.url == '/') {
      res.writeHead(301, { "Location": authorizationUrl });
    }
    // Receive the callback from Google OAuth 2.0 server.
    if (req.url.startsWith('/oauth2callback')) {
      // Handle the Google OAuth 2.0 server response
      let q = url.parse(req.url, true).query;

      if (q.error) {
        // User didn't authorize both scopes.
        // Updating the UX and application accordingly
        ...
      } else {
        // User authorized both or one of the scopes.
        // It neglects to check which scopes users granted and assumes users granted all scopes.

        // Get access and refresh tokens (if access_type is offline)
        let { tokens } = await oauth2Client.getToken(q.code);
        // Calling the APIs, etc.
        ...
      }
    }
    res.end();
  }).listen(80);
}
올바른 접근 방식

최소 범위

필요한 최소 범위 집합 선택

애플리케이션은 필요한 최소 범위 집합만 요청해야 합니다. 권장 애플리케이션이 작업을 완료하는 데 필요할 때 한 번에 한 범위만 요청하는 것을 의미합니다. 애플리케이션이 범위를 요청할 때마다 점진적 승인 여러 액세스 토큰을 관리할 필요가 없습니다.

애플리케이션에서 로그인 이외의 여러 범위를 요청해야 할 경우에는 항상 점진적 승인 사용자에게 부여된 범위를 확인하고 확인할 수 있습니다

이 예에서는 앱이 제대로 작동하려면 명시된 두 범위가 모두 필요하다고 가정합니다. 선택해야 합니다. 세부적인 권한을 사용 설정하여 사용자가 애플리케이션입니다. 애플리케이션은 확인할 수 있습니다

main.js

...
const oauth2Client = new google.auth.OAuth2(
  YOUR_CLIENT_ID,
  YOUR_CLIENT_SECRET,
  YOUR_REDIRECT_URL
);

// Access scopes for two non-Sign-In scopes - Google Calendar and Contacts
const scopes = [
  'https://www.googleapis.com/auth/contacts.readonly',
  'https://www.googleapis.com/auth/calendar.readonly'
];

// Generate a url that asks permissions for the Google Calendar and Contacts scopes
const authorizationUrl = oauth2Client.generateAuthUrl({
  // 'online' (default) or 'offline' (gets refresh_token)
  access_type: 'offline',
  // Pass in the scopes array defined above
  scope: scopes,
  // Enable incremental authorization. Recommended as best practices.
  include_granted_scopes: true,
  // Set to true to enable more granular permissions for Google OAuth 2.0 client IDs created before 2019.
  // No effect for newer Google OAuth 2.0 client IDs, since more granular permissions is always enabled for them.
  enable_granular_consent: true
});

async function main() {
  const server = http.createServer(async function (req, res) {
    // Redirect users to Google OAuth 2.0 server.
    if (req.url == '/') {
      res.writeHead(301, { "Location": authorizationUrl });
    }
    // Receive the callback from Google OAuth 2.0 server.
    if (req.url.startsWith('/oauth2callback')) {
      // Handle the Google OAuth 2.0 server response
      let q = url.parse(req.url, true).query;

      if (q.error) {
        // User didn't authorize both scopes.
        // Updating the UX and application accordingly
        ...
      } else {
        // Get access and refresh tokens (if access_type is offline)
        let { tokens } = await oauth2Client.getToken(q.code);
        oauth2Client.setCredentials(tokens);

        // User authorized the request. Now, check which scopes were granted.
        if (tokens.scope.includes('https://www.googleapis.com/auth/calendar.readonly'))
        {
          // User authorized Calendar read permission.
          // Calling the APIs, etc.
          ...
        }
        else
        {
          // User didn't authorize Calendar read permission.
          // Calling the APIs, etc.
          ...
        }

        // Check which scopes user granted the permission to application
        if (tokens.scope.includes('https://www.googleapis.com/auth/contacts.readonly'))
        {
          // User authorized Contacts read permission.
          // Calling the APIs, etc.
          ...
        }
        else
        {
          // User didn't authorize Contacts read permission.
          // Update UX and application accordingly
          ...
        }
      }
    }
    res.end();
  }).listen(80);
}

검토: 서버 측 웹 앱 가이드를 참조하세요.

클라이언트 측 전용 액세스

  • Google ID 서비스를 사용하는 애플리케이션의 경우 JavaScript 라이브러리를 사용하여 Google OAuth 2.0과 상호작용하려면 다음을 검토해야 합니다. 문서 자세히 알아보겠습니다
  • JavaScript를 사용하여 Google OAuth 2.0 승인에 직접 호출하는 애플리케이션의 경우 엔드포인트의 경우 문서 자세히 알아보겠습니다

세분화된 권한 처리에 관해 업데이트된 애플리케이션 테스트

  1. Outline 사용자가 권한 요청에 응답할 수 있는 모든 케이스와 예상 동작을 하는 데 도움이 됩니다. 예를 들어 사용자가 3개의 범위 중 하나를 지정하는 경우 애플리케이션은 그에 따라 작동해야 합니다.
  2. 세분화된 권한이 사용 설정된 애플리케이션을 테스트합니다. 두 가지 방법으로 사용 설정 세분화된 권한:
    1. 애플리케이션의 OAuth 2.0 동의 화면에서 세분화된 권한이 이미 애플리케이션입니다. 웹, Android 또는 iOS의 Google OAuth 2.0 클라이언트 ID를 새로 만들 수도 있습니다. Google Cloud 콘솔을 통해 테스트할 수 있습니다 사용 설정되어 있는지 확인해야 합니다
    2. 매개변수 설정 Google OAuth를 호출할 때 trueenable_granular_consent <ph type="x-smartling-placeholder"></ph> 승인 엔드포인트를 사용합니다. 일부 SDK는 이 매개변수를 명시적으로 지원합니다. 다른 경우에는 문서에서 이 매개변수와 값을 수동으로 추가하는 방법을 확인하세요. 구현에서 매개변수 추가를 지원하지 않는 경우 새 웹, 테스트를 위해 Google Cloud 콘솔을 통한 Android 또는 iOS Google OAuth 2.0 클라이언트 ID 목적으로만 사용해야 합니다.
  3. 업데이트된 애플리케이션을 테스트할 때는 대신 개인 Google 계정 (@gmail.com)을 사용하세요. 액세스할 수 있습니다 Workspace Enterprise 앱이 도메인 전체 권한 위임 또는 신뢰할 수 있음 현재로서는 세분화된 권한의 변경사항의 영향을 받지 않습니다. 따라서 Workspace를 사용하여 조직의 계정에 새로운 상세 동의 화면이 의도한 대로 표시되지 않을 수 있습니다.