Google APIs에 접근하기 위해 OAuth 2.0사용하기 Google API


Google APIs에 접근하기 위해 OAuth 2.0사용하기


구글 API는 인증과 확인을 위해 OAuth 2.0 프로토콜을 사용한다. 구글은 웹서버, 설치된, 클라이언트 사이드 어플리케이션을 위해 공통 OAuth 2.0시나리오를 지원한다.

시작하기 위해, 구글 API콘솔로부터 OAuth 2.0 클라이언트 크레덴셜을 얻는다. 그러면 클라이언트 어플리케이션은 구글 인증서버로 부터 접근 토큰을 요청하고 반응에서 토큰을 추출하고 해당 토큰을 구글 API로 보낸다. 구글과의 OAuth 2.0을 사용하기 위한 상호적 데모는 OAuth 2.0 Playground 로 실험한다.

이 페이지는 구글이 지원하는 OAuth 2.0 인증 시나리오 오버뷰를 제공하고 더 자세한 콘텐트에 대한 링크를 제공한다. 인증을 위한 OAuth 2.0을 사용에는 OpenID Connect를 살펴본다.

일러두기: 알맞은 구현을위해 구글의 OAuth 2.0 엔드포인트와 상호작용할 때 OAuth 2.0을 사용하기를 권장한다. 많은 사람들을 통해 잘 디버그된 코드 일 뿐만아니라 자신과 사용자를 보호하는데 도움이 될 것이다. 더 자세한 사항은 클라이언트 라이브러리를 살펴본다.

기본 단계들

OAuth 2.0을 사용하는 구글 API에 접근할 때 기본 패턴을 따라야 한다. 높은 레벨에서 다음 4단계를 따르도록 한다.

1. 구글 API콘솔에서 OAuth 2.0 크레덴셜을 얻는다.
구글 API콘솔에 방문해 클라이언트 아이디와 클라이언트 시크릿 같은 OAuth 2.0 크레덴셜을 얻는다. 값의 설정은 작성중인 어플리케이션 형식에 따라 달라진다. 예를 들어, 자바스크립트 어플리케이션은 시크릿이 필요치 않지만 웹서버 어플리케이션은 필요로 한다.

2. 구글 인증 서버로부터 접근 토큰 획득하기
구글 API를 사용해 개인적 데이터를 얻기 전에 접근 토큰을 얻어야 한다. 단일 접근 토큰은 다중 API의 접근의 다양한 정도로 얻을 수 있다. scope 변수라 불리는 변수 파라미터는 리소스와 연산의 집합을 제어하는 것이다. 접근 토큰 요청동안 어플리케이션은 scope 파라미터에 하나 이상의 값을 보낸다.

이 요청을 만드는 몇가지 방법이 있고, 어플리케이션의 형식에 기반해 다양하다. 예를 들어, 자바스크립트 어플리케이션은 웹 브라우져 리다이렉트를 구글로함으로서 얻어지며, 장치에 설치된 어플리케이션은 브라우져 없이 웹 서비스 요청을 사용한다.

몇몇 요청은 구글 계정에 사용자가 로그인할 때 인증 단계가 요구된다. 로그인 한 후 사용자는 어플리케이션이 요청하는 퍼미션을 허용할지 물어봐지게 된다. 이 단계는 사용자 콘센트라고 한다. 

만약 사용자게 퍼미션을 허용하면 구글 인증 서버는 어플리케이션에게 접근 토큰을 보내준다. (또는 인증코드를 보내주는데 접근 토큰을 얻기 위해 어플리케이션에서 사용할 수 있다) 만약 사용자가 퍼미션을 허용하지 않으면 서버는 에러를 반환한다.

이는 일반적으로 가중된 범위 요청에 적절하며 시간 접근이 요구된다. 예를 들어, 앱이 구글 웹렛 접근은 사용자가 buy버튼을 누르기 전까지는 요청되지 않아야 한다.

3. API에 접근 토큰 보내기
어플리케이션이 접근 토큰을 받은 후 HTTP 인증 헤더에 구글 API 로 토큰을 보낸다. URI쿼리 스트링으로 보낼 수도 있지만, 추천하지 않는다. URI파라미터는 로그파일에 쓰일 수 있고 완전히 안전하지 않기 때문이다. 또한 REST 처리를 통해 불필요한 URI파라미터를 피할 수 있다.

접근 토큰은 토큰 요청의 scope에 지정된 연산과 리소스에만 접근할 수 있다. 예를들어, 만약 접근 토큰이 Google+API를 위해 이슈되면 구글 콘택트 API로 접근하는데 허용되지 않는다. 하지만 Google+ API로는 같은 연산으로 여러번 보낼 수 있다.

