πŸ› οΈ YouTube μžλ™ν™” νŒŒμ΄ν”„λΌμΈ: HTTP API & OAuth 2.0 직접 μ œμ–΄ κ°€μ΄λ“œ

# πŸ› οΈ YouTube μžλ™ν™” νŒŒμ΄ν”„λΌμΈ: HTTP API & OAuth 2.0 직접 μ œμ–΄ κ°€μ΄λ“œ

**λ¬Έμ„œ μž‘μ„±μΌ:** 2026-03-13
**μž‘μ„±μž:** μ‘°μš©ν•œ λΆ€μ˜ μ„€κ³„μž & AI μ–΄μ‹œμŠ€ν„΄νŠΈ
**λͺ©μ :** Make.com κΈ°λ³Έ YouTube λͺ¨λ“ˆμ˜ μž¦μ€ 토큰 만료(400 Error) 및 κΆŒν•œ 였λ₯˜(403 Error)λ₯Ό μš°νšŒν•˜μ—¬, λ¬΅λ¬΅ν•˜κ³  μ•ˆμ •μ μœΌλ‘œ λŒμ•„κ°€λŠ” λ°±μ—”λ“œ μ—…λ‘œλ“œ μ‹œμŠ€ν…œ ꡬ좕.

## πŸ“‹ [To-Do List] μžλ™ν™” μ‹œμŠ€ν…œ ꡬ좕 λ§ˆμŠ€ν„° ν”Œλžœ
– [ ] λ…λ¦½λœ GCP ν”„λ‘œμ νŠΈ μ„ μ • 및 YouTube Data API v3 ν™œμ„±ν™”
– [ ] GCP OAuth λ™μ˜ ν™”λ©΄ μ„ΈνŒ… (Testing -> In Production μ „ν™˜)
– [ ] Custom OAuth ν΄λΌμ΄μ–ΈνŠΈ ID/Secret λ°œκΈ‰ 및 λ¦¬λ””λ ‰μ…˜ URI μΌμΉ˜ν™”
– [ ] Make.com HTTP λͺ¨λ“ˆ (Make an OAuth 2.0 request) μ„ΈνŒ…
– [ ] Access Token 헀더 μ£Όμž… 및 Multipart νŽ˜μ΄λ‘œλ“œ 섀계
– [ ] νŒŒμ΄ν”„λΌμΈ μŠ€μΌ€μ€„λ§ 및 λͺ¨λ‹ˆν„°λ§ 적용

## πŸ” μ‹€ν–‰ κ°€λŠ₯μ„± 검증 (Executability Check)
– **μ‹œμŠ€ν…œ μš”κ΅¬μ‚¬ν•­ 확인:** λ³Έ κ°€μ΄λ“œλŠ” λ‹€μˆ˜μ˜ λΈŒλžœλ“œ 채널을 μš΄μ˜ν•˜λ©° 일일 μ—…λ‘œλ“œ μ œν•œ(Quota)을 μ΄ˆκ³Όν•˜μ§€ μ•ŠλŠ” λ²”μœ„ λ‚΄μ—μ„œ 단일 GCP ν”„λ‘œμ νŠΈλ₯Ό ν™œμš©ν•˜λŠ” ꡬ쑰λ₯Ό μ „μ œλ‘œ μž‘μ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
– λͺ¨λ“  섀정은 Google Cloud Console의 κ΄€λ¦¬μž κΆŒν•œμ΄ μžˆλŠ” μƒνƒœμ—μ„œ μœ νš¨ν•©λ‹ˆλ‹€.

## 1. 인프라 기반 λ‹€μ§€κΈ° (GCP ν”„λ‘œμ νŠΈ μ„ΈνŒ…)
λΈ”λž™λ°•μŠ€ 같은 κΈ°λ³Έ λͺ¨λ“ˆμ„ κ±·μ–΄λ‚΄κ³  ν†΅μ œκΆŒμ„ μ₯κΈ° μœ„ν•œ μ²«κ±ΈμŒμž…λ‹ˆλ‹€. λ‚¨μ˜ μ„œλ²„κ°€ μ•„λ‹Œ ‘λ‚΄ μ„œλ²„(GCP)’의 μžκ²©μ„ 증λͺ…ν•΄μ•Ό ν•©λ‹ˆλ‹€.

