확장프로그램이 바꿔친 접속주소를 잡아낸 하루: 최신주소가 계속 다른 곳으로 열릴 때
즐겨찾기에 저장한 토토사이트 주소가 누를 때마다 낯선 페이지로 넘어간 실제 사례를 따라가며, 도메인 변경이 아니라 브라우저 확장프로그램이 접속주소를 바꿔치기한 정황을 어떻게 좁혀냈는지 정리한 기록이다. 최신주소를 다시 받기 전에 내 브라우저부터 의심해야 하는 이유를 담았다.
같은 즐겨찾기를 눌렀는데 매번 다른 화면이 열렸다
3월 마지막 주에 지인의 노트북을 봐준 일이 있다. 증상은 단순했다. 넉 달 전에 저장해 둔 토토사이트 주소를 즐겨찾기에서 누르면 0.5초쯤 익숙한 로고가 스치듯 보이다가, 곧바로 처음 보는 홍보 페이지로 넘어갔다. 다섯 번을 눌러 다섯 번 모두 같은 식이었는데, 도착한 곳은 세 번은 한 도메인, 두 번은 또 다른 도메인으로 갈렸다. 본인은 사이트가 또 도메인 변경을 했다고 판단해 커뮤니티에서 받은 최신주소 후보를 세 개나 새로 저장해 둔 상태였다.
여기서 이상한 점은 도착지가 매번 달랐다는 것이다. 실제로 운영 도메인이 바뀌면 옛 주소는 보통 한 곳으로만 넘어간다. 새 주소가 하나이기 때문이다. 그런데 같은 출발점에서 도착지가 둘 이상으로 갈린다면, 넘겨주는 주체가 사이트가 아니라 중간에 끼어든 무언가일 가능성이 커진다. 도메인 변경을 의심하기 전에 이 갈림 현상 자체를 단서로 삼아야 했다.
그래서 첫 30분은 새 최신주소를 찾는 데 쓰지 않았다. 대신 같은 노트북에서 검색엔진, 뉴스 사이트, 쇼핑몰을 차례로 열어 보며 다른 곳에서도 비슷한 일이 벌어지는지 확인했다. 쇼핑몰 두 곳에서 상품 페이지를 열 때 잠깐 흰 화면이 끼어드는 게 보였고, 그 순간 문제의 범위가 특정 사이트 하나에서 브라우저 전체로 넓어졌다.
도메인 변경부터 의심했지만 다른 기기에서는 멀쩡했다
같은 집 안에서 휴대폰과 태블릿으로 동일한 접속주소를 입력해 봤다. 두 기기 모두 원래 화면이 정상적으로 떴고, 중간에 낯선 페이지가 끼어드는 일도 없었다. 같은 와이파이, 같은 통신망, 같은 주소인데 노트북에서만 다르게 열린다면 남는 변수는 그 노트북의 브라우저 환경뿐이다. 이 대조 하나로 도메인 변경 가능성은 사실상 접었다.
다만 여기서 흔한 착각이 하나 있다. 다른 기기에서 잘 열린다고 해서 지금 쓰는 접속주소가 진짜라는 뜻은 아니다. 가짜 주소를 세 기기에서 열면 세 기기 모두 똑같이 가짜 화면이 뜬다. 기기 간 대조는 주소의 진위가 아니라 문제의 위치를 알려주는 실험이다. 그래서 이 단계에서는 어디가 고장 났는지만 좁히고, 주소 자체의 진위 판정은 뒤로 미뤄 두었다.
주소창에 남은 최종 URL과 리다이렉트 흔적 읽기
다음으로 한 일은 넘어간 뒤 주소창을 그대로 복사해 메모장에 붙여 넣는 것이었다. 눈으로만 보면 도메인만 읽고 넘어가기 쉬운데, 붙여 넣으니 주소 뒤에 물음표로 시작하는 꼬리표가 60자 넘게 붙어 있었다. 그 안에는 광고 추적에 쓰이는 식별자로 보이는 문자열과, 원래 누르려던 도메인이 통째로 값으로 들어간 항목이 함께 있었다. 내 출발지 주소가 다른 서버에 그대로 전달되고 있었다는 뜻이다.
브라우저 개발자 도구의 네트워크 기록을 켜고 다시 눌러 보니 요청이 세 단계로 이어졌다. 즐겨찾기의 주소로 한 번, 처음 듣는 중계 도메인으로 한 번, 마지막 홍보 페이지로 한 번. 중간 단계는 응답이 0.2초도 걸리지 않는 빈 페이지였고 상태 코드는 302였다. 사이트가 진짜 이사를 갔다면 영구 이전을 뜻하는 301이 쓰이는 경우가 많고, 무엇보다 중계 도메인이 매번 같아야 한다. 여기서는 두 번째 단계의 도메인이 시도할 때마다 달라졌다.
기록을 세 번 더 남겨 비교했더니 중계 도메인은 총 네 개가 돌아가며 등장했다. 네 곳 모두 등록된 지 40일이 안 된 신규 도메인이었다. 이 시점에서 결론은 거의 정해졌다. 누군가가 내 클릭을 가로채 광고 수익이 붙은 경로로 팔아넘기고 있었고, 그 과정에서 원래 가려던 접속주소는 껍데기로만 쓰이고 있었다.
시크릿 창이 정상이었다는 사실을 과신하지 않은 이유
시크릿 창에서 같은 주소를 열자 문제가 사라졌다. 여기서 곧장 확장프로그램을 범인으로 지목하고 싶어지지만, 그 판단은 이르다. 시크릿 창은 확장만 빠지는 공간이 아니라 쿠키, 캐시, 저장된 세션, 서비스워커까지 함께 빠지는 공간이다. 오래된 캐시에 남은 잘못된 스크립트나, 예전에 허용해 둔 알림 권한이 원인이어도 시크릿에서는 똑같이 증상이 사라진다.
실제로 확장이 아니라 캐시가 원인이었던 사례를 본 적이 있다. 그때는 확장을 전부 지우고도 증상이 남아 있었고, 저장된 데이터를 비우고 나서야 해결됐다. 그러니 시크릿 창 결과는 확장이 범인이라는 증거가 아니라 프로필 안에 원인이 있다는 신호로만 읽어야 한다. 범위를 프로필 내부로 좁혔다는 것 자체가 큰 진전이긴 하다.
새 프로필과 확장 하나씩 켜기, 25분짜리 소거법
정확히 가르려면 변수를 하나씩만 바꿔야 한다. 그래서 브라우저에 새 프로필을 만들었다. 확장도 없고 캐시도 없는 깨끗한 상태에서 문제의 주소를 열었더니 정상이었다. 그다음 원래 프로필로 돌아가 설치된 확장 다섯 개를 모두 끄고 열었더니 역시 정상이었다. 이 두 결과를 붙이면 캐시나 쿠키가 아니라 확장 쪽이라는 게 드러난다.
이제 다섯 개를 하나씩 켜면서 매번 주소를 열어 확인했다. 켜고 끄는 데 한 번에 3분이 채 걸리지 않았고, 전체 25분 만에 범인이 나왔다. 세 번째로 켠 확장을 활성화한 순간 다시 낯선 페이지로 넘어갔고, 그 확장만 다시 끄자 증상이 사라졌다. 같은 절차를 한 번 더 반복해 재현되는지 확인했는데 결과는 동일했다. 한 번 재현으로 끝내지 않은 건, 광고 삽입형 코드가 매번 작동하지 않고 일정 확률로만 튀어나오는 경우가 있기 때문이다.
범인은 반년 전에 설치한 환율 확장의 주인 교체였다
지목된 확장은 환율을 자동으로 변환해 주는 도구였다. 여섯 달 전 해외 직구를 하며 설치했고, 그동안 아무 문제가 없었다. 확장 상세 정보를 열어 보니 버전이 2.1.4에서 3.0.0으로 올라간 기록이 있었고, 업데이트 시점은 3주 전이었다. 증상이 시작된 시기와 대략 맞아떨어졌다. 요구 권한 항목에는 모든 사이트의 데이터 읽기 및 변경, 그리고 북마크 읽기 및 변경이 들어 있었다.
환율 변환에 북마크 권한이 필요할 이유는 없다. 이런 확장은 처음부터 나쁜 코드로 시작하기보다, 사용자를 어느 정도 모은 뒤 개발자 계정이 다른 손에 넘어가면서 조용히 성격이 바뀌는 경우가 있다. 사용자 입장에서는 설치한 적도 없는 프로그램이 어느 날 갑자기 생긴 게 아니라, 믿고 쓰던 도구가 등 뒤에서 다른 일을 시작한 셈이다. 자동 업데이트는 이 변화를 알려주지 않는다.
확장을 삭제한 뒤 같은 주소를 열 번 눌러 봤고, 중계 도메인은 한 번도 나타나지 않았다. 네트워크 기록에도 요청은 한 단계로만 남았다. 이 시점에서 증상 자체는 끝났지만, 정리해야 할 뒷일이 하나 더 남아 있었다.
즐겨찾기 자체가 편집돼 있었던 두 번째 문제
확장을 지운 뒤 즐겨찾기 41개를 편집창에서 하나씩 열어 실제 저장된 URL을 확인했다. 목록에서는 이름만 보이기 때문에 표시된 제목이 그대로여도 안쪽 주소가 다를 수 있다. 확인해 보니 두 개가 원래 적어 둔 것과 달랐다. 도메인 앞부분에 짧은 문자열이 덧붙어 있었고, 뒤에는 아까 본 것과 같은 형태의 추적 꼬리표가 붙어 있었다.
이건 클릭을 가로채는 것과는 성격이 다르다. 북마크 변경 권한이 있으면 확장을 지운 뒤에도 이미 고쳐진 주소는 그대로 남는다. 확장만 삭제하고 끝냈다면 두 개의 오염된 즐겨찾기는 계속 살아 있었을 것이고, 몇 주 뒤 다시 이상한 페이지가 열렸을 때 원인을 찾기가 훨씬 어려웠을 것이다. 확장 문제를 정리할 때 북마크 원문까지 확인하는 사람은 드문데, 실제로 손해를 만드는 건 이쪽이다.
추가로 주소창 자동완성에도 중계 도메인 세 개가 후보로 남아 있었다. 한 글자만 입력해도 위쪽에 뜨는 상태라, 나중에 급하게 입력하다 잘못 선택할 여지가 있었다. 자동완성 목록에서 해당 항목을 지우고, 방문 기록에서도 중계 도메인을 검색해 함께 삭제했다.
정리 뒤 최신주소를 다시 세운 순서
브라우저가 깨끗해진 다음에야 주소 자체를 다시 점검할 차례가 됐다. 앞서 커뮤니티에서 급하게 받아 둔 후보 세 개는 문제 진단 중에 저장된 것이라 출처가 불분명했고, 그중 하나는 등록 이력이 두 달도 되지 않았다. 결국 후보 전부를 지우고 원래 쓰던 접속주소 한 개만 남긴 뒤, 그 주소가 지금도 유효한지 확인하는 절차를 새로 밟았다.
- 편집창에서 URL 원문을 열어 문자 하나씩 대조하고 꼬리표를 잘라 낸다
- 주소를 눌렀을 때 요청이 한 단계로 끝나는지 다시 확인한다
- 휴대폰 등 다른 기기에서 같은 주소를 입력해 같은 화면이 뜨는지 본다
- 정리된 주소 하나만 남기고 나머지 후보는 지운 뒤 즐겨찾기를 내보내 파일로 보관한다
이 과정을 마치는 데 15분이 걸렸다. 중요한 건 순서다. 브라우저가 오염된 상태에서 아무리 좋은 최신주소를 구해 와도, 클릭하는 순간 다른 곳으로 끌려가면 그 주소의 진위는 확인할 방법이 없다. 환경을 먼저 정리하고 주소를 검증해야 결과를 믿을 수 있다.
확장 권한을 반년마다 다시 보는 습관
정리를 마치고 남은 확장 네 개의 권한을 함께 살펴봤다. 두 개는 모든 사이트에 접근할 수 있는 상태였는데, 실제로는 특정 사이트에서만 쓰는 도구였다. 브라우저 설정에서 사이트 접근 범위를 클릭할 때만으로 바꿔 두면, 평소에는 페이지 내용을 건드리지 못한다. 이 설정 하나가 같은 사고의 재발 가능성을 크게 줄인다.
주기도 정해 뒀다. 반년에 한 번, 확장 목록을 열어 쓰지 않는 것은 지우고 권한이 늘어난 것이 있는지 확인하기로 했다. 확장은 설치할 때만 신경 쓰고 이후에는 존재를 잊게 되는 물건이라, 점검 시점을 달력에 걸어 두지 않으면 영영 다시 보지 않는다. 즐겨찾기 파일 내보내기도 같은 날 함께 하기로 묶어 두면 잊을 확률이 낮아진다.
이 사례에서 남은 한 가지 의문
끝내 확인하지 못한 게 하나 있다. 중계 도메인으로 넘어가는 동안 원래 가려던 접속주소가 그쪽 서버에 전달됐다는 건 기록으로 확인했지만, 그 정보가 어디에 어떻게 쌓였는지는 알 수 없다. 광고 통계로만 쓰였을 수도 있고, 어떤 주소가 얼마나 눌리는지를 수집하는 쪽에 넘어갔을 수도 있다. 알 수 없는 건 알 수 없다고 두는 편이 낫지만, 그 불확실성 때문에라도 주소를 다루는 브라우저는 깨끗하게 유지할 이유가 생긴다.
지인은 그날 이후 즐겨찾기를 한 폴더로 줄이고, 새 주소를 받으면 편집창에서 원문을 한 번 읽어 보는 습관을 들였다. 증상이 사라진 것보다, 화면이 이상하게 열릴 때 사이트 탓부터 하지 않게 된 게 더 큰 변화였다. 접속주소가 매번 다른 곳으로 열린다면 그건 주소를 새로 구할 신호가 아니라, 지금 쓰는 브라우저를 먼저 들여다볼 신호다.