OAuth 2.0 인증 구현하기 Google API


OAuth 2.0 인증 구현하기

Overview


유튜브 데이터 API는 OAuth 2.0 프로토콜을 지원해 개인 사용자 데이터에 접근할 때 인증으로 사용한다. 다음 리스트는 핵심 OAuth 2.0개념을 나열한다.
- 사용자가 먼저 어플리케이션의 기능을 사용하려고 시도 할 때 사용자가 구글 계정 또는 유튜브 계정에 로그인 되어야 하고 어플리케이션은 OAuth 2.0 인증 단계를 초기화한다.
- 어플리케이션은 사용자를 구글의 인증 서버로 전달하낟. 페이지에 대한 링크는 사용자 어카운트를 요청하는데 접근 범위를 지정한다. scope 는 어플리케이션이 얻고, 입력하고, 업데이트하고 또는 삭제할 범위를 지정한다.
- 만약 사용자가 어플리케이션에 접근을 허용하면 구글은 어플리케이션으로 토큰을 반환한다. 어플리케이션 형식에 기반해 토큰을 확인하거나 토큰을 다른 형식으로 교환한다.
예를 들어, 서버 사이드 웹 어플리케이션은 접근 토큰과 새로고침 토큰을 위한 반환된 토큰으로 교환한다. 접근 토큰은 어플리케이션이 사용자의 작용에 대한 요청을 인증하도록 하고 새로고침 토큰은 어플리케이션이 원본 접근 토큰이 만료괼 때 새로운 접근 토큰을 얻을 수 있게 한다.

중요: OAuth 2.0 인증을 사용하려면 Google Developers Console 에서 인증 크레덴셜을 얻어야 한다.

OAuth 2.0 흐름

구글 API는 몇몇 OAuth 2.0 사용자 케이스를 지원한다.
- 서버 사이드 플로우는 웹 어플리케이션을 지원해 유지 정보를 안전하게 저장하도록 한다.
- 클라이언트 사이드 플로우는 브라우져 내에서 실행중인 자바스크립트 어플리케이션을 지원한다.
- 설치된 어플리케이션 플로우는 폰이나 컴퓨터에 설치된 어플리케이션을 지원한다.
- 장치 플로우는 게임콘솔이나 비디오 카메라와 같은 한정된 입력 장치를 지원한다.
- 서비스 어카운트 플로우는 서버 투 서버 인터렉션을 지원하는데 사용자 정보에는 접근하지 않는 것이다. 그러나, 유튜브 데이터 API는 이 플로우를 지원하지 않는다. 서비스 어카운트를 유튜브 계정으로 연결할 방법이 없기 때문인데 이 플로우로 인증을 요청하면 NoLinkedYouTubeAccount 에러를 발생시킨다.

인증 크레덴셜 얻기

어플리케이션은 반드시 인증 크레덴셜을 확보해야 유튜브 데이터 API를 사용할 수 있다. 이 문서는 구글 개발자 콘솔이 지원하는 인증 크레덴셜의 다른 형식을 설명한다. 프로젝트를 위한 인증 크레덴셜을 찾거나 생성하는 방법을 설명한다.

프로젝트 생성하고 API서비스 선택하기

1. 크레덴셜 페이지 열기
2. API는 API키와 OAuth 2.0 크레덴셜을 지원한다. 프로젝트에 적절한 크레덴셜을 생성한다.
OAuth 2.0: 어플리케이션은 반드시 OAuth 2.0 토큰을 모든 리퀘스트에 보내며 사용자 데이터에 접근한다. 어플리케이션은 클라이언트 아이디와 클라이언트 시크릿을 보낸다. 웹어플리에케이션, 서비스 계정, 설치된 어플리케이션을 위한 OAuth 2.0을 생성할 수 있다.
API keys: OAuth 2.0 토큰을 제공하지 않는 요청은 반드시 API키를 보내야 한다. 키는 프로젝트를 확인하고 API 접근, 쿼트, 보고서를 제공한다.

OAuth 2.0 크레덴셜 생성하기

웹어플리케이션, 서비스 어카운트, 설치된 어플리케이션을 위해 OAuth 2.0 크레덴셜을 생성할 수 있다.

