Google OAuth2 client_secret.json 만들기
※ 이 글은 설명을 돕기 위한 실제 터미널 출력 화면과 설정 파일 예시를 포함하고 있습니다. 곧 스크린샷도 추가할 예정입니다.
최종 업데이트: 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)" 선택 후 만들기
- 앱 이름: 원하는 이름 입력
- 사용자 지원 이메일: 본인 이메일
- 개발자 연락처 이메일: 본인 이메일
나머지는 기본값으로 두고 "저장 후 계속"을 눌러 진행합니다.
테스트 사용자
▲ Oauth2 Console
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_id와 client_secret 두 값이며, 이것은 Google이 발급해주는 것이므로 직접 만들 수 없습니다.