Google API 는 Google Workspace 의 서비스들을 Program Library 나 REST 로 접근하여 제어할 수 있는 API 이다.
Google Workspace 에서 제공하는 서비스 목록은 다음과 같다.
Google Workspace  |  Google for Developers

 

Google Workspace  |  Google for Developers

Google Workspace 앱을 개선하고 연결.

developers.google.com

그중 Google Drive 를 접속하기 위해 java 와 javascript 라이브러리들을 조사했다.

Google API Client Libraries 목록은 다음과 같다.
API Client Libraries  |  Google for Developers

 

API Client Libraries  |  Google for Developers

클라이언트 라이브러리에 액세스하여 Google 제품용 API에 대한 코딩을 쉽게 할 수 있습니다. 자바, Python, PHP, .NET 등에 대한 지원을 포함합니다.

developers.google.com

위 링크의 문서에서 JavaScript 버전이 있는데 안에 들어가보면 조금(?)의 설명과 함께 몇가지 사용 예제는 있지만 내가 원하는 API Document 는 없다.
GitHub - google/google-api-javascript-client: Google APIs Client Library for browser JavaScript, aka gapi.

 

GitHub - google/google-api-javascript-client: Google APIs Client Library for browser JavaScript, aka gapi.

Google APIs Client Library for browser JavaScript, aka gapi. - google/google-api-javascript-client

github.com

어차피 javascript library 를 사용하려면 "https://apis.google.com/js/api.js" 파일만 import 하면 되는데
원본 소스에 대한 별도의 배포 사이트도 없고 API Document 마저 없어서 사용하기가 참 난해하다.
열심히 찾아봤지만 없었다.

javascript 버전의 Google Drive API Library 사용 예제는 다음의 공식 문서에 나와 있다.
JavaScript quickstart  |  Google Drive  |  Google for Developers

 

자바스크립트 빠른 시작  |  Google Drive  |  Google for Developers

Google Drive API에 요청을 전송하는 JavaScript 웹 애플리케이션을 만드는 방법을 알아봅니다.

developers.google.com

위 예제와 함께 stackoverflow 에서 찾은 샘플을 조합해서 file upload 까지는 성공했는데...
정확한 사용법을 몰라서 수소문을 해봤다.

먼저 stackoverflow 에서의 검색이다.
https://stackoverflow.com/search?tab=newest&q=gapi.client.drive.files.create&searchOn=3

 

Human verification

Stack Overflow | The World’s Largest Online Community for Developers

stackoverflow.com

열심히 찾다보면 나름의 정립을 통해 분명 API 사용법도 익숙해질거다.
하지만 그만큼 시간과 노력이 필요하고 언제 다시 사용할지 모를 지식만 쌓아놓고 시간만 허비할수도 있는데
그로 인해 의욕도 상실하고 비즈니스의 중요한 타이밍(?)도 놓치게 될 수 있다.

그래서 빠른 해결을 위해 AI에게 물어보았다.
"gapi.client.drive 의 api document 주소를 알려줘" 라고 물어보니 세가지 Chat AI (Gemini, Copilot, Clova X)모두 Google 공식 문서를 보라고 알려주었다.
REST Resource: about  |  Google Drive  |  Google for Developers

 

REST Resource: about  |  Google Drive  |  Google for Developers

이 페이지는 Cloud Translation API를 통해 번역되었습니다. 의견 보내기 REST Resource: about 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 리소스: About 사용자, 사용

developers.google.com

javascript library 내에서 당연하게도 google rest api 를 이용하고 있어서라고 생각하는데
문제는 REST API 의 스펙을 안다고해도 javascript library 내의 class 와 function 들의 API 는 또 다르기 때문에 API Document 가 필요한건데... 그 문서를 찾을수가 없었다.
게다가 function 에 넘겨주는 파라미터들이 json 객체들이라서 어떤 구성의 param 목록이 지원되고 어떻게 설정해야 하는지에 대한 내용을 현재까지도 찾지 못하고 있다.

결국은 AI 들에게 질문을 바꿔서 나름 의미있는 답을 얻게 되었는데
function 의 실사용 예를 들어 구체적인 사용 방법을 물어보며 AI 들의 성능을 비교해 보았다.