– **ν”„λ‘œμ νŠΈ 격리:** κΈ°μ‘΄ ν”„λ‘œμ νŠΈμ™€ μ„žμ§€ μ•Šκ³ , μžλ™ν™” μ „μš© GCP ν”„λ‘œμ νŠΈλ₯Ό μ‹ κ·œλ‘œ μƒμ„±ν•˜κ±°λ‚˜ μš©λ„κ°€ λΆ„λ¦¬λœ κΉ¨λ—ν•œ ν”„λ‘œμ νŠΈλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.
– **API ν™œμ„±ν™”:** API 및 μ„œλΉ„μŠ€ > λΌμ΄λΈŒλŸ¬λ¦¬μ—μ„œ YouTube Data API v3λ₯Ό λ°˜λ“œμ‹œ ‘μ‚¬μš© μ„€μ •(Enable)’ ν•©λ‹ˆλ‹€.

## 2. λ¬Έμ§€κΈ° ν†΅κ³Όν•˜κΈ° (OAuth 2.0 μ„€μ • 및 μ—λŸ¬ ν•΄κ²°)
κ°€μž₯ λ§Žμ€ κ°œλ°œμžκ°€ μ’Œμ ˆν•˜λŠ” 인증 λ‹¨κ³„μž…λ‹ˆλ‹€. κ΅¬κΈ€μ˜ κΉκΉν•œ λ³΄μ•ˆ μ •μ±…(400, 403 μ—λŸ¬)을 μš°μ•„ν•˜κ²Œ νšŒν”Όν•˜λŠ” μ„€μ •κ°’μž…λ‹ˆλ‹€.

– **403 access_denied μ—λŸ¬ (프라이빗 클럽의 μ €μ£Ό):** GCP OAuth λ™μ˜ ν™”λ©΄μ—μ„œ κ²Œμ‹œ μƒνƒœκ°€ ‘ν…ŒμŠ€νŠΈ 쀑(Testing)’일 λ•Œ λ°œμƒν•©λ‹ˆλ‹€.
– **ν•΄κ²°μ±…:** μ•± κ²Œμ‹œ(Publish App) λ²„νŠΌμ„ 눌러 **’ν”„λ‘œλ•μ…˜(In production)’**으둜 과감히 μ „ν™˜ν•©λ‹ˆλ‹€. (λ‚΄λΆ€ μ‚¬μš© λͺ©μ μ΄λ―€λ‘œ ꡬ글 μ•± κ²€ν† λŠ” λ¬΄μ‹œν•©λ‹ˆλ‹€).
– **400 redirect_uri_mismatch μ—λŸ¬ (κΈΈ μžƒμ€ 토큰):** Make.com이 μš”κ΅¬ν•˜λŠ” 콜백 μ£Όμ†Œκ°€ GCP에 λ“±λ‘λ˜μ§€ μ•Šμ•„ λ°œμƒν•©λ‹ˆλ‹€.
– **ν•΄κ²°μ±…:** GCP μ‚¬μš©μž 인증 정보 > OAuth 2.0 ν΄λΌμ΄μ–ΈνŠΈ ID μˆ˜μ • ν™”λ©΄μ—μ„œ 승인된 λ¦¬λ””λ ‰μ…˜ URI에 `https://www.integromat.com/oauth/cb/oauth2` λ₯Ό 토씨 ν•˜λ‚˜ 틀리지 μ•Šκ³  μΆ”κ°€ν•©λ‹ˆλ‹€.

## 3. μ‹œμŠ€ν…œμ˜ ν˜ˆκ΄€ μ—°κ²° (API 직접 호좜)
ν† ν°μ΄λΌλŠ” λΉ„λ°€ 톡행증을 μ–»μ—ˆλ‹€λ©΄, μ„œλ²„μ˜ 헀더(Header)에 이λ₯Ό μ‹€μ–΄ 보내야 ν•©λ‹ˆλ‹€.

