Knowledge 목록으로
Source URL 유지 · Knowledge projection
Google OAuth2 client_secret.json 만들기 — 대표 이미지

Google OAuth2 client_secret.json 만들기

2026년 4월 25일업데이트 2026년 9월 9일3
작성 DevSnack Lab원문·측정 조건·검수 범위는 본문에 기록
32
개발 도구튜토리얼OAuth
SEO meta description: Google OAuth2 client_secret.json 생성부터 Blogger API 토큰 발급까지 단계별 가이드. Google Cloud Console 설정 방법.

※ 이 글은 설명을 돕기 위한 실제 터미널 출력 화면과 설정 파일 예시를 포함하고 있습니다. 곧 스크린샷도 추가할 예정입니다.

최종 업데이트: 2026년 9월 9일

개요

💡 왜 이 글이 필요했는가

사실 이 글을 쓰게 된 계기는 생각보다 단순하다. YouTube 자동화 파이프라인을 만들면서 Blogger API, YouTube Data API, Google Drive API를 연달아 붙여야 했는데, 매번 OAuth 설정할 때마다 "어디서 클라이언트 ID를 만들었더라?" 하고 헤매는 내 자신이 너무 답답했다. 특히 OAuth 동의 화면 설정에서 테스트 사용자를 등록하지 않아서 30분 동안 "403 access_denied"와 씨름한 경험이 결정적이었다. "이걸 한 번에 정리해두면 나중에 또 삽질하지 않겠다" 싶어서 쓴 글이 지금까지 내게 가장 큰 도움이 되는 글이 되었다. OAuth는 처음이 어렵지, 한 번 해두면 그 다음부터는 식은 죽 먹기다.

Python 등으로 Google API(Drive, Gmail, Calendar, Blogger 등)를 사용하려면 OAuth2 인증이 필요합니다. 이때 핵심이 되는 파일이 바로 client_secret.json입니다. 이 파일은 직접 작성하는 것이 아니라 Google Cloud Console에서 다운로드하는 것입니다.

1. Google Cloud Console 접속

https://console.cloud.google.com에 접속하여 Google 계정으로 로그인합니다.

2. 프로젝트 생성

상단의 프로젝트 선택 드롭다운을 클릭하고 "새 프로젝트"를 선택합니다. 프로젝트 이름을 입력하고 "만들기"를 누릅니다. 이미 프로젝트가 있다면 기존 프로젝트를 선택하면 됩니다.

3. API 활성화

왼쪽 메뉴에서 "API 및 서비스" → "라이브러리"로 이동합니다. 사용할 API를 검색하여 "사용 설정"을 클릭합니다.

예시:

  • Google Drive를 사용한다면 → Google Drive API
  • Gmail을 사용한다면 → Gmail API
  • Blogger를 사용한다면 → Blogger API v3
  • Calendar를 사용한다면 → Google Calendar API

4. OAuth 동의 화면 설정

"API 및 서비스" → "OAuth 동의 화면"으로 이동합니다.

  • User Type: "외부(External)" 선택 후 만들기
  • 앱 이름: 원하는 이름 입력
  • 사용자 지원 이메일: 본인 이메일
  • 개발자 연락처 이메일: 본인 이메일

나머지는 기본값으로 두고 "저장 후 계속"을 눌러 진행합니다.

테스트 사용자

Google Cloud Console OAuth 2.0 client_secret.json 생성 설정 화면

▲ Oauth2 Console

단계에서 본인 Gmail 주소를 추가합니다. 앱을 게시하기 전까지는 여기에 등록된 사용자만 인증이 가능합니다.

5. OAuth 클라이언트 ID 생성 (핵심)

"API 및 서비스" → "사용자 인증 정보"로 이동합니다.

상단의 "+ 사용자 인증 정보 만들기" → "OAuth 클라이언트 ID"를 클릭합니다.

항목선택/입력
애플리케이션 유형데스크톱 앱
이름원하는 이름 (예: "My App Client")

