
유튜브 video ID만 제공하는 학술 데이터셋의 영상 수천 개를 yt-dlp로 받다 보면 반드시 한 번은 만나게 되는 에러가 있다.
ERROR: [youtube] xxxx: Sign in to confirm you're not a bot.
Use --cookies-from-browser or --cookies for the authentication. See
<https://github.com/yt-dlp/yt-dlp/wiki/FAQ#how-do-i-pass-cookies-to-yt-dlp> ...
이 봇 확인 에러를 쿠키로 해결하는 과정을 정리했다. 환경은 macOS + 크롬 + yt-dlp 최신 버전 기준이다.
먼저 정확히 구분해야 할 것이 있다. yt-dlp 로그에는 "Sign in"이 들어간 비슷한 에러가 두 종류 나온다.
# A. 영상이 비공개로 전환된 경우 — 대응 불가
ERROR: [youtube] xxxx: Private video.
Sign in if you've been granted access to this video. ...
# B. 내 요청이 봇으로 의심받는 경우 — 대응 가능 (이 글의 주제)
ERROR: [youtube] xxxx: Sign in to confirm you're not a bot. ...
A는 영상이 비공개로 바뀐 것이다. 메시지의 "권한을 부여받았다면 로그인하라"는 안내는 소유자에게 접근 권한을 받은 계정 얘기라 쿠키를 넣어도 받을 수 없다. 데이터셋 관점에서는 링크 소실(link rot)로 집계되어야 한다.
B는 영상은 멀쩡한데 유튜브가 이 IP의 트래픽을 자동화로 의심하는 상태다. 수천 개를 sleep을 넣어가며 며칠씩 받다 보면 누적 요청량이 임계를 넘는 순간이 오고 그때부터 이 에러가 나타나기 시작한다. 문제는 방치하면 이후 영상들이 연쇄로 실패하면서 멀쩡한 영상까지 "못 받은 것"으로 집계된다는 점이다.
1차 해결: 브라우저 쿠키 실어 보내기
에러 메시지가 알려주는 대로, 브라우저의 유튜브 로그인 세션을 함께 보내면 "봇이 아니라 로그인한 사용자"로 취급되어 통과한다.
yt-dlp --cookies-from-browser chrome ... # Safari면 safari
이때 macOS에서는 처음 보는 시스템 창이 뜬다.

크롬은 저장된 쿠키를 macOS 키체인의 키로 암호화해 두기 때문에 yt-dlp가 쿠키를 읽으려면 그 복호화 키에 접근해야 하고, macOS가 이를 허가받는 과정이다. Mac 로그인 암호를 입력하면 되고, 며칠짜리 배치를 재실행하며 돌릴 거라면 "항상 허용"이 실용적이다.
쿠키를 쓰기 시작하면 함께 조정할 것이 하나 있다. 이제 요청이 내 계정에 연결되므로 요청 페이스는 오히려 더 보수적으로 가져가는 게 안전하다(--sleep-requests 3 --sleep-interval 3 이상). 계정 단위로도 과하면 제한이 올 수 있기 때문이다.
여기까지 하면 봇 확인이 해소되고 실패했던 영상들이 재시도에서 통과하기 시작한다.
2차 문제: 잘 되던 쿠키가 무효화 됨
며칠 뒤, 잘 돌던 배치가 다시 봇 확인에 걸리며 새로운 경고를 냈다.
WARNING: [youtube] The provided YouTube account cookies are no longer valid.
They have likely been rotated in the browser as a security measure.
yt-dlp는 실행 시점에 브라우저 쿠키를 복사해 가는데, 이후 브라우저(에 로그인된 유튜브)가 보안 절차로 세션 쿠키를 갱신(rotation)하면 그 복사본은 무효가 된다. 특히 다운로드가 도는 동안 그 브라우저로 유튜브를 열어 보면 거의 확실히 트리거된다.
즉 --cookies-from-browser는 "브라우저를 일상적으로 쓰는 사람"과 "며칠짜리 배치"의 조합에서 구조적으로 깨진다.
최종 해결: 로테이션되지 않는 "동결 쿠키" 파일 사용
yt-dlp 위키가 권장하는 방식은, 브라우저가 더 이상 갱신하지 않는 쿠키를 파일로 만들어 쓰는 것이다.
원리는 간단하다. 시크릿 창 세션의 쿠키는 창을 닫으면 브라우저가 갱신을 멈춘다. 그 순간의 쿠키를 파일로 떠 두면 로테이션과 무관한 안정적인 세션이 된다.
절차:
- 크롬 시크릿 창에서 youtube.com에 로그인한다.
- 쿠키 내보내기 확장프로그램("Get cookies.txt LOCALLY")으로 youtube.com 쿠키를 Netscape 형식 파일로 export한다.
- 로그아웃하지 않고 시크릿 창을 그냥 닫는다. (로그아웃하면 서버 측에서 쿠키가 무효화된다)
- yt-dlp에 파일로 넘긴다.
yt-dlp --cookies ./cookies.txt ...
추가한 확장 프로그램이 시크릿 창에 안 보일 때
확장을 설치했는데 시크릿 창에는 아이콘이 안보일 때 크롬 확장의 기본값이 시크릿 모드 비활성이라 그런 것으로 설정 하나만 켜면 된다.
chrome://extensions → 해당 확장 "세부정보" → "시크릿 모드에서 허용" 토글 ON → 시크릿 창을 새로 열면 아이콘이 보인다.


이후 적용이 됐는지는 두 가지로 확인한다.
실행 로그의 명령 에코에 --cookies ./cookies.txt가 보이는지, 그리고 몇 분 지켜보며 "cookies are no longer valid"와 "Sign in to confirm" 경고가 더 이상 나오지 않는지. 시작하자마자 "does not look like a Netscape format cookies file" 에러가 나면 export 형식이 JSON으로 된 것이니 Netscape 형식으로 다시 내보내면 된다(head -1 cookies.txt가 # Netscape HTTP Cookie File이어야 한다).
마지막으로 cookies.txt는 계정 세션이 통째로 담긴 민감 파일이다. 작업이 끝나면 삭제하고, 그 전에도 git 커밋이나 클라우드 업로드 대상 폴더에 섞이지 않게 둘 것. 그리고 배치가 도는 동안 해당 계정을 로그아웃하거나 비밀번호를 바꾸면 동결 쿠키도 무효화되니 피해야 한다.