### Make.com HTTP λͺ¨λ“ˆ μ„ΈνŒ… (Make an OAuth 2.0 request)
– **Authorize URI:** `https://accounts.google.com/o/oauth2/v2/auth`
– **Token URI:** `https://oauth2.googleapis.com/token`
– **Scope:** `https://www.googleapis.com/auth/youtube.upload`
– **API Endpoint:** `https://www.googleapis.com/upload/youtube/v3/videos?uploadType=multipart&part=snippet,status` (λ©”μ†Œλ“œ: POST)

### λŒ€μ•ˆ: Google Apps Script (GAS) μ½”λ“œ κ΅¬ν˜„
λ§Œμ•½ Make.com을 λ²—μ–΄λ‚˜ 순수 μ½”λ“œλ‘œ μ œμ–΄ν•  λ•Œ μ‚¬μš©ν•˜λŠ” ν…œν”Œλ¦Ώμž…λ‹ˆλ‹€.

“`javascript
function uploadVideoDirectly() {
var accessToken = “λ°œκΈ‰λ°›μ€_Access_Token”;
var url = “https://www.googleapis.com/youtube/v3/videos?part=snippet,status”;
var headers = {
“Authorization”: “Bearer ” + accessToken, // Bearer λ’€ 띄어쓰기 1μΉΈ ν•„μˆ˜
“Accept”: “application/json”,
“Content-Type”: “application/json”
};
var videoMetadata = {
“snippet”: {
“title”: “μ‹œμŠ€ν…œμ΄ λΉšμ–΄λ‚Έ 수읡”,
“description”: “λ°±μ—”λ“œ μ½”λ“œλ‘œ μ™„μ„±λœ μžλ™ν™” νŒŒμ΄ν”„λΌμΈ”,
“categoryId”: “22”
},
“status”: {
“privacyStatus”: “private”
}
};
var options = {
“method”: “post”,
“headers”: headers,
“payload”: JSON.stringify(videoMetadata),
“muteHttpExceptions”: true
};
var response = UrlFetchApp.fetch(url, options);
Logger.log(response.getResponseCode());
}
“`

## 4. μžμ› 관리와 ν™•μž₯μ„± (Quota & Multi-channel)
ν•˜λ‚˜μ˜ GCP Client ID둜 μ—¬λŸ¬ λΈŒλžœλ“œ 계정을 μ—°κ²°ν•˜λŠ” 것은 μ•„ν‚€ν…μ²˜μƒ μ™„λ²½νžˆ κ°€λŠ₯ν•˜λ©° ꢌμž₯λ©λ‹ˆλ‹€. Make.comμ—μ„œ Connection만 λΆ„λ¦¬ν•˜μ—¬ μ—°κ²°ν•˜λ©΄ λ©λ‹ˆλ‹€. 단, κ΅¬κΈ€μ˜ μžλΉ„ μ—†λŠ” API ν• λ‹ΉλŸ‰(Quota)을 μˆ˜ν•™μ μœΌλ‘œ 계산해야 ν•©λ‹ˆλ‹€.

– **ν”„λ‘œμ νŠΈλ‹Ή 일일 κΈ°λ³Έ ν• λ‹ΉλŸ‰:** 10,000 Units
– **λ™μ˜μƒ μ—…λ‘œλ“œ 1회 μ†Œλͺ¨λŸ‰:** 1,600 Units
– **ν•˜λ£¨ μ΅œλŒ€ μ—…λ‘œλ“œ κ°€λŠ₯ μˆ˜λŸ‰:** `⌊10,000 / 1,600βŒ‹ = 6 videos/day`

**μ „λž΅:** 총합 ν•˜λ£¨ 6개λ₯Ό μ΄ˆκ³Όν•˜λŠ” μ—…λ‘œλ“œκ°€ ν•„μš”ν•˜λ‹€λ©΄, 단일 ID μ•„ν‚€ν…μ²˜λ₯Ό 버리고 λΈŒλžœλ“œ μ±„λ„λ³„λ‘œ GCP ν”„λ‘œμ νŠΈλ₯Ό 물리적으둜 λΆ„λ¦¬ν•˜μ—¬ ν• λ‹ΉλŸ‰μ„ ν™•μž₯ν•΄μ•Ό ν•©λ‹ˆλ‹€.

Leave a Reply

Your email address will not be published. Required fields are marked *

ν™ˆ
ν•«λ”œ
ν…Œν¬λ‰΄μŠ€
검색