"만들기"를 클릭합니다.

6. JSON 파일 다운로드

생성 완료 팝업이 뜨면 "JSON 다운로드" 버튼을 클릭합니다. 다운로드된 파일명이 client_secret_xxxx.json 형태인데, 프로젝트 루트로 옮기고 이름을 변경합니다.

mv [local path]*.json /your/project/root/client_secret.json

기존에 만든 클라이언트의 JSON을 다시 다운로드하려면?

사용자 인증 정보 페이지에서 해당 클라이언트 이름을 클릭하여 상세 페이지로 들어가면 "JSON 다운로드" 버튼이 있습니다. 목록 화면에서 보이지 않는 경우가 있으니 반드시 상세 페이지로 들어가세요.

7. 최초 인증 실행

python setup.py

브라우저가 자동으로 열리면 Google 계정으로 로그인하고 권한을 허용합니다. 완료되면 token.json이 생성됩니다. access token은 유효한 refresh token이 있는 동안 자동 갱신할 수 있습니다. refresh token 자체가 만료되거나 폐기된 경우에는 다시 OAuth 인증이 필요합니다.

토큰이 만료됐다면 → Google OAuth 토큰 다시 발급하기

setup.py 파일 내용

#!/usr/bin/env python3
"""
최초 1회: YouTube + Blogger OAuth 인증

  python setup.py
"""

import sys
from google_auth_oauthlib.flow import InstalledAppFlow
from googleapiclient.discovery import build
from config import Config

# YouTube Upload + Blogger 스코프 통합
SCOPES = [
    "https://www.googleapis.com/auth/youtube.upload",
    "https://www.googleapis.com/auth/blogger",
]


def main():
    print("=" * 55)
    print("  AI News Shorts: 초기 설정")
    print("=" * 55)

    if not Config.CLIENT_SECRET_PATH.exists():
        print(f"\n❌ {Config.CLIENT_SECRET_PATH} 없음")
        print("\n설정:")
        print("  1. https://console.cloud.google.com")
        print("  2. YouTube Data API v3 활성화")
        print("  3. OAuth 2.0 클라이언트 (데스크톱 앱) 생성")
        print("  4. JSON → client_secret.json으로 저장")
        sys.exit(1)

    print("\n🔐 브라우저에서 Google 인증...\n")
    flow = InstalledAppFlow.from_client_secrets_file(
        str(Config.CLIENT_SECRET_PATH), SCOPES
    )
    creds = flow.run_local_server(port=9091, open_browser=True)

    with open(Config.TOKEN_PATH, "w") as f:
        f.write(creds.to_json())
    print(f"✅ 토큰 저장: {Config.TOKEN_PATH}")

    # YouTube 채널 확인
    print("\n📺 YouTube 채널 확인...")
    try:
        yt = build("youtube", "v3", credentials=creds)
        ch = yt.channels().list(mine=True, part="snippet").execute()
        items = ch.get("items", [])
        if items:
            print(f"  채널: {items[0]['snippet']['title']}")
        else:
            print("  ⚠️ 채널을 찾을 수 없습니다")
    except Exception as e:
        print(f"  ⚠️ {e}")


if __name__ == "__main__":
    main()

참고: client_secret.json 내부 구조

직접 편집할 일은 없지만 참고로 내부 구조는 다음과 같습니다.

{
  "installed": {
    "client_id": "xxxx.apps.googleusercontent.com",
    "project_id": "your-project-id",
    "auth_uri": "https://accounts.google.com/o/oauth2/auth",
    "token_uri": "https://oauth2.googleapis.com/token",
    "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
    "client_secret": "GOCSPX-xxxxxxxxxxxxxxxx",
    "redirect_uris": ["http://localhost"]
  }
}

핵심은 client_idclient_secret 두 값이며, 이것은 Google이 발급해주는 것이므로 직접 만들 수 없습니다.



📖 관련 글