Google Data API에서 OAuth 사용

Eric Bidelman, Google 데이터 API팀
2008년 9월

소개

개발자에게 반가운 소식입니다. Google은 웹 전반에 여러 개방형 표준이 적용되는 것을 확인하고 있으며, 아시다시피 Google은 항상 표준을 열성적으로 선호했으며 오픈소스 커뮤니티를 육성해 왔습니다.

최근 모든 Google 데이터 API는 데스크톱 및 웹 애플리케이션에서 사용자의 비공개 데이터에 액세스하는 방식을 표준화하기 위해 개방형 프로토콜인 OAuth를 채택했습니다. OAuth는 안전한 표준 방식으로 API 인증을 수행할 수 있는 방법을 제공합니다. 프로그래머로서 가능할 때마다 코드를 재사용하도록 교육받았습니다. OAuth를 사용하면 개발자가 작성하는 중복 코드의 양을 줄이고 다양한 제공업체에서 여러 서비스와 호환되는 도구를 더 쉽게 만들 수 있습니다.

대상

이 도움말에서는 사용자가 하나 이상의 Google Data API에 대해 잘 알고 있지만 OAuth와 관련된 개념을 이해하고 있지는 않다고 가정합니다. 처음 사용하는 경우 또는 OAuth에 대해 궁금한 경우 다음 내용을 살펴볼 필요가 없습니다. 이 도움말에서는 개념의 기본 내용을 설명합니다. 또한 Google의 OAuth 구현에 관해 자세히 알아보겠습니다.

이 문서는 AuthSub를 사용하는 데 익숙한 개발자를 위한 것으로, 특히 보안 강화로 등록된 모드에서도 유용합니다. 계속 진행하면서 두 프로토콜의 유사점차이를 중점적으로 살펴보겠습니다. AuthSub를 사용하는 애플리케이션이 있는 경우 이 정보를 사용하여 더 개방형 최신 프로토콜인 OAuth로 이전할 수 있습니다.


약간의 용어

OAuth를 이해하려면 OAuth의 용어를 알아야 합니다. OAuth 사양 및 Google의 웹 애플리케이션용 OAuth 인증 문서는 특정 정의에 크게 의존하므로 Google의 OAuth 구현과 관련하여 각 정의가 무엇을 의미하는지 명확히 설명하겠습니다.

  1. 'OAuth 댄스'

    전체 OAuth 인증/승인 절차를 설명하는 비공식 용어입니다.

  2. (OAuth) 요청 토큰

    애플리케이션에서 Google Data API 중 하나에 대한 액세스를 요청하고 있음을 Google에 알리는 초기 토큰입니다. OAuth 댄스의 두 번째 단계는 사용자가 자신의 데이터에 대한 액세스 권한을 수동으로 부여하는 것입니다. 이 단계가 성공하면 요청 토큰이 승인됩니다.

  3. (OAuth) 액세스 토큰

    댄스의 마지막 단계는 승인된 요청 토큰을 액세스 토큰으로 교환하는 것입니다. 애플리케이션에 이 토큰이 있으면 토큰이 취소되지 않는 한 OAuth 댄스를 다시 진행하지 않아도 됩니다.

    AuthSub와 유사:
    OAuth 액세스 토큰은 보안 AuthSub 세션 토큰과 동일합니다.

  4. (OAuth) 엔드포인트

    애플리케이션을 인증하고 액세스 토큰을 얻는 데 필요한 URI입니다. 총 세 단계(OAuth 절차의 단계당 하나씩)가 있습니다. Google의 OAuth 엔드포인트는 다음과 같습니다.

    요청 토큰을 가져옵니다.https://www.google.com/accounts/OAuthGetRequestToken
    요청 토큰을 승인합니다.https://www.google.com/accounts/OAuthAuthorizeToken
    액세스 토큰으로 업그레이드:https://www.google.com/accounts/OAuthGetAccessToken

    AuthSub과 유사:
    액세스 토큰에 대해 승인된 요청 토큰을 교환하는 것은 각각 https://www.google.com/accounts/AuthSubRequestTokenhttps://www.google.com/accounts/AuthSubSessionToken에서 일회용 AuthSub 토큰을 장기 세션 토큰으로 업그레이드하는 것과 유사합니다. 차이점은 AuthSub에는 초기 요청 토큰의 개념이 없다는 것입니다. 대신 사용자는 AuthSubRequestToken 승인 페이지에서 토큰 프로세스를 시작합니다.

  5. (OAuth) 서비스 제공업체

    Google 데이터 API의 경우 이 제공업체는 Google입니다. 일반적으로 서비스 제공업체는 OAuth 엔드포인트를 제공하는 웹사이트 또는 웹 서비스를 설명하는 데 사용됩니다. OAuth 서비스 제공업체의 또 다른 예는 MySpace입니다.

  6. (OAuth) 소비자

    사용자의 데이터 (애플리케이션)에 액세스할 수 있는 권한을 요청하는 프로그램입니다. OAuth 프로토콜은 다양한 유형의 클라이언트 (웹, 설치, 데스크톱, 모바일)를 지원한다는 점에서 유연합니다.

