YouTube의 새로운 광고 차단 방지 조치

2 weeks ago 11

  • YouTube는 최근 광고 차단 방지 실험을 강화하여 일부 이용자에게 페이크 버퍼링 현상이 나타남
  • 이 페이크 버퍼링은 광고 길이의 약 80%만큼 동영상 시작을 지연시키는 방식으로 작동함
  • 사용자는 광고 차단 필터에 특정 설정을 추가하면 이 효과를 일부 우회할 수 있음
  • YouTube는 글로벌 캐시 및 SABR 프로토콜 등 다양한 기술로 광고 차단을 감지 및 대응함
  • 일부 JavaScript 잠금 스크립트로 인해 브라우저, 필터 및 확장프로그램의 동작 제한 현상도 발생함

개요

  • 최근 YouTube가 광고 차단 방지 기능을 재차 도입하여 실험 중임
  • A/B 테스트를 통해 일부 계정에만 실험적 기능이 적용되고 있음
  • 사용자는 uBlock Origin이나 Brave 브라우저에서 이들 변화를 피할 수 있는 필터를 사용할 수 있음(기본 필터에 이미 포함)

페이크 버퍼링 현상

  • 주요 현상은 동영상 시작 시 길어진 버퍼링임(중간에는 해당 없음)
  • 이 페이크 버퍼링 길이는 원래 광고를 봐야 했던 시간의 80% 수준
  • 예를 들어 광고가 15초라면, 사용자는 12초 정도 버퍼링을 겪게 됨
  • 여러 광고가 연속으로 있는 경우 각 길이의 80%를 합친 시간만큼 대기 효과가 발생함
  • 광고 차단 사용자는 여전히 시간 이득을 보게 됨

내부 구조 및 작동 원리

  • InnerTube는 YouTube의 공식 내부 API로, 웹·모바일 클라이언트가 동영상과 관련 정보 접근에 사용함
  • 비디오 스트림은 GVS(Google Video Services) 를 통해 전달되며 링크는 시간이 만료되어 재생성이 필요함
  • 유튜브는 네트워크 부하 최적화를 위해 Google Global Cache 서버도 활용함
  • 과거에는 단순히 쿼리 매개변수로 비디오 범위를 설정했으나, 최근에는 SABR(Server ABR) 라는 독자적 바이너리 프로토콜을 사용함
  • SABR는 필요 시 backoff(지연 명령) 를 보내, 클라이언트가 일정 시간 대기하게 유도함

페이크 버퍼링의 실제 발생 원인

  • 광고 차단 탐지 시, InnerTube는 GVS 스트림에 광고 길이의 80%만큼 backoff를 포함시킴
  • 이 backoff는 광고 차단 여부와 관계 없이 A/B 테스트 그룹에 속할 경우 항상 적용됨
  • 광고가 차단되지 않은 사용자는 백엔드에서 content video를 미리 로드하여 이런 지연을 체감하지 않음
  • "Experiencing interruptions" 등의 알림은 장기간 backoff로 인해 표시되는 현상임
  • 웹상에 떠도는 "CPU 과부하 이슈" 등은 사실 아님

광고를 원천 차단하는 방법

  • 광고 스트림 자체를 받지 않기 위해 isInlinePlaybackNoAd 속성을 true로 설정할 수 있음
  • JSON 요청에 "isInlinePlaybackNoAd":true 항목이 들어가면, InnerTube는 광고와 backoff를 포함하지 않음
  • uBlock Origin 사용자 필터에 관련 규칙을 삽입하여 자동 적용 가능
  • 이 속성은 프론트엔드 JavaScript 및 Protocol Buffers 정의에서 확인 가능함

한계와 부작용

  • 해당 방식은 이미 로딩된 YouTube 싱글 페이지 앱 내에서의 내비게이션(따뜻한 로딩) 에서만 우회 가능함
  • 최초 진입(콜드 로딩)시엔 백엔드에서 제공된 초기 데이터로 인해 적용 불가
  • 강제로 초기 데이터를 제거하는 시도는 라이브 스트림, 페이지 속도, 사용자 경험 등 여러 문제점을 유발함

잠금 스크립트(Locker Script)의 차단 우회

  • YouTube는 일부 실험 집단에 <head> 태그 상단에 글로벌 객체들을 수정 불가 상태로 만드는 잠금 스크립트를 삽입함
  • uBlock Origin 등 확장은 해당 스크립트가 실행되기 전에만 객체 후킹을 할 수 있음
  • Firefox는 HTML 필터링으로 이를 우회 가능하지만, Chromium 브라우저는 이 방식을 지원하지 않음
  • 이에 대응해 Object.assign 후킹 방식으로 필터 우회 가능
  • 이 방법을 이용할 경우 고급 Proxy 기능을 사용하여 "isInlinePlaybackNoAd":true 삽입이 가능함

참고 자료

  • 추가 질문은 Discord @moreloops를 통해 문의 가능함

Read Entire Article