웹 어플리케이션
웹 어플리케이션은 네트워크 넘어 웹브라우져로 접근한다.
- 자바스크립트를 사용하는 어플리케이션이 유튜브 데이터 API에 접근하려면 반드시 인증된 자바 스크립트 오리진을 지정해야 한다. 오리진은 어플리케이션이 보내는 API요청으로 부터 도메인을 확인한다.
- PHP, 자바, 파이썬, 루비, 그리고 닷넷과 같은 프레임웍이나 언어를 사용하는 어플리케이션은 반드시 인증된 리다이렉트 URI 를 지정해야 한다. 재전달된 URI는 OAuth 2.0 서버가 반응을 보낼 수 있는 엔드포인트이다.

서비스 어카운트
서비스 어카운트는 어플리케이션의 부분에서 API를 호출하는 어플리케이션에서 사용되는 것으로서 사용자 정보에는 접근하지 않는다. 이런 형식의 어플리케이션은 자체적인 아이덴티티를 증명해야 하지만 사용자에게 인증 요청은 필요칭 않다. 구글 어카운트 문서에 서비스 어카운트에 대한 더 자세한 사항이 포함된다.

설치된 어플리케이션
설치된 어플리케이션은 데스크탑, 핸드헬드 장치에서 실행된다. 안드로이드, 크롬, iOS, 그리고 다른 설치된 어플리케이션을 위해 OAuth 2.0크레덴셜을 생성할 수 있다.

안드로이드
안드로이드 앱의 패키지 이름과 SHA1 핑거프린트 를 지정해야 한다.
1. 패키지 이름 필드에 안드로이드 앱의 패키지 이름을 입력한다.
2. 터미널에서 keytool 유틸리티를 사용해 .apk 파일의 공개인증서로부터 SHA1 핑거프린트를 얻는다.

keytool -exportcert -alias androiddebugkey -keystore path-to-debug-or-production-keystore -list -v

일러두기: debug.keystore 에 대해 암호는 android 이다. 이클립스에서 디버그 키스토어는 보통 ~/.android/debug.keystore 에 있다.

keytool 은 쉘에 핑거프린트를 프린트한다. 예를 들어:

$ keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore -list -vEnter keystore password: Type "android" if using debug.keystoreAlias name: androiddebugkeyCreation date: Aug 27, 2012Entry type: PrivateKeyEntryCertificate chain length: 1Certificate[1]:Owner: CN=Android Debug, O=Android, C=USIssuer: CN=Android Debug, O=Android, C=USSerial number: 503bd581Valid from: Mon Aug 27 13:16:01 PDT 2012 until: Wed Aug 20 13:16:01 PDT 2042Certificate fingerprints:   MD5:  1B:2B:2D:37:E1:CE:06:8B:A0:F0:73:05:3C:A3:63:DD   SHA1: D8:AA:43:97:59:EE:C5:95:26:6A:07:EE:1C:37:8E:F4:F0:C8:05:C8   SHA256: F3:6F:98:51:9A:DF:C3:15:4E:48:4B:0F:91:E3:3C:6A:A0:97:DC:0A:3F:B2:D2:E1:FE:23:57:F5:EB:AC:13:30   Signature algorithm name: SHA1withRSA   Version: 3

위에 표시된 SHA1 지문을 복사한다.
3. 해당 SHA1 지문을 요청하는 폼에 붙여 넣는다.
4. 생성을 클릭한다.

크롬 어플리케이션
크롬 앱이나 확장을 위해선 어플리케이션 아이디를 지정해야 한다. Google Chrome Identity API를 사용해 해당 아이디를 생성한다.

iOS
앱 번들 아이디와 앱 스토어 아이디를 지정한다.
- 어플리케이션 번들 아이디는 앱의 .plist 에 나열된 번들 아이디이다. 예를 들면: com.example.myapp
- 어플리케이션의 앱 스토어 아이디는 앱의 iTunes URL내부에 있는 것이다. For example, in the app URL http://itunes.apple.com/us/app/google+/id447119634, the App Store ID is 447119634.