4. 필요한 경우 접근 토큰을 새로고침한다.
접근 토큰은 제한된 라이프타임이 있다. 만약 어플리케이션이 단일 접근 토큰의 라이프타임을 넘어서 Google API에 접근해야 한다면 새로고침 토큰을 얻을 수 있다. 새로고침 토큰은 어플리케이션이 새로운 접근 토큰을 얻을 수 있게 한다.

일러두기: 새로고침 토큰을 안전하게 저장하고 이들이 유효하다면 사용을 지속한다. 클라이언트-사용자 콤비네이션, 모든 클라이언트에 대한 사용자당 새로고침 토큰이 제한된다. 만약 어플리케이션이 제한 중의 한번에 새로고침 토큰을 요청하면 이전 새로고침 토큰은 작동을 멈춘다.

시나리오

웹서버 어플리케이션

구글 OAuth 2.0 엔드포인트는 PHP, Java, Python, Ruby, and ASP.NET 과 같은 프레임워크를 사용하는 웹서버 어플리케이션을 지원한다.

인증 순서는 어플리케이션이 브라우져를 구글 URL로 리디렉션할 때 시작된다. URL은 쿼리 파라미터를 포함해 요청하는 접근의 종류를 가리킨다. 구글은 사용자 인증, 세션 선택, 사용자 콘센트를 관리한다. 결과는 인증 코드로서 어플리케이션이 접근 토큰과 새로고침 토큰으로 교환할 수 있다.

어플리케이션은 새로고침 토큰을 저장하고 접근 토큰으로 구글 API에 접근한다. 접근 토큰이 만료되면 어플리케이션은 새로고침 토큰을 사용해 새로운 것을얻는다.

Your application sends a token request to the Google Authorization Server, receives an authorization code,exchanges the code for a token, and uses the token to call a Google API endpoint.



세부사항은 Using OAuth 2.0 for Web Server Applications 를 살펴본다.

설치된 어플리케이션

구글 OAuth 2.0 엔드포인트는 컴퓨터나, 모바일 장치, 태블릿과 같은 장치에서 설치된 어플리케이션을 지원한다. 구글 API 콘솔을 통해 클라이언트 ID를 생성하면 설치된 어플리케이션으로 지정하고 안드로이드, 크롬, iOS 또는 Other로 어플리케이션 형식을 지정한다.

클라이언트 ID내의 처리결과와 클라이언트 시크릿을 어플리케이션 소스코드에 임베드한다. (이 상황에서는 클라이언트 시크릿은 확실히 시크릿이 아니다)

인증 시퀀스는 어플리케이션이 브라우져를 구글 URL로 리디렉션하면 시작한다. URL은 요청하는 접근의 종류를 가리키는 쿼리 파라미터를 포함한다. 구글은 사용자 인증, 세션 선택, 사용자 콘센트를 다룬다. 결과는 인증 코드로서 어플리케이션이 접근 토큰과 새로고침 토큰으로 교환할 수 있다.

어플리케이션은 새로고침 토큰을 저장하고 구글 API로의 접근에 접근 토큰을 사용한다. 접근 토큰이 만료되면 어플리케이션은 새로운 것을 얻기 위해 새로고침 토큰을 사용한다.

Your application sends a token request to the Google Authorization Server, receives an authorization code,exchanges the code for a token, and uses the token to call a Google API endpoint.

세부사항은, 설치된 어플리케이션에 Using OAuth 2.0 을 사용한다.

클라이언트 사이드 (자바스크립트) 어플리케이션

구글 OAuth 2.0 엔드포인트는 브라우져에서 실행할 자바스크립트 어플리케이션을 지원한다.

The authorization sequence begins when your application redirects a browser to a Google URL; the URL includes query parameters that indicate the type of access being requested. Google handles the user authentication, session selection, and user consent.

The result is an access token, which the client should validate before including it in a Google API request. When the token expires, the application repeats the process.

Your JS application sends a token request to the Google Authorization Server, receives a token,validates the token, and uses the token to call a Google API endpoint.

세부사항은 Using OAuth 2.0 for Client-side Applications 를 살펴본다.

제한된 입력 장치상의 어플리케이션

The Google OAuth 2.0 endpoint supports applications that run on limited-input devices such as game consoles, video cameras, and printers.

The authorization sequence begins with the application making a web service request to a Google URL for an authorization code. The response contains several parameters, including a URL and a code that the application shows to the user.

The user obtains the URL and code from the device, then switches to a separate device or computer with richer input capabilities. The user launches a browser, navigates to the specified URL, logs in, and enters the code.

