겪은 일: 구글 API로 자료를 받던 예약 작업이 어느 날 invalid_grant를 내며 "다시 인증하라"고 멈췄습니다.
원인: OAuth 앱의 사용자 유형이 "외부"이고 게시 상태가 "테스트"면, 갱신 토큰이 발급 7일 뒤 만료됩니다.
이렇게 풀었다: Google 인증 플랫폼의 "대상"에서 앱을 게시하고, 게시한 뒤 한 번 다시 인증해 둡니다.
잘 돌던 예약 작업이 일주일 만에 멈췄다
서치콘솔이나 분석 자료처럼 구글 계정 권한을 받아 도는 스크립트는 처음 한 번 브라우저에서 허용을 누르고, 그때 받은 갱신 토큰(refresh token)으로 계속 돕니다. 그런데 며칠 잘 돌던 예약 작업이 토큰을 갱신하다 아래 오류로 멈췄습니다.
invalid_grant
앱을 게시하려고 콘솔에 들어갔더니 "앱 게시" 단추가 회색이라 누를 수 없었습니다. 다른 API 하나는 서비스 계정 키로 붙여 보니 "이 프로젝트에서 API가 꺼져 있다"가 나왔고, 켜려 해도 막혔습니다.
세 가지 모두 처음에는 서로 다른 문제처럼 보였지만, 뿌리는 구글 인증 방식 두 가지(OAuth 사용자 인증과 서비스 계정)를 구분하지 않은 데 있었습니다. 아래에서 하나씩 나눠 봅니다.
테스트 상태 앱의 7일 만료
구글 OAuth 문서의 "Refresh token expiration" 부분에 따르면, 사용자 유형이 외부이고 게시 상태가 테스트인 앱의 갱신 토큰은 발급 7일 뒤 만료됩니다. 예외는 이름, 이메일, 프로필 범위만 요청하는 앱뿐입니다. 자료를 읽는 범위를 쓰면 여기에 걸립니다.
| 증상 | 원인 |
|---|---|
| 7일마다 invalid_grant | 외부 사용자 유형 + 테스트 게시 상태 |
| "앱 게시" 단추가 회색 | 브랜딩의 별표 없는 칸(홈페이지, 개인정보처리방침 링크, 서비스 약관 링크, 승인된 도메인)이 비어 있다 |
| 서비스 계정으로 "API가 꺼져 있다" | 그 API가 서비스 계정을 아예 받지 않고 OAuth 설치형 앱 흐름만 받는다 |
세 번째는 따로 알아 둘 만합니다. 서치콘솔 API는 서비스 계정 키로 잘 되는데, 애드센스 Management API는 서비스 계정을 지원하지 않습니다. 오류가 "권한 없음"이 아니라 "API가 꺼져 있다"로 나와서 헤매기 쉽습니다.
앱을 게시하고 다시 인증한다
- 구글 클라우드 콘솔에서 Google 인증 플랫폼, 대상(영어 화면 Google Auth Platform, Audience)으로 갑니다.
- 맨 위 "게시 상태"가 테스트면 "앱 게시" 단추가 있습니다. 회색이면 브랜딩 메뉴에서 별표 없는 칸까지 채웁니다. 로고는 비워 두었습니다.
- 게시하면 상태가 "프로덕션 단계"로 바뀌고, 단추는 "테스트로 돌아가기"가 됩니다.
- 게시한 뒤 한 번 다시 인증해 새 토큰을 받습니다.
https://console.cloud.google.com/auth/audience?project=<프로젝트 ID>
4번은 공식 문서에 적혀 있지 않습니다. 테스트 때 받은 토큰이 게시 뒤에도 7일에 끊기는지는 문서로 확인하지 못했고, 개발자 포럼 경험담이 "다시 인증해야 오래 가는 토큰을 받는다" 쪽이라 안전하게 다시 인증했습니다.
몇 가지 더 알아 둘 것이 있습니다. 데스크톱 앱의 client secret은 만든 순간 한 번만 보이니 그 창에서 JSON을 받아 둡니다. 구글 검증을 받지 않은 앱은 허용할 때 "확인되지 않은 앱" 경고가 뜨고, 새 사용자가 프로젝트 평생 100명으로 막힙니다. 몇 개 계정으로 쓰는 개인 도구라면 이대로 써도 됩니다.
다시 끊기지 않는지 확인하는 법
대상 화면에서 게시 상태가 "프로덕션 단계"인지 봅니다. 9월 11일에 본 화면은 프로덕션 단계, 사용자 한도 100명 중 4명이었습니다. 그리고 끊긴 것을 사람이 바로 알게, 토큰 갱신에 실패하면 알림을 보내게 해 둡니다.
from google.auth.exceptions import RefreshError
try:
creds.refresh(request)
except RefreshError as e:
send_alert(f"구글 토큰 갱신 실패: {e}")
raise
예약 작업이 조용히 멈추면 며칠 뒤에야 알게 됩니다. 크론이 돌았다고 일이 된 것은 아니라는 이야기는 크론이 도는데 아무 일도 안 할 때에 적었습니다.
2단계 인증을 켜도 서비스 계정은 멈추지 않는다
구글 계정에 2단계 인증을 켜면 자동화가 멈출까 걱정했습니다. 구글 문서는 이 의무화가 사람 로그인에만 적용되고 서비스 계정에는 영향이 없다고 적고 있습니다. 실제로 켠 직후 서비스 계정 호출이 HTTP 200으로, 켜기 전과 같았습니다. 서비스 계정으로 서치콘솔을 읽는 법은 URL 검사 API 글에서도 이어집니다.
확인한 환경
| 항목 | 값 |
|---|---|
| 도구 | 구글 클라우드 콘솔(Google 인증 플랫폼), OAuth 데스크톱 앱 |
| 확인한 날짜 | 2026년 9월 11일(게시 상태 화면), 7월 31일(2단계 인증 뒤 호출) |
이 글의 내용은 2026년 10월 5일에 마지막으로 확인했습니다. 틀린 곳을 발견하시면 연락처로 알려 주세요.