다른것
디벨로퍼 콘솔은 다른 설치된 어플리케이션에 대해서 OAuth 2.0 크레덴셜을 생성하는데 추가정보를 요구하지 않는다.

API키 생성하기

API는 API키의 몇몇 형식을 지원한다. 만약 키 형식이 이미 존재하지 않는다면 Add credentials > API key를 클릭해 API키를 생성한다. 키 형식에 대한 추가정보를 입력한다.

서버 키
어플리케이션이 서버에서 실행된다면 서버 키를 생성하고 사용한다. 이 키는 서버 코드 외부에서는 사용하지 않는다. 웹페이지에서 임베드하지 않는다. 쿼트 도둑을 방지하려면 키를 제한하며 서버의 소스 아이피에서만 접근 가능하도록 한다.

브라우져 키
웹 브라우져와 같은 클라이언트에서 어플리케이션을 실행한다면 브라우져 키를 생성하고 사용한다. 비인증 사이트에서 사용되는 것을 방지하려면 관리하는 도메인을 리퍼럴로 허용한다.

iOS키
만약 어플리케이션이 iOS 장치에서 실행되면 iOS키를 생성하고 사용한다. 구글은 지정된 번들 지정자중에 하나임을 확인한다. 

안드로이드 키
어플리케이션이 안드로이드 장치에서만 실행되면 안드로이드 키를 생성하고 사용한다. 이를위해 SHA1 지문을 지정하고 키를 사용할 어플리케이션의 패키지 이름들을 사용한다.

1. 패키지 이름 필드에서는 안드로이드 앱의 패키지 이름을 입력한다.
2. 터미널에서 keytool 유틸리티를 실행해 .apk 파일의 공개 인증서에 대한 SHA1 지문을 얻는다.
keytool -exportcert -alias androiddebugkey -keystore path-to-debug-or-production-keystore -list -v

Note: For the debug.keystore, the password is android. For Eclipse, the debug keystore is typically located at ~/.android/debug.keystore.
The Keytool prints the fingerprint to the shell. For example:

$ keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore -list -v
Enter keystore password: Type "android" if using debug.keystore
Alias name: androiddebugkey
Creation date: Aug 27, 2012
Entry type: PrivateKeyEntry
Certificate chain length: 1
Certificate[1]:
Owner: CN=Android Debug, O=Android, C=US
Issuer: CN=Android Debug, O=Android, C=US
Serial number: 503bd581
Valid from: Mon Aug 27 13:16:01 PDT 2012 until: Wed Aug 20 13:16:01 PDT 2042
Certificate fingerprints:
   MD5:  1B:2B:2D:37:E1:CE:06:8B:A0:F0:73:05:3C:A3:63:DD
   SHA1: D8:AA:43:97:59:EE:C5:95:26:6A:07:EE:1C:37:8E:F4:F0:C8:05:C8
   SHA256: F3:6F:98:51:9A:DF:C3:15:4E:48:4B:0F:91:E3:3C:6A:A0:97:DC:0A:3F:B2:D2:E1:FE:23:57:F5:EB:AC:13:30
   Signature algorithm name: SHA1withRSA
   Version: 3
Copy the SHA1 fingerprint, which is highlighted in the example above.

Important: When you prepare to release your app to your users, follow these steps again and create a new OAuth 2.0 client ID for your production app. For production apps, use your own private key to sign the production app's .apk file. For more information, see Signing your applications.
Paste the SHA1 fingerprint into the form where requested.
Click Create.

웹 서버 어플리케이션에 OAuth 2.0 사용하기

이 문서는 웹 서버 어플리케이션이 어떻게 구글 API클라이언트 라이브러리나 구글 OAuth 2.0 엔드포인트를 사용하여 유튜브 데이터 API에 접근하기 위해 OAuth 2.0 인증을 구현하는지 살펴본다. OAuth 2.0은 사용자가 사용자 이름, 암호, 그리고 다른 개인 정보를 보호하는 상태에서 사용자가 특정 데이터를 공유할 수 있게 한다. 예를 들어 OAuth 2.0을 사용해 사용자의 유튜브 채널에 비디오를 업로드할 허락을 얻는다.

