
@AdGuardTeam on GitHub organization
지난 3월부터 AdGuard의 필터 팀에 합류해 필터 유지보수와 필터 인프라 관리를 오픈소스로1 맡고 있다. 필터(filter)는 모든 광고 차단기의 핵심으로, 어떤 콘텐츠를 막을지 전용 문법으로 적어 둔 규칙의 목록이다.2 이 규칙을 사이트마다 직접 작성하고 고치는 것이 필터 유지보수자의 일이다.
업무의 일환으로 uBlock Origin과 Brave 브라우저에서도 쓰이는 서드파티 한국어 필터의 커미터로 활동하고 있고, 필요에 따라 EasyList, uBlock Origin과도 협업하고 있다. (예: uBlockOrigin/uAssets#34470, easylist/easylist#24866)
온보딩
첫째 주에는 광고 차단 기술, 팀에서 관리하는 필터 목록, 필터 규칙 작성법을 다룬 AdGuard 지식 베이스(KB)를 살펴보는 일이 주어졌다. 그리고 둘째 주부터 바로 필터 유지보수 업무에 참여했다.
- 관리하는 필터 목록: AdGuard filters | AdGuard Knowledge Base
- 필터 규칙 작성법: How to create your own ad filters | AdGuard KB
문서를 숙지했지만, 실제 업무에 적용하는 것은 또 다른 문제라 하나하나 직접 물어봐야 했다. 대부분의 기존 팀 멤버는 몇 년 동안 이 일에 숙련되어 있어3 많으면 1시간에 10개 이상의 티켓을 처리하고 있다. 보통은 수정 사항을 리뷰 없이 master 브랜치에 바로 반영하지만, 나는 필터 유지보수 경험이 없어서 아직은 티켓마다 질문을 하고 PR 리뷰를 받아 이슈를 해결하고 있다.
업무 흐름
필터 유지보수는 순전히 경험의 양으로 판단력이 길러지는 일이다. 사이트마다 광고 구조가 다르고, 같은 이슈라도 환경에 따라 원인이 달라지기 때문이다. 그래서 입사 후 필터 유지보수를 맡으며 지난 5년간 접속한 것보다 더 많은 웹 사이트를 둘러본 것 같다.
이슈는 GitHub으로 접수되고, 수정 사항은 이슈가 들어온 저장소의 master 브랜치에 바로 반영된다. 팀의 핵심 업무는 사용자가 제보한 이슈를 받아 근본 원인을 찾고, 그에 맞게 필터 규칙을 작성하거나 고치는 것이다. 다루는 이슈는 아래 카테고리로 나뉜다.
- 광고 및 차단 오류: 새로 등장한 광고, 잘못된 차단, 광고 필터로 인한 사이트 깨짐 등
- 안티 애드블록(anti-adblock): 웹 서비스에서 광고 차단을 감지해서 이용을 막는 장벽
- 방해 요소(annoyances): 쿠키 동의 창, 모바일 앱 설치 유도, 팝업 등. 광고와는 별도의 옵트인(opt-in) 필터로 관리되어 각각 따로 활성화할 수 있다.
- 개인정보 보호: 애널리틱스와 트래커
제보된 이슈를 여러 환경에서 재현하는 것이 업무의 중심이고, 함께 차단해야 할 다른 요소는 없는지 살피는 것까지 팀에서 기대하는 몫이다. 그래서 제보 검토 → 환경별 재현 → 원인 파악 → 수정 적용을 계속 반복하며 일하고 있다.
입사 전에는 방해 요소 필터라는 카테고리가 있는 줄도 몰랐다. AdGuard를 쓰지 않더라도 이 필터만큼은 구독해서 쓰라고 주변에 추천하고 싶다.
테스트 환경 마련하기
수습 기간(probation)이 끝날 때까지는 테스트 기기를 직접 마련해야 했다. 재현해야 하는 제품군은 다음과 같다.
- AdGuard for Mac, AdGuard Mini for Mac (Safari)
- AdGuard for Windows
- AdGuard for Android, AdGuard Content Blocker
- AdGuard for iOS
- AdGuard Public DNS

가장 기억에 남는 사례는 샤오미 로봇 청소기 앱의 버그 제보(AdguardFilters#228288)다.
로봇 청소기가 없어서 기기를 가진 지인을 찾아 재현을 부탁했다.
필터 데브옵스 업무
처음 연락을 받은 계기는, 내가 공개해 둔 오픈소스 작업을 보고 필터 팀의 JavaScript 관련 업무를 맡을 수 있을 것 같다는 이유였다.
AdGuard 제품이 구독하는 필터 목록은 전용 레지스트리 저장소를 통해 제공된다. 레지스트리는 매시간 메인 필터 저장소와 서드파티 필터의 내용을 새로 받아와 원격으로 빌드하고, 빌드 결과는 모바일 플랫폼을 위해 크기를 줄이는 등 전용 컴파일러를 거쳐 CDN에 배포된다.
온보딩 과제는 필터 통계 데이터를 로컬에서 내려받아 레지스트리의 오프라인 빌드를 지원하는 작업이었다(FiltersRegistry#1220). 코드끼리 비교하기만 하면 되는 쉬운 과제라고 안내받았지만, 실제로는 AdGuard 제품 전반에 쓰이는 위 배포 파이프라인 전체를 이해해야 했다.
혼자서 작업하다 벽에 부딪혀, 이 코드베이스를 관리하던 브라우저 확장 팀에 도움을 청해 온보딩을 받았다. 결국 4월에 시작한 작업은 9월 초에 완료되었는데, 도중에 아파서 쉰 기간을 빼면 3달 정도 걸렸다.
지금은 필터 레지스트리와 컴파일러 유지보수에 참여하며 몇 가지 백로그를 해결하고 있다.
마치며 — 디지털 광고와 사용자 추적
우연히 Google 테이크아웃(Google Takeout)으로 내 기록을 확인해 본 적이 있는데, 자사 마케팅에 쓸 수 있는 수많은 기록을 실시간으로 수집하고 있어 놀랐다.
디지털 마케팅에서 사용자 데이터 수집은 떼려야 뗄 수 없다. Google, Facebook 같은 광고 제공자는 사용자 추적을 바탕으로 광고를 큐레이션하고, 사용자가 유심히 본 광고에 따라 추천하는 광고도 달라진다.
누가 먼저였는지는 더 이상 중요하지 않다. 광고는 나를 추적하고, 나는 데이터를 내주며 광고를 받는다. 그래서 필터 유지보수자의 역할은 광고 차단에 그치지 않고, 애널리틱스와 사용자 추적 서버를 찾아 막는 일까지 이어진다.
추천하고 싶은 영상으로 They’re even tracking HDMI, LG Isn’t the Only TV Company Spying on You - RTINGS R&D가 있다. 지난 9월에는 LG TV의 ACR(Automatic Content Recognition, 자동 콘텐츠 인식)이 HDMI로 연결된 기기의 콘텐츠까지 식별할 수 있다는 조사 결과가 공개되어 논란이 되었다.4
광고는 사용자 행동 데이터를 바탕으로 운영되는데, 영상 속에서 광고가 내장되지 않은 TV를 수소문해 보니 달랑 하나밖에 없었다고 한다. 블랙박스 상태인 ACR의 네트워크 패턴을 구별해 내는 테스트 과정이5 광고 차단 필터 엔지니어로서 내가 일하는 방식과 비슷해서 흥미롭게 봤다.
이전에는 브라우징 보호를 위해 여러 Firefox 개인정보 보호·보안 추천 애드온을 썼는데, 지금은 AdGuard로 대체해서 쓰고 있다. 시스템 수준에서 동작하는 설치형 제품이라 여러 브라우저와 애플리케이션에 필터링이 똑같이 적용되는 점이 편하다. 유저스크립트를 지원하는 것도 좋다.
필터와 그 뒤의 인프라는 모두 오픈소스 소프트웨어로 투명하게 관리되고 있다. 대부분의 AdGuard 제품도 마찬가지이며, 다만 CoreLibs와 같은 일부 내부 컴포넌트는 예외다. 또한 GitHub의
adblock신텍스 하이라이팅 기능은 AdGuard의 기여로 추가되었다. (github/linguist#5968) ↩︎일부 동료는 EasyList, uAssets 같은 오픈소스 필터 프로젝트에 참여하고 있고, uBlock Origin(uBO) 조직의 구성원이기도 하다. — PiQuark6046, ghajini, ntnguyen1234 ↩︎
LG smart TVs caught logging audio with screen off and snooping on local devices - Notebookcheck News라고 Gamers Nexus와 Level1Techs의 조사를 인용해, LG OLED TV의 ACR이 HDMI로 연결된 기기의 콘텐츠도 식별할 수 있다고 보고한 기사를 처음 접했다. ↩︎
How we tested (1:19): We set up every device twice, once with ACR(Automatic Content Recognition) enabled and once with it disabled, and captured its network traffic using Wireshark. Because that traffic is encrypted we couldn’t see the exact data being sent, but we could compare destination host names, timing, traffic volume, and changes in network behavior. So, we started looking for ACR related traffic patterns. ↩︎