[Prompt]
gapi.client.drive.files.create 함수의 resource 인자값 metadata 에는 어떤 설정값이 있어?

그에 대한 코파러(Copilot)의 답변

더보기

[Copilot]

`gapi.client.drive.files.create` 함수의 `resource` 인자는 파일에 대한 메타데이터를 설정하는 데 사용됩니다¹². 
이 메타데이터에는 다음과 같은 설정값이 포함될 수 있습니다:

- `name`: 생성할 파일의 이름¹².
- `mimeType`: 파일의 MIME 타입¹².
- `parents`: 파일이 위치할 폴더의 ID를 포함하는 배열. 예를 들어, `'parents': ['appDataFolder']`는 파일을 앱 데이터 폴더에 생성하도록 지정합니다².

이러한 설정값 외에도 Google Drive API는 파일 메타데이터에 대한 추가적인 설정값을 제공합니다¹². 
이러한 설정값은 파일의 속성을 더욱 세밀하게 제어할 수 있게 해줍니다¹². 
그러나 항상 Google Drive API의 공식 문서를 참조하여 해당 설정값이 올바르게 지원되는지 확인하는 것이 좋습니다¹².

출처: Bing과의 대화, 2024. 3. 29.
(1) Create File with Google Drive Api v3 (javascript) - Stack Overflow. https://stackoverflow.com/questions/34905363/create-file-with-google-drive-api-v3-javascript.
(2) gapi.client.drive.files.create does not work - Stack Overflow. https://stackoverflow.com/questions/65945670/gapi-client-drive-files-create-does-not-work.
(3) google drive javascript api gapi.client.drive.files undefined. https://stackoverflow.com/questions/14262884/google-drive-javascript-api-gapi-client-drive-files-undefined.
(4) Getting Started | google-api-javascript-client. https://google.github.io/google-api-javascript-client/docs/start.html.
(5) undefined. https://www.googleapis.com/discovery/v1/apis/drive/v3/rest.
(6) undefined. https://www.googleapis.com/auth/drive.appdata.
(7) undefined. https://people.googleapis.com/.

그리고 클로바래(ClovaX) 의 답변

더보기

[Clova X]

gapi.client.drive.files.create 함수의 resource 인자값인 metadata에는 다음과 같은 설정값이 있습니다.

- **name**: 파일의 이름을 설정합니다. (필수)
- **mimeType**: 파일의 MIME 타입을 설정합니다. (필수)
- **parents**: 파일이 저장될 부모 폴더의 ID를 배열로 설정합니다.
- **description**: 파일의 설명을 설정합니다.
- **starred**: 파일을 즐겨찾기에 추가할지 여부를 부울 값으로 설정합니다.
- **trashed**: 파일을 휴지통에 넣을지 여부를 부울 값으로 설정합니다.
- **explicitlyTrashed**: 파일을 명시적으로 휴지통에 넣을지 여부를 부울 값으로 설정합니다.
- **properties**: 파일의 속성을 객체로 설정합니다. 속성의 이름과 값을 key-value 쌍으로 설정합니다.

metadata에 설정할 수 있는 값은 Google Drive API에서 지원하는 파일의 속성에 따라 다릅니다.

더 궁금하신 점이 있으시면 말씀해주세요.

마지막으로 잼민이(Gemini)의 답변

더보기

[Gemini]

Google Drive API 문서에 따르면, gapi.client.drive.files.create 함수의 resource 인자값 metadata에는 다음과 같은 설정값이 있습니다.

* **description** (optional) - 파일의 설명입니다.
* **mimeType** (optional) - 파일의 미디어 유형입니다.
* **parents** (optional) - 파일을 저장할 폴더의 ID 목록입니다.
* **properties** (optional) - 파일에 대한 사용자 지정 속성입니다.
* **thumbnail** (optional) - 파일의 썸네일입니다.

다음은 각 설정값에 대한 자세한 설명입니다.

