YouTube Data API OAuth 인증 설정: 로컬 자동 업로더 연결하기
YouTube 영상을 코드로 업로드하려면 API 키만으로는 부족합니다. 영상 업로드, 썸네일 지정, 자막 등록처럼 채널 데이터를 바꾸는 작업은 채널 소유자의 동의를 받은 OAuth 2.0 인증이 필요합니다.
이 글에서는 로컬에서 실행하는 자동 업로더를 기준으로 Google Cloud 설정부터 최초 인증, 장기 운영 시 주의점까지 한 번에 정리합니다. 실제 클라이언트 정보나 토큰 값은 다루지 않습니다.
왜 이 주제가 중요한가
자동 업로드에서 가장 자주 막히는 지점은 코드보다 인증 설정입니다. 앱 유형을 잘못 고르거나, 테스트 사용자를 빠뜨리거나, 필요한 권한 범위를 누락하면 브라우저 동의 단계 또는 업로드 단계에서 오류가 납니다.
또한 OAuth 앱 검증과 YouTube API 규정 준수 감사는 서로 다른 절차입니다. 인증이 성공했다고 해서 새 API 프로젝트가 곧바로 공개 영상을 자동 업로드할 수 있는 것은 아닙니다. 개발 초기부터 두 절차를 구분해 두면 운영 전환 때 시행착오를 크게 줄일 수 있습니다.
핵심 개념
사용자 OAuth가 필요한 이유
일반 YouTube 채널은 서비스 계정으로 대신 로그인할 수 없습니다. 채널을 소유하거나 관리하는 Google 계정이 브라우저에서 직접 동의해야 합니다. 동의가 끝나면 애플리케이션은 액세스 토큰을 사용하고, 만료된 뒤에는 갱신 토큰으로 새 액세스 토큰을 발급받습니다.
로컬에서 사람이 최초 인증을 진행하는 도구라면 OAuth 클라이언트 유형은 데스크톱 앱이 자연스럽습니다. 인증 과정에서 시스템 브라우저가 열리고, 완료 결과는 로컬 리디렉션으로 돌아옵니다.
작업별 권한 범위
권한은 필요한 만큼만 요청하는 것이 원칙입니다.
| 작업 | 권장 범위 |
|---|---|
| 영상 업로드 | https://www.googleapis.com/auth/youtube.upload |
| 맞춤 썸네일 지정 | youtube.upload 범위로 처리 가능 |
| 별도 SRT 자막 업로드 | https://www.googleapis.com/auth/youtube.force-ssl 추가 |
영상에 자막을 입혀서 내보내는 것만으로 충분하다면 별도 자막 API 권한은 생략할 수 있습니다. 반대로 YouTube 플레이어에서 켜고 끌 수 있는 자막 트랙이 필요하다면 captions.insert 호출과 youtube.force-ssl 범위가 필요합니다.
실제 적용 포인트
1. Google Cloud 프로젝트와 API 준비
- Google Cloud Console에서 전용 프로젝트를 선택하거나 새로 만듭니다.
- API 및 서비스의 라이브러리에서 YouTube Data API v3를 찾아 활성화합니다.
- Google Auth Platform의 Branding에서 앱 이름과 지원 연락처를 설정합니다.
- Audience에서 외부 사용자를 선택하고, 개발 중에는 Testing 상태로 둡니다.
- 테스트 사용자에 실제 업로드할 YouTube 채널의 Google 계정을 추가합니다.
- Data Access에서 영상 업로드에 필요한 범위를 등록하고, 별도 자막이 필요할 때만 youtube.force-ssl을 추가합니다.
Google 계정 하나가 여러 YouTube 채널이나 브랜드 계정을 관리한다면 최초 동의 때 실제 업로드 대상 채널을 정확히 선택해야 합니다.
2. 데스크톱 앱 OAuth 클라이언트 만들기
Clients 메뉴에서 OAuth client ID를 만들고 애플리케이션 유형으로 Desktop app을 선택합니다. 내려받은 클라이언트 설정 파일은 소스 코드와 분리해 보관합니다.
권장 구조는 다음과 같습니다.
project/
.secrets/
youtube-client.json
youtube-token.json버전 관리 제외 규칙에는 다음 한 줄을 추가합니다.
.secrets/클라이언트 설정 파일과 갱신 토큰 파일은 모두 인증 정보입니다. Git 저장소, 메신저, 공개 문서, 빌드 산출물에 포함하지 말고 파일 권한도 최소화해야 합니다.
3. 최초 인증 실행
업로더를 처음 실행하면 시스템 브라우저가 열립니다. 테스트 사용자로 등록한 Google 계정으로 로그인하고, 올바른 YouTube 채널을 선택한 뒤 요청된 권한에 동의합니다.
성공하면 애플리케이션은 갱신 토큰을 로컬 비밀 저장 경로에 보관합니다. 이후에는 매번 브라우저를 열지 않고도 새 액세스 토큰을 받을 수 있습니다. 다만 사용자가 권한을 철회하거나 앱 상태가 바뀌면 다시 인증해야 할 수 있습니다.
4. 비공개 업로드로 전체 흐름 검증
처음부터 공개 업로드를 시도하기보다 다음 순서로 검증하는 편이 안전합니다.
- 짧은 테스트 영상을 비공개 상태로 업로드합니다.
- 제목, 설명, 태그가 의도대로 저장되는지 확인합니다.
- 맞춤 썸네일을 설정합니다.
- 필요한 경우 SRT 자막을 별도 트랙으로 등록합니다.
- YouTube Studio에서 영상과 자막을 직접 재생해 확인합니다.
각 단계가 독립적으로 성공하는지 기록하면 인증 오류와 미디어 처리 오류를 구분하기 쉽습니다.
주의할 점
Testing 상태의 갱신 토큰
외부 사용자용 OAuth 앱이 Testing 상태이고 YouTube 권한처럼 기본 로그인 범위를 넘어서는 권한을 요청하면 갱신 토큰이 일반적으로 7일 뒤 만료될 수 있습니다. 장기간 무인 실행이 필요하다면 Production 전환과 OAuth 검증 필요 여부를 미리 확인해야 합니다.
OAuth 검증과 YouTube API 감사는 별개
Google OAuth 검증은 앱이 요청하는 사용자 데이터 접근 범위를 심사하는 절차입니다. 이와 별도로 YouTube Data API의 videos.insert를 사용하는 검증되지 않은 새 API 프로젝트는 업로드 영상이 비공개로 제한될 수 있습니다. 공개 상태 자동 업로드가 목표라면 YouTube API Services Audit and Quota Extension Form을 통한 규정 준수 감사 필요 여부를 확인해야 합니다.
자주 만나는 오류
- 접근 차단: Audience 설정과 테스트 사용자 등록 여부를 확인합니다.
- 권한 부족: 실행한 작업과 요청한 OAuth 범위를 비교합니다.
- invalid_grant: 갱신 토큰의 만료, 철회 또는 앱 상태 변경을 확인하고 필요하면 다시 인증합니다.
- 영상이 비공개로만 등록됨: OAuth 문제가 아니라 API 프로젝트의 감사 제한일 수 있습니다.
- 다른 채널에 업로드됨: 최초 동의 때 선택한 Google 계정과 YouTube 채널을 다시 확인합니다.
듀오랩스가 보는 관점
자동 업로드는 최초 사용자 동의와 반복 실행을 분리해서 설계하는 것이 좋습니다. 최초 인증은 사람이 화면을 보며 진행하고, 반복 업로드는 최소 권한과 안전한 비밀 저장소를 사용해 실행합니다. 권한이 늘어날수록 운영 부담도 커지므로 영상 업로드, 썸네일, 별도 자막의 필요성을 나눠 판단하는 편이 좋습니다.
공개 자동화의 기준은 단순히 API 호출이 성공하는지가 아닙니다. 올바른 채널 선택, 비공개 시험 업로드, 메타데이터 검수, 토큰 보호, 앱 검증, YouTube 정책 준수까지 한 흐름으로 확인해야 안정적인 운영이 가능합니다.
최종 체크리스트
- YouTube Data API v3 활성화
- 앱 Branding과 Audience 설정
- 테스트 사용자에 업로드 계정 추가
- Desktop app OAuth 클라이언트 생성
- youtube.upload 범위 적용
- 별도 자막이 필요할 때만 youtube.force-ssl 추가
- 클라이언트 파일과 토큰 파일을 버전 관리에서 제외
- 비공개 영상으로 업로드·썸네일·자막 검증
- 장기 운영 전 Production 전환과 OAuth 검증 검토
- 공개 자동 업로드 전 YouTube API 감사 필요 여부 확인
공식 문서
함께 읽기
- Base64는 암호화가 아니다: 브라우저 Vault의 v2 봉투 암호화모바일 서명 파일이나 환경설정을 백업하다 보면 값 대부분이 Base64처럼 보일 때가 있다. 이때 가장 먼저 구분해야 할 사실이 있다.
- 개발 키가 많아질수록: Bitwarden으로 비밀번호와 시크릿을 나누는 법서비스를 운영하다 보면 GitHub 토큰, 데이터베이스 비밀번호, API 키, 배포 인증서, 백업 암호화 키가 빠르게 늘어납니다. 처음에는 비밀번호 관리 앱의 메모나 여러 .env 파일에 저장해도 괜찮아 보이지만, 키가 많아질수록 “무엇이 최신인지”, “개발용인지 운영용인지”, “어디에서 사용 중인지”를 판단하기 어려워…
- HMAC 입문: 서버는 값이 바뀌었다는 사실을 어떻게 알아낼까?웹 서비스를 만들다 보면 이런 값들을 자주 다룹니다.
- FVM으로 Flutter 버전 관리하기: 프로젝트별 SDK 고정부터 CI까지Flutter 프로젝트가 하나뿐일 때는 시스템에 설치된 SDK 하나로도 충분해 보입니다. 하지만 유지보수 중인 앱, 신규 앱, 검증용 브랜치가 서로 다른 Flutter 버전을 요구하기 시작하면 전역 SDK를 계속 바꾸는 방식은 금방 불편해집니다.
- Expo로 개발할 때 자주 쓰는 실행 명령어 모음Expo 앱을 개발하다 보면 명령어보다 “지금 다시 빌드해야 하나?”가 더 헷갈립니다. 화면 코드만 바꿨는데 Gradle 빌드를 다시 돌리기도 하고, 반대로 스플래시 이미지를 바꾼 뒤 Metro만 재시작해서 왜 그대로인지 한참 보기도 합니다.