이 OAuth 2.0플로우는 사용자 인증에 대한 것이다. 이는 어플리케이션이 컨피덴셜 정보와 상태를 유지하기 위한 어플리케이션을위해 설계되었다. 적절하게 인증된 웹 서버 어플리케이션은 사용자가 어플리케이션과 상호작용하거나 어플리케이션에서 벗어난 동안 API 에 접근하게 한다.

엡 서버 어플리케이션은 종종 service 계정을 사용해 API요청을 인증하는데, 사용자 지정 데이터보다 프로젝트 기반데이터에 접근하는 클라우드 API를 호출할 떄 주로 사용한다. 웹 서버 어플리케이션은 서비스 어플리케이션을 사용자 인증과 서비스 어카운트 결합한다. 유튜브 데이터 API는 유튜브 채널을 관리하는 컨텐트 오너를 위해 서비스 어카운트를 지원한다. 특히, 컨텐트 오너는 서비스 어카운트를 사용해 API메소드를 호출할 때 사용하며 onBehalfOfContentOwner 요청 파라미터를 지원한다.

Note: Given the security implications of getting the implementation correct, we strongly encourage you to use OAuth 2.0 libraries when interacting with Google's OAuth 2.0 endpoints. It is a best practice to use well-debugged code provided by others, and it will help you protect yourself and your users. For more information, see Client libraries.

클라이언트 라이브러리

이 패이지에서 언어 지정 예시는 Google API Client 라이브러리를 OAuth 2.0 인증 구현을 위해 사용한다. 코드 샘플을 실행하려면 언어에 맞는 클라이언트 라이브러리를 설치해야 한다.

구글 API클라이언트 라이브러리를 사용하여 OAuth 2.0플로우를 다룰 때 클라이언트 라이브러리는 어플리케이션이 자체적으로 다룰 다양한 액션을 처리한다. 예를 들어 어플리케이션이 언제 사용되고 새로고침된 접근 토큰을 사용할지를 처리한다. 클라이언트 라이브러리는 또한 알맞은 리디렉션 URL을 생성하고 리디렉트 핸들러 구현을 도와서 접근 코큰을 위한 인증 코드 교환을 가능하게 한다.

클라이언트 라이브러리는 다음 언어에 대해 가용하다.
- Go
- Java
- .NET
- Node.js
- PHP
- Python
- Ruby

선행요건

프로젝트에 API 가능하게 하기
구글API를 호출하는 모든 어플리케이션은 해당 API를 API콘솔에서 활성해야 한다. 적절한 API를 활성화하려면 다음을 수행한다.
1. API콘솔에서 라이브러리 페이지를 연다
2. 어플리케이션에 연계된 프로젝트를 선택한다. 만약 가지고 있지 않다면 프로젝트를 생성한다.
3. 라이브러리 페이지를 사용해 유튜브 데이터 API를 활성화 한다. 어플리케이션이 사용할 다른 API를 찾아 그 것도 활성화한다.

인증 크레덴셜 생성하기

OAuth 2.0을 사용하여 구글 API에 접근하는 모든 어플리케이션은 구글의 OAuth 2.0 서버에 어플리케이션을 확인하는 인증 크레덴셜을 반드시 가져야한다. 다음 단계는 어떻게 프로젝트에 크레덴셜을 생성하는지 설명한다. 어플리케이션 프로젝트에 활성화한 API에 접근하기 위해 크레덴셜을 사용할 수 있다.

1. API콘솔에 크레덴셜 페이지를 연다
2. Create credentials > OAuth client ID
3. 폼을 완성. 어플리케이션 형식을 웹 어플리케이션으로 설정. 언어와 PHP, Java, Python, Ruby, and .NET과 같은 프레임워크를 사용하는 어플리케이션은 반드시 인증된 리디렉트 URI를 지정한다. 리디렉트 URI는 OAuth 2.0서버가 응답을 보낼 끝점이다.

테스팅을 위해 로컬 머신을 리퍼하는 URI를 지정할 수 있다. http://localhost:8080 . 이 문서의 모든 예시는 http://localhost:8080을 리다이렉트 UI로 사용한다.

앱의 인증 엔드포인트를 설계하여 페이지상의 다른 리소스로의 인증을 표시하지 않도록 한다.