* **description** (optional) - 파일의 설명은 최대 255자까지 입력할 수 있습니다. 이 설명은 파일을 검색할 때 사용됩니다.
* **mimeType** (optional) - 파일의 미디어 유형은 파일의 종류를 나타냅니다. 예를 들어, 이미지의 미디어 유형은 "image/jpeg"입니다.
* **parents** (optional) - 파일을 저장할 폴더의 ID 목록입니다. 여러 개의 폴더에 파일을 저장하려면 이 설정값을 사용합니다.
* **properties** (optional) - 파일에 대한 사용자 지정 속성을 설정하려면 이 설정값을 사용합니다. 속성의 이름과 값은 모두 문자열입니다.
* **thumbnail** (optional) - 파일의 썸네일은 최대 256KB 크기의 이미지 파일입니다. 썸네일은 파일을 검색할 때 사용됩니다.

이러한 설정값은 모두 선택 사항입니다. 설정하지 않으면 기본값이 사용됩니다.

특이한 점은 잼민이(Gemini) 의 경우 Prompt 에 코드를 구체적으로 입력하니 Google Workspace 에서 문서를 검색하여 답변을 생성하겠다고 나한테 확인창을 띄워주었다.

그렇다는건 지금까지 잼민이(Gemini) 는 내가 하는 질문에 대한 답변을 작성할때 자기네들 서비스의 문서조차 검토도 안했다는 의미로 보였다. (그래서 그렇게 엉망이었나보다)

하지만 그렇게 자기네 서비스의 문서들까지 검토했음에도 불구하고 결과적으로 내가 선택한 답변은 Copilot 의 내용이었다.

우리의 잼민이(Gemini)는 아직까지는 많이 미숙한 아이인가보다.

 

 

 

이 포스팅의 부제는 "여전히 Copilot 만한게 읍네" 이다.

애초에 Google 의 API를 이용하는 것이니 당연히 잼민이(Gemini)를 이용해야 한다고 생각했었다.

그래서 하루죙일 잼민이한테 "샘플좀 구해줘~", "제발 좀 오류 없는 샘플좀 구해줘~" 라고 애걸 복걸 했는데...

prompt 던진 횟수만해도 30여번은 넘은 듯 하다.

그리고 그 횟수만큼 코딩 오류와 실행 실패 그리고 의존 라이브러리 점검을 해야만 했다.

참으로 절망과 고통의 시간이었다...

 

이전에 이미 js 와 servlet 으로 Google Identity Flow 를 진행하여 Access Token 까지 획득해 놓은 상태이다.

그래서 Google Drive API 를 이용할땐 OAuth 절차가 필요없었다.

로그인 이후 Google Drive API 에서 불필요하게 사용자 인증 요청창이 다시 출력되지 않도록 OAuth 절차를 생략하고 Access Token 을 이용해서 GoogleCredentials 객체를 생성하기만 하면 되었었다.

그래서 잼민이에게 "Access Token 을 이용해서 GoogleCredentials 객체 생성 예제 알려줘~" 라고 가볍게 질문을 던진게 화근이 되었다.

 

잼민이는 무려 7년~8년전의 샘플 예제까지 검토해주는 기염을 토했는데 그 결과  샘플 코드들에서 deprecated 와 undefined 에러들을 수없이 봐야만 했다.

그때마다 implement 한 library 들의 버전을 반복해서 체크했는데... 

구글 서비스 가이드 문서들도 샅샅이 뒤져가면서 구글의 문서들을 검토하느라 약 2일간 24시간을 컴퓨터 앞에서 인상쓰고 있었다.

그렇게 도저히 해법을 찾지 못했던 와중에 느닷없이

나와 동거중인 애 둘딸린 여왕님이 "prompt 를 제대로 안했나보네~" 라고 핀잔을 주면서 "prompt 좀 제대로 만들어서 던져바" 라고 조언 아닌 조언을 준것이 정말 귀한 한마디였다... 흑흑

심기일전하여 작성한 프롬프트의 내용은 다음과 같다.

[Prompt]
Google Drive 서비스 API를 이용하기 위해 Access Token으로 Credential을 생성하는 코드 예제를 알려주는데 
다음의 조건에 맞게 찾아줘
    - java 버전
    - 2020년 이후에 작성
    - 사용하는 패키지, 클래스, 메서드들 중에 deprecated 는 없어야 함
    - 사용된 패키지 라이브러리들의 버전들도 함께 출력

그에 대한 잼민이(Gemini) 의 답변은 다음과 같았다.