Meanwhile, the application polls a Google URL at a specified interval. After the user approves access, the response from the Google server contains an access token and refresh token. The application should store the refresh token for future use and use the access token to access a Google API. Once the access token expires, the application uses the refresh token to obtain a new one.

The user logs in on a separate device that has a browser.

For details, see Using OAuth 2.0 for Devices.


서비스 어카운트

프레딕션 API와 구글 클라우드 스토리지와 같은 구글 API는 사용자 정보에 접근하지 않고 어플리케이션의 일부로 작동할 수 있다. 이런상황에서 어플리케이션은 API로 자체적인 인증을 수행하지만 사용자 콘센트는 불필요하다. 비슷하게, 기업 시나리오에서 어플리케이션은 델리게이트된 접근으로 몇몇 리소스를 요청할 수 있따.

이런 서버 투 서버 상호작용에서는 서비스 계정이 필요하다. 이는 구별된 엔드유져대신 어플리케이션을 소유하는 계정이다. 어플리케이션은 서비스 계정상에서 구글 API를 호출하며 사용자 콘센트는 불필요하다. (비서비스 계정 시나리오라면 어플리케이션은 엔드유저에 일부인 구글 API를 호출하고 사용자 콘센트가 간혹 필요할 수 있다.)

일러두기: 이런 서비스 계정 시나리오는 어플리케이션이 JSON Web Tokens (JWTs)  를 생성하고 암호로 사인해야 한다. 이런 작업에는 라이브러리를 사용하기를 강력히 추천한다. 토큰 생성 추상화와 서명을 수행하는 라이브러리를 사용하지 않고 코드를 작성하면 어플리케이션 보안에 심각한 문제를 발생시킬 수 있다. 이 시나리오에 대해 라이브러리 전체리스트는 서비스 계정 문서를 살펴본다.

서비스 계정의 크레덴셜은 Google API 콘솔에서 얻을 수 있으며 생성된 이메일 주소를 포함하며 고유의 , 클라이언트 ID, 그리고 적어도 하나의 공개/개인 키 페어가 필요하다. 클라이언트 ID와 개인 키를 사용해 서명된 JWT를 생성하고 적절한 포맷으로 접근 토큰 요청을 생성한다. 어플리케이션은 구글 OAuth 2.0 인증 서버로 요청을 보내고 이 것은 접근 토큰을 반환한다. 어플리케이션은 구글 API로 접근할 토큰을 사용한다. 토큰이 만료되면, 어플리케이션은 처리를 반복한다.

Your server application uses a JWT to request a token from the Google Authorization Server,then uses the token to call a Google API endpoint. No end-user is involved.

For details, see the service-account documentation.

Note: Although you can use service accounts in applications that run from a G Suite domain, service accounts are not members of your G Suite account and aren’t subject to domain policies set by G Suite administrators. For example, a policy set in the G Suite admin console to restrict the ability of G Suite end users to share documents outside of the domain would not apply to service accounts.

토큰 만료

반드시 새로고침 토큰이 작동하지 않는 상황을 감안해야 한다. 새로고침 토큰은 다음 이유에서 작동되지 않을 수 있다.

- 사용자가 앱의 접근을 폐기했다.
- 새로고침 토큰이 6개월 동안 사용되지 않았다.
- 사용자가 비밀번호를 변경했고 새로고침 토큰이 Gmail 범위를 가지고 있다.
- 사용자 계정이 최대 허용가능 새로고침 토큰에 근접했다.

사용자당 50개의 새로고침 토큰으로 제한된다. 만약 제한에 근접하면 경고없이 이전 새로고침 토큰이 무효화되고 새로운 새로고침 토큰이 생성된다. 이 제한은 서비스 어카운트에는 적용되지 않는다.

There is also a larger limit on the total number of refresh tokens a user account or service account can have across all clients. Most normal users won't exceed this limit but a developer's test account might.

If you need to authorize multiple programs, machines, or devices, one workaround is to limit the number of clients that you authorize per user account to 15 or 20. If you are a G Suite admin, you can create additional admin users and use them to authorize some of the clients.

Client libraries

The following client libraries integrate with popular frameworks, which makes implementing OAuth 2.0 simpler. More features will be added to the libraries over time.

Google API Client Library for Java
Google API Client Library for Python
Google API Client Library for Go
Google API Client Library for .NET
Google API Client Library for Ruby
Google API Client Library for PHP
Google API Client Library for JavaScript
GTMAppAuth - OAuth Client Library for Mac and iOS

덧글

댓글 입력 영역