참고: OAuth 프로토콜은 데스크톱/설치된 애플리케이션 사용 사례를 지원하지만 Google은 웹 애플리케이션의 OAuth만 지원합니다.

시작하기

등록

Google Data API에서 OAuth를 사용하려면 몇 가지 설정이 필요합니다. 모든 OAuth 요청은 디지털 방식으로 서명되어야 하므로 먼저 도메인을 등록하고 공개 인증서를 Google에 업로드해야 합니다. 자세한 방법은 웹 기반 애플리케이션 등록등록 모드에서 사용할 키 및 인증서 생성을 참고하세요.

서명 요청

도메인이 등록되면 요청 서명을 시작할 수 있습니다. OAuth의 가장 어려운 개념 중 하나는 oauth_signature와 서명 기본 문자열 개념을 올바르게 구성하는 것입니다. 기본 문자열은 RSA_SHA1를 사용하여 비공개 키로 서명하는 데이터입니다. 결과는 oauth_signature에 설정한 값입니다.

요청 예

GET http://www.google.com/calendar/feeds/default/allcalendars/full?orderby=starttime에 있는 사용자의 Google Calendar 목록

기본 문자열 형식 base_string = http-method&base-http-request-url&normalized-string-of-oauth_parameters
예시 기본 문자열 GET&http%3A%2F%2Fwww.google.com%2Fcalendar%2Ffeeds%2Fdefault%2Fallcalendars%2Ffull&oauth_consumer_key%3Dexample.com%26oauth_nonce%3D4572616e48616d6d%26oauth_signature_method%3DRSA-SHA1%26oauth_timestamp%3D137131200%26oauth_token%3D1%252Fab3cd9j4ks73hf7g%26oauth_version%3D1.0%26orderby%3Dstarttime
HTTP 요청 예
GET http://www.google.com/calendar/feeds/default/allcalendars/full?orderby=starttime HTTP/1.1
Host:  http://www.google.com
Content-Type: application/atom+xml
Authorization: OAuth oauth_token="1%2Fab3cd9j4ks73hf7g", oauth_signature_method="RSA-SHA1", oauth_signature="wOJIO9AvZbTSMK%2FPY%3D...", oauth_consumer_key="example.com", oauth_timestamp="137131200", oauth_nonce="4572616e48616d6d", oauth_version="1.0"

참고: 이것은 표현만을 위한 것입니다. oauth_signature이(가) 훨씬 더 길어집니다.

기본 문자열 참고사항:

  • orderby=starttime 쿼리 매개변수는 사전식 바이트 값의 순서에 따라 나머지 oauth_* 매개변수와 함께 정렬됩니다.
  • 또한 이 문자열에는 '?' 문자가 포함되지 않습니다.
  • base-http-request-url 부분에는 URL로 인코딩된 기본 URL http%3A%2F%2Fwww.google.com%2Fcalendar%2Ffeeds%2Fdefault%2Fallcalendars%2Ffull만 포함됩니다.
  • oauth_token는 이중 URL로 인코딩됩니다.

Authorization 헤더 관련 참고사항:

  • oauth_* 매개변수의 순서는 Authorization 헤더에서 중요하지 않습니다.
  • 헤더에는 기본 문자열처럼 orderby=starttime가 포함되지 않습니다. 쿼리 매개변수는 요청 URL의 일부로 유지됩니다.

OAuth를 사용한 요청 서명에 대한 자세한 내용은 OAuth 요청 서명을 참조하세요.

AuthSub와의 차이점:
안전한 AuthSub를 사용하는 동일한 예는 다음과 같습니다.

기본 문자열 형식 base_string = http-method http-request-URL timestamp nonce
예시 기본 문자열
GET http%3A%2F%2Fwww.google.com%2Fcalendar%2Ffeeds%2Fdefault%2Fallcalendars%2Ffull%3Forderby%3Dstarttime 137131200 4572616e48616d6d
HTTP 요청 예
GET http://www.google.com/calendar/feeds/default/allcalendars/full?orderby=starttime HTTP/1.1
Host:  http://www.google.com
Content-Type: application/atom+xml
Authorization: AuthSub token="GD32CMCL25aZ-v____8B" data="GET http://www.google.com/calendar/feeds/default/allcalendars/full?orderby=starttime 137131200 4572616e48616d6d" sig="MCwCFrV93K4agg==..." sigalg="rsa-sha1"