더보기

## Google Drive 서비스 API를 이용하기 위해 Access Token으로 Credential을 생성하는 Java 코드 예제 (2020년 이후, deprecated 없음)

다음은 Java 11+ 버전에서 Google Drive 서비스 API를 이용하기 위해 Access Token으로 Credential을 생성하는 코드 예제입니다. 2020년 이후에 작성되었으며, 사용하는 패키지, 클래스, 메서드들 중에 deprecated는 없습니다. 또한, 사용된 패키지 라이브러리들의 버전도 함께 출력합니다.

**코드 예제:**

```java
import com.google.auth.oauth2.GoogleCredentials;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.drive.Drive;

public class DriveService {

    public static void main(String[] args) throws Exception {
        // Access Token을 입력하세요.
        String accessToken = "ACCESS_TOKEN";

        // Google Drive 서비스를 위한 Credential 객체를 생성합니다.
        GoogleCredentials credentials = GoogleCredentials.create(
            GoogleCredentials.getApplicationDefault()
                .createScoped(DriveScopes.DRIVE)
                .setAccessToken(accessToken)
        );

        // Google Drive 서비스를 사용할 수 있는 Drive 객체를 생성합니다.
        Drive drive = new Drive.Builder(
            GoogleNetHttpTransport.newTrustedTransport(),
            JacksonFactory.getDefaultInstance(),
            credentials
        ).setApplicationName("Drive Service").build();

        // Google Drive API를 사용하는 코드를 작성합니다.
        // ...
    }
}

```

**사용된 패키지 라이브러리들의 버전:**

* com.google.auth.oauth2:google-auth-library-oauth2:1.21.0
* com.google.api.client:google-api-client:1.35.0
* com.google.api.client:google-api-client-jackson2:1.35.0
* com.google.api.client:google-api-client-googleapis:1.35.0
* com.google.apis:google-api-services-drive:v3-rev2023-02-16

**참고:**

* `GoogleCredentials.getApplicationDefault()` 메서드는 현재 사용자의 환경에서 Google Cloud Platform SDK를 사용하여 설정된 기본 자격 증명을 가져옵니다. 
* `DriveScopes.DRIVE` 상수는 Google Drive 서비스에 대한 모든 범위를 제공합니다.
* `GoogleNetHttpTransport.newTrustedTransport()` 메서드는 HTTPS를 사용하여 Google API 서버와 통신하는 데 사용할 수 있는 신뢰할 수 있는 HTTP 전송 객체를 생성합니다.
* `JacksonFactory.getDefaultInstance()` 메서드는 JSON 데이터를 처리하는 데 사용할 수 있는 기본 Jackson JSON 팩토리를 생성합니다.
* `setApplicationName()` 메서드는 Google API 요청에 사용될 애플리케이션 이름을 설정합니다.

**추가 정보:**

