Google API는 인증과 승인에 OAuth 2.0 프로토콜을 사용합니다. Google은 웹 서버, 클라이언트 측, 설치 및 제한된 입력 기기 애플리케이션과 같은 일반적인 OAuth 2.0 시나리오를 지원합니다.
시작하려면 Google API Console에서 OAuth 2.0 클라이언트 사용자 인증 정보를 가져옵니다. 그러면 클라이언트 애플리케이션이 Google 승인 서버에 액세스 토큰을 요청하고, 응답에서 토큰을 추출하고, 액세스하려는 Google API에 토큰을 전송합니다. 자체 클라이언트 사용자 인증 정보를 사용하는 옵션을 포함하여 Google에서 OAuth 2.0을 사용하는 방법에 관한 대화형 데모를 보려면 OAuth 2.0 플레이그라운드를 실험하세요.
이 페이지에서는 Google에서 지원하는 OAuth 2.0 승인 시나리오를 간략히 설명하고 더 자세한 콘텐츠로 연결되는 링크를 제공합니다. 인증에 OAuth 2.0을 사용하는 방법에 대한 자세한 내용은 OpenID Connect를 참조하세요.
기본 단계
모든 애플리케이션은 OAuth 2.0을 사용하여 Google API에 액세스할 때 기본 패턴을 따릅니다. 개략적으로 다음 5단계를 따릅니다.
1. Google API Console에서 OAuth 2.0 사용자 인증 정보를 가져옵니다.
Google API Console를 방문하여 Google과 애플리케이션 모두에 알려진 클라이언트 ID 및 클라이언트 보안 비밀번호와 같은 OAuth 2.0 사용자 인증 정보를 가져옵니다. 값 집합은 빌드 중인 애플리케이션의 유형에 따라 다릅니다. 예를 들어 JavaScript 애플리케이션에는 보안 비밀이 필요하지 않지만 웹 서버 애플리케이션에는 필요합니다.
앱을 실행할 플랫폼에 적합한 OAuth 클라이언트를 만들어야 합니다. 예를 들면 다음과 같습니다.
- 서버 측 또는 JavaScript 웹 앱의 경우 '웹' 클라이언트 유형을 사용합니다. 기본 또는 모바일 앱과 같은 다른 애플리케이션에는 이 클라이언트 유형을 사용하지 마세요.
- Android 앱의 경우 'Android' 클라이언트 유형을 사용합니다.
- iOS 및 macOS 앱의 경우 'iOS' 클라이언트 유형을 사용합니다.
- 범용 Windows 플랫폼 앱의 경우 '범용 Windows 플랫폼' 클라이언트 유형을 사용합니다.
- 제한된 입력 장치(예: TV 또는 내장형 기기)의 경우 'TV 및 제한된 입력 장치' 클라이언트 유형을 사용합니다.
- 서버 간 상호작용의 경우 서비스 계정을 사용합니다.
2. Google 승인 서버에서 액세스 토큰을 가져옵니다.
애플리케이션에서 Google API를 사용하여 비공개 데이터에 액세스하려면 먼저 해당 API에 대한 액세스 권한을 부여하는 액세스 토큰을 획득해야 합니다. 단일 액세스 토큰은 여러 API에 다양한 수준의 액세스를 부여할 수 있습니다. scope
이라는 변수 매개변수는 액세스 토큰에서 허용하는 리소스 및 작업 집합을 제어합니다. 액세스 토큰을 요청하는 동안 애플리케이션은 scope
매개변수에 하나 이상의 값을 전송합니다.
이 요청을 하는 방법에는 여러 가지가 있으며 빌드 중인 애플리케이션의 유형에 따라 달라집니다. 예를 들어 JavaScript 애플리케이션은 Google로 브라우저 리디렉션을 사용하여 액세스 토큰을 요청하고, 브라우저가 없는 기기에 설치된 애플리케이션은 웹 서비스 요청을 사용합니다.
일부 요청에는 사용자가 Google 계정으로 로그인하는 인증 단계가 필요합니다. 로그인하면 애플리케이션이 요청하는 하나 이상의 권한을 부여할 것인지 묻는 메시지가 사용자에게 표시됩니다. 이 과정을 사용자 동의라고 합니다.
사용자가 하나 이상의 권한을 부여하면 Google 승인 서버가 애플리케이션에 액세스 토큰 (또는 애플리케이션이 액세스 토큰을 얻는 데 사용할 수 있는 승인 코드) 및 해당 토큰에 의해 부여된 액세스 범위 목록을 전송합니다. 사용자가 권한을 부여하지 않으면 서버에서 오류를 반환합니다.
일반적으로 초기 액세스보다는 액세스가 필요할 때 점진적으로 범위를 요청하는 것이 좋습니다. 예를 들어 캘린더에 이벤트 저장을 지원하려는 앱은 사용자가 '캘린더에 추가' 버튼을 누를 때까지 Google 캘린더 액세스를 요청해서는 안 됩니다. 증분 승인을 참고하세요.
3. 사용자가 부여한 액세스 범위를 검토합니다.
액세스 토큰 응답에 포함된 범위를 관련 Google API에 대한 액세스에 의존하는 애플리케이션의 기능에 액세스하는 데 필요한 범위와 비교합니다. 관련 API에 액세스하지 않고 작동할 수 없는 앱의 모든 기능을 사용 중지합니다.
사용자가 요청된 모든 범위를 부여했더라도 요청에 포함된 범위가 응답에 포함된 범위와 일치하지 않을 수 있습니다. 액세스에 필요한 범위는 각 Google API의 문서를 참조하세요. API는 여러 범위 문자열 값을 단일 액세스 범위에 매핑하여 요청에서 허용되는 모든 값에 대해 동일한 범위 문자열을 반환할 수 있습니다.
예: 앱에서 사용자에게 https://www.google.com/m8/feeds/
의 범위를 승인하도록 요청한 경우 Google People API는 https://www.googleapis.com/auth/contacts
의 범위를 반환할 수 있습니다. Google People API 메서드 people.updateContact
에는 부여된 범위가 https://www.googleapis.com/auth/contacts
이어야 합니다.
4. API에 액세스 토큰을 전송합니다.
애플리케이션은 액세스 토큰을 가져온 후 HTTP 승인 요청 헤더에 있는 Google API로 토큰을 전송합니다. URI 쿼리 문자열 매개변수로 토큰을 전송할 수 있지만 URI 매개변수는 안전하지 않은 로그 파일에 포함될 수 있으므로 권장하지 않습니다. 또한 불필요한 URI 매개변수 이름을 만들지 않는 것이 좋습니다.
액세스 토큰은 토큰 요청의 scope
에 설명된 작업 및 리소스 집합에만 유효합니다. 예를 들어 Google Calendar API에 액세스 토큰이 발급되더라도 Google Contacts API에 대한 액세스 권한은 부여되지 않습니다. 그러나 유사한 작업을 위해 해당 액세스 토큰을 Google Calendar API에 여러 번 보낼 수 있습니다.
5. 필요한 경우 액세스 토큰을 갱신합니다.
액세스 토큰의 수명은 제한되어 있습니다. 애플리케이션에서 단일 액세스 토큰의 수명보다 오래 Google API에 액세스해야 하는 경우 갱신 토큰을 가져올 수 있습니다. 갱신 토큰을 사용하면 애플리케이션에서 새 액세스 토큰을 가져올 수 있습니다.
시나리오
웹 서버 애플리케이션
Google OAuth 2.0 엔드포인트는 PHP, 자바, Go, Python, Ruby, ASP.NET과 같은 언어와 프레임워크를 사용하는 웹 서버 애플리케이션을 지원합니다.
승인 순서는 애플리케이션이 브라우저를 Google URL로 리디렉션할 때 시작됩니다. URL에는 요청 중인 액세스 유형을 나타내는 쿼리 매개변수가 포함됩니다. Google에서 사용자 인증, 세션 선택, 사용자 동의를 처리합니다. 그 결과 애플리케이션이 액세스 토큰 및 갱신 토큰으로 교환할 수 있는 승인 코드가 생성됩니다.
애플리케이션은 나중에 사용할 수 있도록 갱신 토큰을 저장하고 이 액세스 토큰을 사용하여 Google API에 액세스해야 합니다. 액세스 토큰이 만료되면 애플리케이션에서 갱신 토큰을 사용하여 새 토큰을 얻습니다.
![애플리케이션에서 Google 승인 서버로 토큰 요청을 전송하고, 승인 코드를 수신하고, 코드를 토큰으로 교환하고, 토큰을 사용하여 Google API 엔드포인트를 호출합니다.](https://developers-dot-devsite-v2-prod.appspot.com/static/identity/protocols/oauth2/images/flows/authorization-code.png?authuser=7&hl=ko)
자세한 내용은 웹 서버 애플리케이션용 OAuth 2.0 사용을 참고하세요.
설치된 애플리케이션
Google OAuth 2.0 엔드포인트는 컴퓨터, 휴대기기, 태블릿과 같은 기기에 설치된 애플리케이션을 지원합니다. Google API Console를 통해 클라이언트 ID를 만들 때 설치된 애플리케이션임을 지정한 다음 애플리케이션 유형으로 Android, Chrome 앱, iOS, UWP (Universal Windows Platform) 또는 데스크톱 앱을 선택합니다.
이 과정에서 클라이언트 ID가 생성되며 클라이언트 보안 비밀번호(일부 경우)가 애플리케이션의 소스 코드에 삽입됩니다. (이 컨텍스트에서 클라이언트 보안 비밀번호는 보안 비밀로 취급되지 않습니다.)
승인 순서는 애플리케이션이 브라우저를 Google URL로 리디렉션할 때 시작됩니다. URL에는 요청 중인 액세스 유형을 나타내는 쿼리 매개변수가 포함됩니다. Google에서 사용자 인증, 세션 선택, 사용자 동의를 처리합니다. 그 결과 애플리케이션이 액세스 토큰 및 갱신 토큰으로 교환할 수 있는 승인 코드가 생성됩니다.
애플리케이션은 나중에 사용할 수 있도록 갱신 토큰을 저장하고 이 액세스 토큰을 사용하여 Google API에 액세스해야 합니다. 액세스 토큰이 만료되면 애플리케이션에서 갱신 토큰을 사용하여 새 토큰을 얻습니다.
![애플리케이션에서 Google 승인 서버로 토큰 요청을 전송하고, 승인 코드를 수신하고, 코드를 토큰으로 교환하고, 토큰을 사용하여 Google API 엔드포인트를 호출합니다.](https://developers-dot-devsite-v2-prod.appspot.com/static/identity/protocols/oauth2/images/flows/authorization-code.png?authuser=7&hl=ko)
자세한 내용은 설치된 애플리케이션에 OAuth 2.0 사용을 참고하세요.
클라이언트 측 (자바스크립트) 애플리케이션
Google OAuth 2.0 엔드포인트는 브라우저에서 실행되는 JavaScript 애플리케이션을 지원합니다.
승인 순서는 애플리케이션이 브라우저를 Google URL로 리디렉션할 때 시작됩니다. URL에는 요청 중인 액세스 유형을 나타내는 쿼리 매개변수가 포함됩니다. Google에서 사용자 인증, 세션 선택, 사용자 동의를 처리합니다.
그 결과로 액세스 토큰이 생성되며, 클라이언트는 이 토큰을 Google API 요청에 포함하기 전에 유효성을 검사해야 합니다. 토큰이 만료되면 애플리케이션에서 프로세스를 반복합니다.
![JS 애플리케이션이 Google 승인 서버로 토큰 요청을 전송하고, 토큰을 수신하고, 토큰을 검증하고, 토큰을 사용하여 Google API 엔드포인트를 호출합니다.](https://developers-dot-devsite-v2-prod.appspot.com/static/identity/protocols/oauth2/images/flows/implicit.png?authuser=7&hl=ko)
자세한 내용은 클라이언트 측 애플리케이션에 OAuth 2.0 사용하기를 참고하세요.
입력이 제한된 기기의 애플리케이션
Google OAuth 2.0 엔드포인트는 게임 콘솔, 비디오 카메라, 프린터와 같이 입력이 제한된 기기에서 실행되는 애플리케이션을 지원합니다.
승인 순서는 애플리케이션이 승인 코드를 위해 Google URL에 웹 서비스를 요청하는 것으로 시작됩니다. 응답에는 애플리케이션이 사용자에게 표시하는 URL 및 코드를 비롯한 여러 매개변수가 포함됩니다.
사용자는 기기에서 URL과 코드를 가져온 다음 더 다양한 입력 기능을 갖춘 별도의 기기나 컴퓨터로 전환합니다. 사용자가 브라우저를 시작하고, 지정된 URL로 이동하여 로그인하고, 코드를 입력합니다.
한편 애플리케이션은 지정된 간격으로 Google URL을 폴링합니다. 사용자가 액세스를 승인하면 Google 서버의 응답에 액세스 토큰과 갱신 토큰이 포함됩니다. 애플리케이션은 나중에 사용할 수 있도록 갱신 토큰을 저장하고 이 액세스 토큰을 사용하여 Google API에 액세스해야 합니다. 액세스 토큰이 만료되면 애플리케이션에서 갱신 토큰을 사용하여 새 토큰을 얻습니다.
![사용자가 브라우저가 있는 별도의 기기에 로그인합니다.](https://developers-dot-devsite-v2-prod.appspot.com/static/identity/protocols/images/oauth2/device/flow.png?authuser=7&hl=ko)
자세한 내용은 기기용 OAuth 2.0 사용을 참고하세요.
서비스 계정
Prediction API 및 Google Cloud Storage와 같은 Google API는 사용자 정보에 액세스하지 않고도 애플리케이션을 대신하여 작동할 수 있습니다. 이러한 상황에서는 애플리케이션이 API에 자체 ID를 증명해야 하지만 사용자 동의는 필요하지 않습니다. 마찬가지로 엔터프라이즈 시나리오에서는 애플리케이션이 일부 리소스에 대한 위임된 액세스 권한을 요청할 수 있습니다.
이러한 유형의 서버 간 상호작용에는 개별 최종 사용자가 아닌 애플리케이션에 속한 계정인 서비스 계정이 필요합니다. 애플리케이션은 서비스 계정을 대신하여 Google API를 호출합니다. 사용자 동의는 필요하지 않습니다. (서비스 계정이 아닌 시나리오에서는 애플리케이션이 최종 사용자를 대신하여 Google API를 호출하며, 사용자 동의가 필요한 경우도 있습니다.)
Google API Console에서 가져오는 서비스 계정의 사용자 인증 정보에는 생성된 고유한 이메일 주소, 클라이언트 ID, 하나 이상의 공개 키/비공개 키 쌍이 포함됩니다. 클라이언트 ID와 비공개 키 하나를 사용하여 서명된 JWT를 만들고 적절한 형식으로 액세스 토큰 요청을 작성합니다. 그런 다음 애플리케이션이 액세스 토큰을 반환하는 Google OAuth 2.0 승인 서버로 토큰 요청을 보냅니다. 애플리케이션은 이 토큰을 사용하여 Google API에 액세스합니다. 토큰이 만료되면 애플리케이션에서 프로세스를 반복합니다.
![서버 애플리케이션은 JWT를 사용하여 Google 승인 서버에서 토큰을 요청한 다음 토큰을 사용하여 Google API 엔드포인트를 호출합니다. 최종 사용자는 관여하지 않습니다.](https://developers-dot-devsite-v2-prod.appspot.com/static/identity/protocols/oauth2/images/flows/jwt.png?authuser=7&hl=ko)
자세한 내용은 서비스 계정 문서를 참조하세요.
토큰 크기
토큰 크기는 다음과 같은 한도까지 다양할 수 있습니다.
- 승인 코드: 256바이트
- 액세스 토큰: 2,048바이트
- 갱신 토큰: 512바이트
Google Cloud의 Security Token Service API에서 반환하는 액세스 토큰은 Google API OAuth 2.0 액세스 토큰과 비슷하게 구조화되지만 토큰 크기 제한이 다릅니다. 자세한 내용은 API 문서를 참고하세요.
Google은 한도 내에서 토큰 크기를 변경할 권리를 보유하며, 이에 따라 애플리케이션에서 가변 토큰 크기를 지원해야 합니다.
갱신 토큰 만료
부여된 갱신 토큰이 더 이상 작동하지 않을 가능성을 예측하기 위해 코드를 작성해야 합니다. 새로고침 토큰은 다음 이유 중 하나로 인해 작동을 멈출 수 있습니다.
- 사용자가 앱의 액세스 권한을 취소했습니다.
- 갱신 토큰이 6개월 동안 사용되지 않았습니다.
- 사용자가 비밀번호를 변경했으며 갱신 토큰에 Gmail 범위가 포함되어 있습니다.
- 사용자 계정에 부여된 (실시간) 갱신 토큰의 최대 개수를 초과했습니다.
- 관리자가
앱 범위에서 요청된 서비스 중 하나를 제한됨으로 설정한 경우 (오류는
admin_policy_enforced
임). - Google Cloud Platform API - 관리자가 설정한 세션 길이가 초과되었을 수 있습니다.
외부 사용자 유형에 맞게 OAuth 동의 화면이 구성되고 게시 상태가 '테스트 중'인 Google Cloud Platform 프로젝트에는 7일 후에 만료되는 갱신 토큰이 발급됩니다. 단, 요청된 OAuth 범위가 이름, 이메일 주소, 사용자 프로필의 하위 집합 (
userinfo.email, userinfo.profile, openid
범위 또는 OpenID Connect의 동등한 범위를 통해)인 경우는 예외입니다.
현재 OAuth 2.0 클라이언트 ID당 Google 계정당 갱신 토큰 100개로 제한됩니다. 한도에 도달하면 새 갱신 토큰을 만들 때 경고 없이 자동으로 가장 오래된 갱신 토큰을 무효화합니다. 이 한도는 서비스 계정에는 적용되지 않습니다.
또한 사용자 계정 또는 서비스 계정이 모든 클라이언트에서 보유할 수 있는 총 갱신 토큰 수에도 더 큰 한도가 적용됩니다. 대부분의 일반 사용자는 이 한도를 초과하지 않지만 구현을 테스트하는 데 사용되는 개발자 계정은 이 한도를 초과할 수 있습니다.
여러 프로그램, 머신 또는 기기를 승인해야 하는 경우 한 가지 해결 방법은 Google 계정당 승인하는 클라이언트 수를 15개 또는 20개로 제한하는 것입니다. Google Workspace 관리자는 관리자 권한이 있는 추가 사용자를 만들고 이를 사용하여 일부 클라이언트를 승인할 수 있습니다.
Google Cloud Platform (GCP) 조직의 세션 제어 정책 처리
GCP 조직의 관리자는 GCP 리소스에 액세스하는 동안 Google Cloud 세션 제어 기능을 사용하여 사용자를 자주 재인증해야 할 수 있습니다. 이 정책은 Google Cloud 콘솔, Google Cloud SDK (gcloud CLI라고도 함), Cloud Platform 범위가 필요한 서드 파티 OAuth 애플리케이션에 대한 액세스에 영향을 미칩니다. 사용자에게 세션 제어 정책이 설정되어 있는 경우 세션 시간이 만료될 때 API 호출은 갱신 토큰이 취소되었을 때 발생하는 오류와 유사하게 오류가 발생합니다. 호출이 invalid_grant
오류 유형으로 실패합니다. error_subtype
필드는 세션 제어 정책 (예: "error_subtype": "invalid_rapt"
)으로 인한 취소 토큰과 실패를 구분하는 데 사용할 수 있습니다 (예: "error_subtype": "invalid_rapt"
) 세션 시간은 1시간까지는 유예 기간 1시간으로 매우 제한될 수 있습니다.
마찬가지로 서버 간 배포를 위해 사용자 인증 정보를 사용하거나 사용을 유도해서도 안 됩니다. 사용자 인증 정보가 장기 실행 작업 또는 작업을 위해 서버에 배포되고 고객이 이러한 사용자에게 세션 제어 정책을 적용하면 세션 시간이 만료되면 사용자를 다시 인증할 방법이 없으므로 서버 애플리케이션이 실패합니다.
고객이 이 기능을 배포할 수 있도록 지원하는 방법에 대한 자세한 내용은 관리자를 위한 도움말을 참조하세요.
클라이언트 라이브러리
다음 클라이언트 라이브러리는 널리 사용되는 프레임워크와 통합되어 있으므로 OAuth 2.0을 보다 쉽게 구현할 수 있습니다. 앞으로 더 많은 기능이 라이브러리에 추가될 예정입니다.