AuthSub를 사용하여 요청 서명에 대한 자세한 내용은 AuthSub 요청 서명을 참조하세요.

OAuth 플레이그라운드 도구

목적

일부 사용자는 OAuth가 학습률이 높다고 제안했습니다. Google의 다른 인증 API와 비교할 때 동의하겠습니다. OAuth를 통해 앱을 확장하면 Google 이외의 서비스를 사용하도록 하는 것이 좋습니다. 여러 서비스 제공업체와 API에서 작동하는 단일 인증 코드를 작성하는 것은 괜찮다고 생각됩니다. 나중에 프로토콜을 알아봐 주셔서 감사하게 생각합니다.

OAuth 플레이그라운드는 개발자가 OAuth 문제를 해결할 수 있도록 돕기 위해 만든 도구입니다. 플레이그라운드를 사용하여 문제를 디버그하고 자체 구현을 확인하며 Google 데이터 API를 실험할 수 있습니다.

어떤 기능인가요?

  1. 요청 토큰을 가져오고, 토큰을 승인하고, 액세스 토큰으로 업그레이드하는 OAuth 인증 흐름을 보여줍니다.
  2. 각 요청에 올바른 서명 기본 문자열을 표시합니다.
  3. 각 요청에 올바른 Authorization 헤더를 표시합니다.
  4. oauth_token를 사용하여 인증된 Google 데이터 피드와 상호작용하는 방법을 보여줍니다. GET/POST/PUT/DELETE개의 데이터를 사용할 수 있습니다.
  5. 브라우저에서 직접 인증된 피드를 확인합니다.
  6. 자체 oauth_consumer_key(등록된 도메인) 및 비공개 키를 테스트할 수 있습니다.
  7. oauth_token에서 사용할 수 있는 Google 데이터 피드 서비스를 알아보세요.

데모 실행

1단계: 범위 선택

먼저 하나 이상의 범위를 선택하여 사용할 API를 결정합니다. 이 데모에서는 Blogger Google 주소록과 호환되는 토큰을 요청합니다.

AuthSub와 유사:
AuthSub에서 토큰에 액세스할 수 있는 데이터 범위를 제어하려면 scope 매개변수가 필요합니다. Google은 OAuth 사양에서 제안한 대로 이 매개변수를 구현했습니다.

2단계: OAuth 매개변수 및 설정 수정하기

지금은 'OAuth 매개변수 수정' 상자에서 어떠한 설정도 수정하지 마세요. 나중에 oauth_consumer_key을 등록된 도메인으로 변경하고 '자체 비공개 키 사용'을 클릭하여 비공개 키를 입력하여 자체 비공개 키로 테스트할 수 있습니다. TEST 비공개 키만 사용하세요.

참고: oauth_signature_methodoauth_consumer_key 필드만 여기에서 수정할 수 있습니다. oauth_timestamp, oauth_nonce, oauth_token가 자동으로 생성됩니다.

RSA-SHA1 외에도 oauth_signature_methodHMAC-SHA1를 사용할 수도 있습니다. 이 경우 플레이그라운드에는 자체 oauth_consumer_key 및 고객 비밀번호를 입력해야 하는 추가 상자가 표시됩니다. 이 값은 등록된 도메인의 https://www.google.com/accounts/ManageDomains 페이지에서 찾을 수 있습니다.

AuthSub와의 차이점:
보안 AuthSub에는 도메인 이름을 명시적으로 설정하는 매개변수가 없습니다. 도메인은 next URL 매개변수의 일부로 포함됩니다. OAuth에 oauth_consumer_key와 같은 매개변수가 있습니다. 등록된 도메인으로 설정합니다.

3~5단계: 액세스 토큰 획득

OAuth 액세스 토큰을 가져오는 3단계입니다. 첫 번째 단계는 요청 토큰을 가져오는 것입니다. 이렇게 하면 애플리케이션에서 OAuth 댄스를 시작한다는 것을 Google에 알릴 수 있습니다.

먼저 '토큰 가져오기' 상자에서 '토큰 요청' 버튼을 클릭합니다.