* Google Drive API: [유효하지 않은 URL 삭제됨]
* Google Cloud Platform SDK: [https://cloud.google.com/sdk/](https://cloud.google.com/sdk/)
* Google Auth Library for Java: [https://github.com/google/google-auth-library-java](https://github.com/google/google-auth-library-java)

**주의:**

* Access Token은 비밀 정보입니다. 안전하게 보관해야 합니다.
* 코드를 실행하기 전에 Google Cloud Platform SDK를 설치하고 환경 변수를 설정해야 합니다.

**2020년 이후 코드 예제를 찾는 이유:**

2020년 이전에 작성된 코드 예제는 더 이상 사용되지 않는 deprecated API 또는 패키지를 사용할 수 있습니다. 최신 코드 예제를 사용하여 최상의 호환성과 안정성을 확보하는 것이 좋습니다.

역시나 deprecated 오류를 발생시키는 구버전의 Class, Method 들이 있었다. (심지어 Library 의 버전도 부정확하다)

prompt 를 제대로 적용하지도 않았으면서 부연 설명까지 그럴듯하게 작성해서 나에게 사기를 친다. ㄷㄷㄷ

결국 잼민이를 뒤로하고 마지막으로 ChatGPT 의 후예인 Copilot 에게도 동일하게 prompt 를 던져보았다.

그리고 Copilot 의 답변은 다음과 같았다.

더보기

Google Drive 서비스 API를 이용하기 위해 Access Token으로 Credential을 생성하는 Java 코드 예제는 다음과 같습니다¹:

```java
import com.google.auth.oauth2.GoogleCredentials;
import com.google.auth.oauth2.AccessToken;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.services.drive.Drive;
import com.google.auth.http.HttpCredentialsAdapter;

public class GoogleDriveService {
    public Drive getDriveService(String accessToken) throws IOException, GeneralSecurityException {
        return new Drive.Builder(
            new NetHttpTransport(),
            GsonFactory.getDefaultInstance(),
            new HttpCredentialsAdapter(getCredentials(accessToken))
        )
        .setApplicationName("appname")
        .build();
    }

    public GoogleCredentials getCredentials(String accessToken) throws FileNotFoundException, IOException {
        return GoogleCredentials.newBuilder()
        .setAccessToken(new AccessToken(accessToken, null))
        .build();
    }
}
```

이 코드는 2022년에 작성되었으며, deprecated된 메서드나 클래스를 사용하지 않았습니다¹. 사용된 패키지 라이브러리들의 버전은 다음과 같습니다¹:

- `com.google.api-client:google-api-client`: 1.33.0
- `com.google.apis:google-api-services-drive`: v3-rev20211107-1.32.1
- `com.google.http-client:google-http-client-gson`: 1.19.0
- `com.google.auth:google-auth-library-oauth2-http`: 1.3.0

더 자세한 내용은 ¹를 참고해주세요.

출처: Bing과의 대화, 2024. 3. 28.
(1) access token으로 구글 자격증명 가져오기(feat. google drive api). https://velog.io/@sangeun-jo/access-token으로-구글-자격증명-가져오기feat.-google-drive-api.
(2) Java - Google Drive API 활용하기 : 네이버 블로그. https://m.blog.naver.com/chae1789/221920372316.
(3) Class Credential (1.34.1) | Java client library | Google Cloud. https://cloud.google.com/java/docs/reference/google-oauth-client/latest/com.google.api.client.auth.oauth2.Credential.
(4) Google Drive API 빠른 시작 샘플(java) 실행하기 :: 기운바다. https://kiunsea.tistory.com/22.
(5) undefined. https://console.developers.google.com/flows/enableapi?apiid=drive.
(6) undefined. https://developers.google.com/drive/api/v3/quickstart/java.
(7) undefined. https://github.com/googleapis/google-api-java-client-services/tree/master/clients/google-api-services-drive/v3.

 

지금은 Copilot 의 답변으로 샘플 실행에 성공했고 서비스에도 적용하였다.

그래서 난 행복하다.

이제 AI 없는 작업은 생각할 수가 없다.

 

Google Drive 를 접근하기 위한 API 를 사용하려면

우선 구글 계정으로 OAuth 를 통과하고 발급 받은 access token 을 이용하면 Drive API 를 이용 할 수 있는데

그러한 일련의 절차를 API Library (Google Drive API v3 라이브러리) 만으로 일괄 처리할 수 있는 예제가 있다.

 

개발자는 그냥 library 를 import 하고 구글 클라우드 콘솔(console.cloud.google.com)에서 다운받은 OAuth 2.0 클라이언트 (credentials.json) 파일을 넣어준 후 필요한 클래스들을 사용하여 메서드를 호출하면

사용자의 Google Drive 에 있는 파일 목록을 조회하고 새로운 파일을 업로드하거나 다운로드 할 수 있게 된다.

그걸 모르고 일주일동안 Web환경에서 Google OAuth 처리를 위해 고군분투 했었다. ㅎㅎ

javascript 와 servlet 을 이용하여 code, access token, refresh token 을 발급받아 저장하는 로직까지 구현했는데...

굳이 js 와 servlet 을 오가면서 인증 파일들을 주고 받을 필요가 없었다.

각설하고, 그렇다면 위에 얘기한 샘플 예제는 어디있는고 하니..

https://developers.google.com/drive/api/quickstart/java#set_up_the_sample

 

자바 빠른 시작  |  Google Drive  |  Google for Developers

이 페이지는 Cloud Translation API를 통해 번역되었습니다. 의견 보내기 자바 빠른 시작 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 빠른 시작에서는 Google Work

developers.google.com

 

샘플 실행 절차는 다음과 같다.

  1. 위 링크의 예제를 DriveQuickstart.java 클래스로 만들어 저장한다.
  2. [Google Cloud Console / API 및 서비스 / 사용자 인증 정보 / OAuth 2.0 클라이언트 ID / 승인된 리디렉션 URI] 에 "http://localhost:8888/Callback" 추가 저장해준다.
  3. https://developers.google.com/drive/api/quickstart/java#prepare_the_workspace 경로에서 gradle 내용을 참고하여 의존 라이브러리들을 추가한다.
  4. DriveQuickstart.java 클래스를 run 하면 main 함수가 자동 실행된다.
  5. 구글 계정 로그인 창이 열리고 로그인 이후 사용자 동의 화면도 연속적으로 출력된다.
  6. 이후 프로그램 실행 콘솔에는 로그인 계정의 Google Drive 에 있는 파일 목록을 출력해준다. 

참고로 필요한 라이브러리를 gradle 로 다운받으면 좋겠지만

본인이 생성한 프로젝트가 gradle project 가 아니라면 jar 파일들만 따로 classpath 에 import 하는게 편할텐데

필요한 jar 파일들은 "google-api-client", "google-oauth-client-jetty", "google-api-services-drive" 이다.

jar 파일들을 다운 받는 방법은 다음과 같다.

  1. gradle 내용에서 dependncies 에 implementation 으로 기술된 jar 라이브러리명 들을 copy 한다.
  2. 브라우저에서 https://central.sonatype.com/ 주소로(Maven Central) 접속한다.
  3. 검색창에 필요한 jar 파일의 이름을 입력하여 검색한다.
  4. 결과 목록에서 찾으려는 항목을 보면 "Latest version x.x.x View all" 링크가 있다.
  5. View all 을 들어가보면 이전 버전들도 보이고 원하는 버전을 찾아 Browse 링크를 클릭한다.
  6. Browse 링크를 열면 Central Repository 로 접속된다.
  7. 파일 목록중 OOO.jar 파일을 찾아 다운로드 하면 된다.
  8. jar 파일을 다운받아 classpath 에 넣으면 된다.

 

마지막으로 사용하는 라이브러리들의 API Document 주소들이다.

1. Google Drive API v3 Library ( google-api-services-drive ) : Overview (Drive API v3 (Rev. 197) 1.25.0) (google.com)

 

Drive API v3 (Rev. 197) 1.25.0

 

developers.google.com

2. Java용 Google API Client Library ( google-api-client ) : google-api-client overview (2.1.2)

 

google-api-client overview (2.1.2)  |  Java client library  |  Google Cloud

Send feedback google-api-client overview (2.1.2) Stay organized with collections Save and categorize content based on your preferences. Google APIs. Google APIs support based on the Apache HTTP Client. Google's additions to OAuth 2.0 authorization as speci

cloud.google.com

 

구글에서는 2020년 6월 3일부터 기본API 와 클라우드 전용API를 각각 구분해주기 위해서 
하나였던 ML Kit를 제목과 같이 두 가지로 나누었다고 한다. 
 
기본 API는(ML Kit) 라틴어 기반의 모든 텍스트를 인식할 수 있고,  
클라우드 기반의 API는(Cloud Vision API) 더 많은 텍스트 언어를 지원한다고 한다.
그 외에도 이미지 인식 사례 등에서 아래 표와 같은 차이를 드러낸다.

중요한건 상업적으로 이용하려면 유료 사용이 필수가 된다.
아마 ml kit 로 개발했다하더라도 android 버전업 되는 순간 cloud 전용 기술이 될 것 같다.

 

지니박스에 카카오와 네이버의 소셜 로그인을 구현후 구글의 자동 로그인이 필요하여 잼민이(Gemini)에게 먼저 물어보았다.
그리고 답변은 다음과 같다.

더보기

사용자 로그인 경험을 향상시키기 위해 첫 로그인 이후 알림 없이 자동 로그인을 설정하고 싶으시군요! 
Google OAuth를 이용하면 간단하게 자동 로그인 기능을 구현할 수 있습니다. 

두 가지 방법을 소개해 드리겠습니다.

1. 서버 측 코드를 이용한 자동 로그인
사용자 동의: 로그인 과정에서 사용자에게 자동 로그인 여부를 선택할 수 있는 옵션을 제공합니다.
Authorization Code 획득: 사용자가 자동 로그인을 선택하면, Google OAuth를 통해 Authorization Code를 발급받습니다.
Refresh Token 발급: Authorization Code를 사용하여 Refresh Token을 발급받습니다. Refresh Token은 만료 기간이 길기 때문에 사용자의 로그인 상태를 유지하는 데 사용됩니다.
Refresh Token 저장: Refresh Token을 사용자의 기기에 안전하게 저장합니다. 일반적으로 쿠키 또는 로컬 스토리지에 저장합니다.
자동 로그인: 사용자가 사이트 또는 앱을 다시 방문할 때, 저장된 Refresh Token을 사용하여 자동으로 로그인합니다.

2. 클라이언트 측 코드를 이용한 자동 로그인
Google APIs Client Library: Google APIs Client Library를 사용하여 OAuth 흐름을 구현합니다.
사용자 동의: 로그인 과정에서 사용자에게 자동 로그인 여부를 선택할 수 있는 옵션을 제공합니다.
Authorization Code 획득: 사용자가 자동 로그인을 선택하면, Google OAuth를 통해 Authorization Code를 발급받습니다.
Refresh Token 발급: Authorization Code를 사용하여 Refresh Token을 발급받습니다.
Refresh Token 저장: Refresh Token을 사용자의 기기에 안전하게 저장합니다. 일반적으로 쿠키 또는 로컬 스토리지에 저장합니다.
자동 로그인: 사용자가 사이트 또는 앱을 다시 방문할 때, 저장된 Refresh Token을 사용하여 자동으로 로그인합니다.

참고 사항
자동 로그인 기능은 사용자 편의성을 위해 제공하지만, 보안 측면에서 주의가 필요합니다.
사용자에게 자동 로그인 기능의 장점과 단점을 명확하게 설명하고, 선택권을 제공해야 합니다.
자동 로그인 기능을 비활성화할 수 있는 방법도 제공해야 합니다.
Refresh Token을 안전하게 저장하고 관리해야 합니다.

추가 정보
Google OAuth 2.0: [유효하지 않은 URL 삭제됨]
Google APIs Client Library: https://developers.google.com/api-client-library/
자동 로그인 기능 구현 시 참고할 수 있는 샘플 코드와 라이브러리
Google OAuth 2.0 Playground: [유효하지 않은 URL 삭제됨]
Auth0: https://auth0.com/
Okta: https://www.okta.com/
 
도움이 되었기를 바랍니다! 궁금한 점이 있으면 언제든지 질문해 주세요.

위 내용에 따라 refresh token 를 얻어서 스토리지에 저장후 사용자가 서비스에 로그인 할때마다 꺼내서 구글 계정도 함께 인증하는데 사용하면 되겠다! 라고 생각했다.

그래서 이전부터 조사중에 있던 Google API 에서 Authentication(인증) 관련된 javascript library 에서 refresh token 을 얻는 방법을 열심히 찾았었다.

관련 javascript library 는 다음과 같다.

더보기

Google Accounts JavaScript Library
    https://accounts.google.com/gsi/client 라이브러리를 임포트하고
    google.accounts.oauth2 객체를 이용하여 사용자 인증 프로세스를 진행한다.

Google APIs Client Library
    https://apis.google.com/js/api.js 라이브러리를 임포트하고
    gapi.client 객체를 이용하여 사용자 인증 프로세스에서 얻은 access token 으로
    google workspace api 에 필요한 데이터를 요청하게 된다.

하지만 위와 같은 javascript library 들에서는 refresh token 을 얻는 API를 찾을 수가 없었다.
대신 Google REST API 에서는 몇가지 옵션을 통해서 refresh token 을 얻을 수 있었는데 (실습 내용)
어떻게든 javascript library 를 이용해보려고 Gemini 와 Bing 그리고 Google 공식 사이트를 샅샅이 뒤져보았지만 해당 API에 대한 Specification Document 를 찾을 수도 없었다.

그래서 API 찾는 것을 포기하고 Stackoverflow 에서 "google.accounts.oauth2 refresh token" 키워드로 검색한 결과 다음과 같은 Q&A 를 통해 javascript api 를 이용할게 아니라 애초에 Google Identity 에 대한 전체적인 흐름 학습이 먼저였다는 것을 겨우 알게 되었다.

https://stackoverflow.com/questions/77796811/google-accounts-oauth2-tokenclient-how-to-get-refresh-token

 

google.accounts.oauth2 TokenClient, how to get refresh token

Using gapi my goal is to authenticate the user, then save their refresh token, which is to be later used for performing background tasks on the server side. For this I have made a simple authentica...

stackoverflow.com

위에 나온 Gemini 의 답변에서 누락된 부분은
client(브라우저) 로만 인증 프로세싱을 구현하게 되면 인증에서의 중요한 key와 code, token 등이 노출 될 수 있으므로
안전한 사용자 자동 인증 서비스를 위해서 client(브라우저) 와 service server(지니박스) 를 연계하여 인증 프로세스를 구축하는 것을 권장한다.

그리고 인증 프로세스의 전체 내용은
client(브라우저) 에서 authorization code(승인 코드) 를 발급받고 이를 service server(지니박스) 에 넘겨  authorization server(구글 인증서버) 로부터  access token 와 refrsh token 을 발급받아
access token 은 지금 요청받은 사용자 요구를 처리하고 refresh token 은 스토리지에 저장하여
사용자가 이후 서비스에 재로그인시 google authentication 에도 함께 자동 로그인하게 처리하라는 내용이었다.
token 요청시 client_secret 이라는 매우 조심스러운 값을 인증 서버로 전달해야 하므로 위와 같은 인증 처리 절차가 필요하다.

참고로 google identity 의 Authentication 과 Authorization 에 대한 내용은 다음의 문서에서 학습이 가능하다.

Google Identity  |  Google for Developers

 

Google ID 플랫폼  |  Google for Developers

사용자가 앱에 로그인하고 앱에 Google 서비스 사용 권한을 부여하도록 돕습니다.

developers.google.com

 

위 문서에서 Google OAuth2.0 에 대한 전체적인 Flow 는 다음의 문서에 잘 나와 있다.

Using OAuth 2.0 to Access Google APIs  |  Authorization  |  Google for Developers

 

OAuth 2.0을 사용하여 Google API에 액세스하기  |  Authorization  |  Google for Developers

이 페이지는 Cloud Translation API를 통해 번역되었습니다. 의견 보내기 OAuth 2.0을 사용하여 Google API에 액세스하기 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.

developers.google.com

 

마지막으로 다음의 내용에서 sample code 를 보면 Google APIs Client Library (JavaScript) 를 이용하지 않고 순수 JavaScript code 로 form submit 을 이용하여 REST API를 호출하는 방법을 보여준다.

https://developers.google.com/identity/protocols/oauth2/javascript-implicit-flow#redirecting

 

클라이언트 측 웹 애플리케이션용 OAuth 2.0  |  Authorization  |  Google for Developers

이 페이지는 Cloud Translation API를 통해 번역되었습니다. 의견 보내기 클라이언트 측 웹 애플리케이션용 OAuth 2.0 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.

developers.google.com

 

또한 다음의 sample code 에서는 XMLHttpRequest 객체를 이용한 완전한 Ajax 예제도 보여주고 있다. 

https://developers.google.com/identity/protocols/oauth2/javascript-implicit-flow#example

 

클라이언트 측 웹 애플리케이션용 OAuth 2.0  |  Authorization  |  Google for Developers

이 페이지는 Cloud Translation API를 통해 번역되었습니다. 의견 보내기 클라이언트 측 웹 애플리케이션용 OAuth 2.0 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.

developers.google.com

 

어차피 Google REST API 를 알고 있다면 복잡하게 Google APIs Client Library 를 이용하지 말고
그냥 REST API 를 호출하는 것이 추후 유지보수에서도 효율적일 것으로 판단하였다.
그래서 웹브라우저와 서버 CGI 모두 Google REST API 를 호출하여 데이터를 취할 수 있도록 수정 적용하였다.

 

+ Recent posts