크레덴셜을 생성한 후 client_secret.json 을 API Console 에서 다운로드한다. 안전하게 파일을 저장하며 오직 어플리케이션만 접근할 수 있게 한다.

Important: Do not store the client_secret.json file in a publicly-accessible location. In addition, if you share the source code to your application—for example, on GitHub—store the client_secret.json file outside of your source tree to avoid inadvertently sharing your client credentials.

접근 범위 지정

범위는 어플리케이션이 리소스에 대한 요청에서 접근량을 조절할 수 있게 한다. 그러므로, 요청된 범위의 숫자 사이의 반대 관계가 있을 수 있고 사용자 합의를 얻는 것이 있을 수 있다.

OAuth 2.0 인증을 구현하기 전에 앱이 접근할 허락에 필요한 범위를 지정하기를 추천한다.

가중 인증을 통해 인증 범위에 접근 요청하기를 추천한다. 이는 사용자가 더욱 쉽게 어플리케이션이 요청하는 것을 이해할 수 있게 한다.

유튜브 데이터 API는 다음 범위에서 사용된다.

copes
https://www.googleapis.com/auth/youtubeManage your YouTube account
https://www.googleapis.com/auth/youtube.force-sslSee, edit, and permanently delete your YouTube videos, ratings, comments and captions
https://www.googleapis.com/auth/youtube.readonlyView your YouTube account
https://www.googleapis.com/auth/youtube.uploadManage your YouTube videos
https://www.googleapis.com/auth/youtubepartnerView and manage your assets and associated content on YouTube
https://www.googleapis.com/auth/youtubepartner-channel-auditView private information of your YouTube channel relevant during the audit process with a YouTube partner

OAuth 2.0 API 스포프 문서는 구글 API에 접근할때 사용될 범위의 전체리스트가 포함되어 있다.

언어 지정 요구사항

이 문서내의 코드샘플을 실행하려면 구글 계정, 인터넷 접근, 그리고 웹 브라우져가 필요하다. 만약 API클라이언트 라이브러리를 사용한다면 언어 특정 요구사항을 살펴본다.

PHPPYTHONRUBYHTTP/REST
To run the PHP code samples in this document, you'll need:

PHP 5.4 or greater with the command-line interface (CLI) and JSON extension installed.
The Composer dependency management tool.
The Google APIs Client Library for PHP:

php composer.phar require google/apiclient:^2.0

OAuth 2.0 접근 토큰 얻기

다음 단계는 어떻게 어플리케이션이 구글 OAuth 2.0 서버와 상호작용하여 사용자의 허락을 얻어 사용자가 원하는 API요청을 수행하는지 보여준다. 어플리케이션은 이런 허락을 가져야 사용자 인증이 요구되는 구글 API요청을 실행할 수 있다.

아래 리스트는 이런 단계를 간단히 갈무리한다.

1. 어플리케이션은 필요한 퍼미션을 확인한다.
2. 어플리케이션은 사용자가 요구되는 퍼미션의 리스트를 구글에 리다이렉트한다.
3. 사용자는 어플리케이션에 퍼미션을 허용할지 결정한다.
4. 어플리케이션은 사용자 결정을 확인한다.
5. 요구되는 퍼미션을 허용했다면 어플리케이션은 사용자 작용에 대한 API요청을 만들기 위해 필요한 토큰을 얻는다.

단계1: 인증 파라미터 설정하기

첫 단계는 인증 요청 생성이다. 이 요청은 어플리케이션 확인에 파라미터를 설정하고 어플리케이션을 허용하기 위해 묻게되는 퍼미션을 정의한다.
- 만약 OAuth 2.0 인증과 증명에 구글 칼라이언트 라이브러리를 사용한다면 이들 파라미터를 지정하는 객체를 생성하고 설정한다.
- 만약 구글 OAuth 엔드포인트를 직접 호출한다면 URL을 생성하고 해당 URL에 파라미터를 설정한다.

The tabs below define the supported authorization parameters for web server applications. The language-specific examples also show how to use a client library or authorization library to configure an object that sets those parameters.

PHP








덧글

댓글 입력 영역