ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 유튜브(Youtube) API - 5.인증받고 사용하기
    소프트웨어개발 이야기 2020. 2. 10. 11:16

    인증이 필요한 API 사용하기

     

    앞서 유튜브 API를 어떤 방식으로 사용하고 어떤 형식의 데이터를 얻을 수 있는지 살펴봤다. API Key 방식으로 인증을 하고 구글이 제공하는 라이브러리를 통해 몇 줄 안 되는 코드로 동영상의 정보를 얻을 수 있었다.

     

    하지만 API를 통해서 동영상을 업로드하거나 특정 채널의 통계 정보를 얻고 싶을 때는 그 채널의 권한을 부여받아야만 한다. 즉, 개인 인증이 필요한 기능을 위해서는 기존의 API Key 방식이 아닌 다른 접근이 필요하다.

     

    본 글에서는 이러한 개인 인증을 활용한 OAuth2.0 방식의 유튜브 API 사용법을 살펴보도록 하자.

     

     


     

     

    동영상 목록을 조회하는 Videos:list API의 매개변수 중에는 myRating이 있다. 사용자가 "좋아요" 또는 "싫어요"를 표시한 동영상 목록만 가져올 수 있는 필터로 "dislike"또는 "like"가 허용 값이다.

     

    API 문서를 보면 "인증된 요청"에서만 사용할 수 있다고 명시되어있다. 여기서 말하는 "인증된 요청"이 바로 OAuth2 방식의 인증을 의미한다.

     

    API Key 방식을 사용하여 "좋아요"를 표시한 동영상 목록을 조회하면 아래와 같은 결과 메시지가 반환된다.

     

    반면, OAuth2 방식에서는 아래와 같이 정상적으로 결괏값을 반환한다.

     

     

    그렇다면, OAuth2  방식의 인증은 어떻게 구현해야 할까?!

     

     


     

     

    친절하게도 구글에서는 OAuth2 를 위한 라이브러리를 제공한다. 우리는 이를 사용해서 인증을 받고 이때 반환하는 특별한 토큰을 사용해서 유튜브의 API를 호출하면 된다.

     

    말은 엄청 간단해 보이지만 사실 OAuth를 이해하려면 생각보다 많은 것들을 알아야 한다.(버전부터가 벌써 2.0이다. 1.0의 부족한 부분을 채우기 위해 2.0이 나온 게 뻔하지 않을까 -_ -;;;)

    아쉽지만 OAuth 2.0에 대한 이론은 본 글에서 논할 내용은 아니기에 아래의 이미지와 링크로 설명을 대신한다.(생활코딩에서 정말 친절하고 자세히 설명하고 있으니 한 번쯤 꼭 보고 넘어가자.)

    생활코딩 OAuth 2.0 소개 이미지( https://opentutorials.org/course/2473/16571)

     

    우리의 목적은 결국 유튜브 API를 사용하는 것이니 OAuth2 개념을 몰라도 좌절할 필요는 없다. 우리에게는 친절한 구글씨가 제공하는 라이브러리가 있으니~ -_ - b

     

    사실, 이전 글에서 유튜브 API를 사용하기 위해 불러왔던 라이브러리에는 OAuth2 내용이 포함되어 있었다. 단지, 유튜브 API의 가장 간단한 활용법을 보여주기 위해 사용하지 않았을 뿐이다. 이제 OAuth2를 통한 인증 코드를 작성해 보자.(다시 한번 강조하지만, 우리가 결국 알고자 하는 건 유튜브 API 다. 지금부터 지루한 코드 설명이 이어질 텐데... 너무 힘들어 하진 말자. OAuth2 인증 코드는 한번 만들어 놓고 재사용하면 되기 때문에 이번에 한번 고생(?)하면 다음부터는 OAuth2 인증이 필요한 어떤 API에서도 쉽게 호출해서 사용할 수 있다.)

     

     

    구글에서 설명한 시퀀스 다이어그램을 참고해서 아래의 순서대로 따라가 보자.

    웹 서버에서 OAuth 인증 시퀀스 다이어그램( https://developers.google.com/identity/protocols/OAuth2)

     

    1. OAuth2 키가 필요하다

    구글에서 인증을 받기 위해서는 당연히 구글에 사전에 설정한 정보가 필요하다. 유튜브 API - 사전작업에서 OAuth2를 위해서 설정한 키파일을 다운받자. 받은 json 파일 안에는 클라이언트 아이디, 클라이언트 시크릿, 리다이렉트 URI 값 등이 들어있다. 우리는 이 값이 필요하다.

    GCP Console - 사용자 인증 정보

     

    2. 인증받고 싶은 권한의 범위도 필요하다

    구글의 API 사용을 위해 인증을 받을 건데, 도대체 구글이 제공하는 수많은 서비스 중에 어떤 서비스를 사용하고 싶은 건지 구글이 알 필요가 있다. 때문에 인증을 받기 위해서는 이런 정보가 필요하며 이를 스코프(scope)라고 부른다. 가령 지금 우리가 사용하는 유튜브의 Video.list API 스코프는 아래와 같다.

    유튜브 API 참조 문서 - Video list 

    보다 다양한 서비스의 스코프는 각 서비스별 API 문서에서 확인할 수 있다. (구글의 API Explorer에 가면 구글이 제공하는 API 가이드를 보다 쉽게 찾을 수 있다.)

     

    3. 인증을 받기 위한 URL을 얻는다

    OAuth2의 가장 대표적인 기능이 "~로 로그인 하기"이다. 소셜을 이용한 로그인을 한 번이라도 이용해본 독자라면 이와 같은 웹페이지를 한 번쯤은 만나봤을게다.

     

    서비스에서 필요한 스코프에 대해서 사용자에게 권한을 요청하는 페이지다. 위 이미지에서는 "내 이름, 이메일 주소, 언어 환경설정, 프로필 사진"에 대한 공유를 요청하고 있다. 우리도 유튜브를 사용하기 위해 위에서 설명한 1번과 2번의 정보를 통해 인증 페이지 URL을 얻어야 한다. 

    인증 페이지 URL

     

    구글에서 제공한 라이브러리의 OAuth2 객체 생성을 위해 1번의 OAuth2 키값들(클라이언트 아이디, 클라이언트 시크릿, 리다이렉트 URI)을 인자로 넘겨준다. 이렇게 생성된 객체의 generateAuthURL() 메소드를 통해서 인증 페이지의 URL을 얻을 수 있다. 이때 인자로 2번의 스코프를 넘겨준다.

     

    4. 인증 코드(Authorization Code)를 얻는다

    OAuth2의 generateAuthUrl() 메소드가 반환한 URL을 브라우저 주소창에 붙여 넣기 하면 "~로 로그인 하기"와 비슷한 인증 페이지가 나타난다. 

     

    "허용" 버튼을 누르면 OAuth2를 요청하는 서비스에게 개인의 권한을 부여하게 된다.(앞으로 이런 창 뜨면 귀찮아서 무조건 허용 버튼 누르면 습관을 버리자;; 해킹당하면 답 없다 -_ -; ) 

     


    아래와 같은 화면이 나와서 당황하는 독자도 있을 텐데, 이는 GCP에서 신청한 OAuth2 동의 화면에 대한 구글의 검증이 끝나지 않았거나 내용이 부족하기 때문이다. 구글의 확인이 끝나면 아래와 같은 화면은 나타나지 않는다. 개발 시점에서는 크게 문제 되지 않으므로 너무 걱정하지 말자. "확인되지 않은 앱" 페이지에서 고급 버튼을 눌러서 "(안전하지 않음 페이지)" 링크를 통해 이동하면 된다. 관련된 내용은 구글 고객센터의 글을 참고한다. 

    확인되지 않은 앱 - 고급 > 안전하지 않은 페이지로 이동


     

    허용 버튼을 누르면 페이지가 이동되면서 에러 페이지가 나온다. 다.. 당황하지 말자. 낯설면서도 익숙한 에러 페이지가 보이는 게 정상이다. -0-;

    위 1번에서 OAuth2 객체를 생성할 때 넘긴 인자 중에 "리다이렉트 URI"가 있다. 인증 페이지에서 허용 버튼을 클릭하여 인증을 받게 되면, 구글은" 리다이렉트 URI"를 호출하면서 파라미터로 인증코드를 넘겨준다.

    이제 에러가 발생하지 않게 인증코드를 처리해야 한다.

     

    5. 인증 코드를  처리한다

    리다이렉트 URI는 GCP에서 OAuth2 인증키를 만들면서 개인이 입력한 값이다. 사용자의 권한을 위임받은 이후 처리 로직은 서비스에서 구현을 해야 하기 때문에 구글에서는 리다이렉트 URI에 인자 값으로 인증 코드값을 넘겨준다. 때문에 이를 처리하기 위한 서버가 필요하다.

    뒤에서 다시 설명하겠지만, 유튜브 API 호출을 위해 매번 사용자 인증을 받는 게 아니라 초기에 한 번만 인증을 받은 뒤 재사용하는 구조다. 때문에 간단한 임시 서버를 통해 인증코드가 포함된 리다이렉트 URI를 받고 이를 처리한다.

    인증 코드 처리 코드

    open 라이브러리를 통해서 인증 주소를 기본 브라우저를 통해 호출한다. 사용자가 허용 버튼을 눌러 권한을 승인할 때 호출되는 리다이렉트 URI를 처리한다. 여기서는 인증 코드를 가져오는 정도의 간단한 일만 수행하고 있다. 이제 이 인증 코드를 활용해서 끝판왕인 엑세스 토큰을 가져올 일만 남았다. 휴~

     

    6. 엑세스 토큰(Access Token)을 얻는다

    유튜브 API를 호출할 때 필요한 건 결국 엑세스 토큰(Access Token) 이다. 위에서 얻은 인증 코드를 통해서 이 엑세스 토큰을 얻을 수 있다.

    엑세스 토큰 얻기

    인증 코드를 통해 엑세스 토큰을 얻는다. 이를 OAuth2 객체의 credentials 속성에 저장하면 API 호출 시 활용이 가능하다.

    드디어 엑세스 토큰을 얻었다. -_ -+ 이제 이 마법 지팡이를 들고 API를 호출하러 갈 일만 남았다! 

     

    7. API를 호출하자

    서두에 예시로 들었던 "좋아요" 동영상 목록을 가져와 보자. 우리에겐 엑세스 토큰이 있다. *_*

    유튜브  API 엑세스 토큰 설정

    videos.list() 메소드의 인자인 "auth"에 위에서 액세스 토큰을 저장한 OAuth2 객체를 설정한다.(auth 속성에는 API Key값을 설정할 수도 있다.) OAuth2 방식만 사용 가능한 myRating 속성에 "like"값을 설정한 뒤 실행해 보자.

    아아... 잘 나온다 ㅠㅠ

    다 끝난 거 같은데 뭔가 찜찜하다. 이렇게 한번 받아서 API Key처럼 계속 쓰면 되는 건가?! 

    안타깝게도 아니다 -0 -;;

     


    위에서는 videos.list() 메소드의 인자로 엑세스 토큰을 사용했지만, 동일한 엑세스 토큰으로 호출하는 API가 다양할 경우 google 객체의 전역 옵션을 사용해서 설정할 수도 있다. 

    전역 엑세스 토큰 설정


     

    8. 엑세스 토큰을 갱신하자

    위 6번에서 받은 엑세스 토큰을 출력해 보면 엑세스 토큰 값만 있는 게 아니라 여러 가지 값들이 들어있다.

    엑세스 토큰 값

    눈에 똭! 들어오는 Expiry Date! 사용자가 허락해서 사용하는 건데 무제한해줄 리 만무하지 않은가 ㅎㅎㅎ 역시나 만료 기간이 있다. (그래 그런 거지... 이렇게 쉽게 끝날 리가... -,. -)

    엑세스 토큰은 보통 60분 정도면 만료가 된다. 만료가 된 액세스 토큰은 사용할 수 없기 때문에 다시 인증을 받거나 리프레시 토큰(Refresh Token)을 사용해서 갱신을 해야 한다. 

    인증을 다시 하려면 사용자에게 웹페이지를 보여주고 허용을 받은 다음, 리다이렉트 URI를 처리하는 일련의 과정이 필요하다. 이걸 한 시간마다 사용자에게 요청하는 게 가당하기나 한말이겠는가... 

    리프레시 토큰을 통해서 갱신된 엑세스 토큰을 얻어야만 한다.

    리프레시 토큰을 통한 엑세스 토큰 갱신

     

    리프레시 토큰은 액세스 토큰을 얻는 최초에만 반환되며, 갱신 시에는 반환되지 않는다.(위 3번에서 인증 URL을 받을 때 access_type을 'offline'으로 설정해야 반환된다.)  때문에 처음 엑세스 토큰을 받을 때 특정 장소(DB, 파일 등)에 저장해서 사용하는 걸 추천한다. 

    갱신된 엑세스 토큰을 통해 위 7번처럼 API를 호출하면 정상적으로 결과가 나오는 것을 확인할 수 있다.

     


     

    이번 글에서는 사용자의 인증이 필요한 유튜브의 API를 사용하기 위해서 기존의 API Key 방식이 아닌 OAuth2 방식을 알아봤다. GCP에서 설정한 OAuth2 인증정보와 구글의 라이브러리를 사용해서 쉽게(?) 유튜브 API 결과를 받을 수 있었다.

    인증정보를 통해 인증 URL을 얻어오고 해당 페이지에서 사용자가 허용한 뒤 리다이렉트 되는 인증코드를 통해서 엑세스 토큰을 얻을 수 있었다. 이를 사용해서 API를 호출하고 특정 시간이 지나 엑세스 토큰이 만료된 경우, 초기 엑세스 토큰 조회 시 포함된 리프레시 토큰을 사용해서 엑세스 토큰을 갱신할 수 있었다.

     

    이제 유튜브의 모든 API를 사용할 수 있게 됐다.( 음화화화-! 마음껏 사용해주마! - _ -+)

    다음 글에서는 유튜브 API를 기능별로 살펴보고 직접 실행해서 어떤 결과가 나오는지 살펴보도록 하겠다.

     

     

    댓글 5

    • Roy3 2020.03.15 16:55 신고

      좋은 글 감사합니다. 읽어보다가 궁금증이 생겨서.. OAuth 키는 어디서 만드나요? OAuth 동의 화면을 통해서 만들면 되는 건가요? 이거.. 승인이 안 나면, 테스트도 못 해보는 거네요.

    • cc 2021.11.03 18:19

      계속 확인되지 않는 앱이라고 뜨는데 어떻게 해야 검증이 될까요?

    • g 2021.11.09 22:46

      reference error http 떠서 var http = require("http"); 추가했는데 ,ReferenceError: opn is not defined 이게 계속 떠서 안넘어가네요 ㅠㅠ 제발 도와주세요...

Designed by Joypinkgom.