특정 필드는 데이터로 채워집니다.

  • '서명 기본 문자열'에는 oauth_signature 매개변수를 만드는 데 사용되는 올바른 기본 문자열 형식이 표시됩니다.
  • '승인 헤더'에는 요청에 해당하는 Authorization 헤더가 표시됩니다.
  • 요청에서 전송된 oauth_nonceoauth_timestamp 값으로 채워진 'OAuth 매개변수 수정' 상자입니다.
  • oauth_token 입력은 응답 본문에 반환된 해당 값으로 채워졌습니다. 플레이그라운드에는 현재 이용 중인 oauth_token 유형도 표시됩니다. 현재는 요청 토큰입니다.

그런 다음 '토큰 가져오기' 상자에서 '승인' 버튼을 클릭합니다.

이 승인 페이지에서 '액세스 권한 부여' 버튼을 클릭하여 요청 토큰을 승인하고 OAuth 플레이그라운드로 다시 리디렉션됩니다.

AuthSub와 유사:
이 승인 페이지는 AuthSub와 동일합니다.

AuthSub와의 차이점:
AuthSub의 next URL 매개변수는 oauth_callback 매개변수와 유사합니다. 차이점은 OAuth에서 oauth_callback가 선택사항이라는 점입니다. 사용자가 '액세스 권한 부여' 버튼을 클릭하면 요청 토큰이 승인되고 토큰이 https://www.google.com/accounts/OAuthGetAccessToken로 업그레이드되는 비동기 작업이 가능합니다.

도움말: 웹 애플리케이션을 작성하는 경우 더 나은 사용자 환경을 제공하기 때문에 oauth_callback URL을 지정하는 것이 좋습니다.

마지막으로 '토큰 가져오기' 상자에서 '액세스 토큰' 버튼을 클릭합니다.

이 작업을 수행하면 승인된 요청 토큰 (빨간색 '액세스 토큰'으로 표시됨) 라벨이 업그레이드됩니다.

새 토큰을 가져오려면 '다시 시작'을 클릭하여 OAuth 댄스를 다시 시작합니다.

이제 재미있는 작업을 할 수 있습니다.

액세스 토큰 사용

이제 피드를 쿼리하고 데이터를 삽입, 업데이트 또는 삭제할 준비가 되었습니다. 실제 데이터를 사용할 때는 마지막 세 가지 HTTP 메서드를 수행할 때 주의해야 합니다.

도움말: 액세스 토큰에 사용할 수 있는 피드를 찾으려면 '사용 가능한 피드' 버튼을 클릭합니다.

다음은 쿼리 예입니다. GET http://www.blogger.com/feeds/1982051675575479214/posts/default?max-results=3

이 예시는 특정 블로그의 게시물을 3개까지만 반환합니다. 구문 강조표시된 영역 아래의 '브라우저에서 보기' 링크를 클릭하여 브라우저에서 직접 반환된 피드/항목을 볼 수도 있습니다.

예: 게시물 업데이트 방법

  1. 업데이트하려는 게시물에서 rel="edit"가 있는 <link> 요소를 찾습니다. 예를 들면 다음과 같습니다.
    <link rel="edit" href="http://www.blogger.com/feeds/1982051675575479214/posts/default/8138973184593279875"/>

    'Google 데이터 피드 입력' 입력에 href URL을 붙여넣습니다.

  2. 구문 강조표시된 패널 상단에서 '일반 보기'를 클릭하여 기존 항목의 XML을 복사합니다. 응답 본문을 복사하되 헤더는 복사하지 마세요.
  3. HTTP 메서드 드롭다운을 PUT로 변경합니다.
  4. 드롭다운 아래의 '게시물 데이터 입력'을 클릭하고 팝업에 <entry> XML을 붙여넣습니다.
  5. '실행' 버튼을 클릭합니다.

서버가 200 OK로 응답합니다.

도움말: edit 링크를 수동으로 복사하는 대신 '구문 강조표시' 체크박스를 선택 해제하세요. 쿼리 후 XML 응답 본문 내의 링크를 클릭할 수 있습니다.

마무리

AtomPub/Atom 게시 프로토콜(Google Data API의 기본 프로토콜) 및 OAuth와 같은 기술은 웹을 발전시키는 데 도움이 됩니다. 점점 더 많은 사이트에서 이러한 표준을 채택하고 있기 때문에 Google의 승자가 승자가 될 것입니다. 킬러 앱을 만들기가 갑자기 어렵게 느껴집니다.

OAuth Playground에 관한 질문이나 의견이 있거나 OAuth를 Google API와 함께 사용하는 경우 G Suite API 및 Marketplace API 지원 포럼을 통해 문의하시기 바랍니다.

자료