광고 다 떼고, 디자인 다 갈아엎은 날
목차
배포 FAIL 로그가 아침 첫 화면이었다. 처음엔 막연히 네트워크 문제겠거니 했는데, 그 "막연함"이 시간을 제일 많이 잡아먹는다는 걸 이날도 다시 확인했다. 서버에 직접 들어가서 /var/log/auth.log랑 fail2ban 로그를 나란히 열어보고 나서야 원인이 보였다. fail2ban이 SSH pubkey 인증 시도 자체를 공격으로 분류해서 차단하고 있었다.
fail2ban은 기본적으로 인증 실패 패턴을 카운팅해서 임계치 초과 시 IP를 밴하는 구조다. 문제는 pubkey 인증이 비밀번호 인증보다 먼저 시도되는 SSH 협상 흐름에서, 설정에 따라 그 첫 시도가 "실패"로 집계될 수 있다는 것. 배포 파이프라인 쪽 IP가 잘못 밴 목록에 올라가 있으니 SSH 연결 자체가 첫 시도에서 끊기고, CI 입장에서는 그냥 타임아웃 FAIL이었다. 어이없을 만큼 단순한 구조였는데 로그 안 보고 머릿속으로 추론만 하다 보면 절대 못 찾는 종류의 버그다. 실측이 답이라는 걸 또 한 번 배웠다.
광고 로더 전수 제거
fail2ban 고치고 나서는 광고 제거 스윕이 거의 하루를 가져갔다. gov, insurance, funeral, tools, 홈 — 쿠팡 파트너스 스크립트, 모비온 태그, AdSense 로더를 사이트별로 하나씩 뽑아냈다.
일괄 처리 스크립트를 먼저 짜볼까 싶었는데, 사이트마다 광고 삽입 방식이 달랐다. 어떤 데는 레이아웃 컴포넌트에 직접 박혀 있고, 어떤 데는 훅으로 관리되고, 또 어떤 데는 _document 레벨에 글로벌로 올라가 있었다. 구조를 다 파악하기 전에 자동화를 짜면 오히려 더 오래 걸린다 싶어서 그냥 손으로 들어갔다.
반복 작업이지만 끝내고 나서 코드베이스가 눈에 띄게 가벼워진 느낌이 있었다. 외부 스크립트 로더가 빠지면 초기 번들 파싱도 줄고, CSP 설정도 단순해지고, 로드 타임도 개선된다. 수치로 바로 보이지 않아도 "덜어냄" 자체에 나름의 쾌감이 있다.
Gemini 썸네일 파이프라인 첫 실전
디자인 쪽은 pet, diet, job, formpack을 거의 동시에 갈아엎었다. 이 중에 오늘 제일 뿌듯했던 건 pet 쪽 작업이다.
pet 사이트를 텍스트 카드 UI로 전환하면서, 썸네일을 Gemini로 자동 생성하는 파이프라인을 붙였다. 흐름은 대략 이렇다.
콘텐츠 메타 추출
→ Gemini API에 프롬프트 전달 (카테고리 + 키워드 기반)
→ 이미지 생성 후 스토리지 업로드
→ featuredImage 필드에 URL 바인딩
→ 발행 시 자동 적용
AI 이미지 금지 룰이 해제된 뒤로 첫 실전 적용이라 솔직히 좀 긴장했다. 특히 featuredImage 연결 부분 — 생성된 이미지 URL을 CMS 쪽 스키마에 제대로 밀어 넣는지, 빌드 단계에서 누락 없이 잡히는지. 결과적으로 깔끔하게 됐다. 파이프라인이 일관되게 돌아가면, 앞으로 신규 글 발행할 때마다 썸네일 고민을 하나 덜 수 있다.
버그는 연쇄로 나온다
bot 쪽에서 메타라벨 본문 누출 버그를 diet 고치다가 발견했다. 메타용으로 관리하는 라벨 텍스트가 실제 렌더링 본문에 같이 흘러나오는 패턴이었는데, diet만의 문제가 아니었다. lotto, funeral, pet 쪽에 같은 구조가 있다는 게 코드 보면서 바로 보여서 한 번에 같이 처리했다.
이게 좀 반복되는 패턴인데 — 하나 고치다 보면 연쇄로 나온다. 어차피 건드리는 김에 다 잡는 게 맞다. 나중에 따로 잡으러 들어가면 컨텍스트 다시 세팅하는 비용이 더 크다.
admin 버그들도 쌓아뒀다가 오늘 한꺼번에 처리했다. 그중 제일 부끄러웠던 건 마지막 발행 시간이 음수로 나오는 것 — -381분 전 이런 식으로. 원인은 PUBLISHED 상태 필터링 없이 예약 글의 발행 예정 날짜를 기준으로 경과 시간을 계산하고 있어서였다. 예약 글은 미래 시점이니까 now - futureDate 가 음수가 되는 거고, 그게 그대로 UI에 노출됐다. 필터 한 줄이 빠진 거였는데 그게 사용자 화면에 저렇게 나왔다고 생각하면 좀 민망하다.
예약 글 날짜 표시 오류, 사이드바 활성 상태 동기화 문제도 같이 잡았다. 이런 종류의 admin UI 버그는 기능적으로 치명적이진 않아도 쌓이면 전체 신뢰도를 갉아먹는다. 한꺼번에 정리하길 잘했다.
stats 대시보드에 해외 서버 합산을 추가한 것도 오늘 챙겼다. 그동안 국내 서버 트래픽만 집계되던 구조라, 실제 전체 트래픽 볼 방법이 대시보드에서 없었다. 이제야 숫자가 제대로 보이기 시작했다. 모니터링 도구는 데이터가 완결돼야 의미가 있다 — 일부만 보이면 없는 것만 못할 때가 있다.
내일은 오늘 많이 건드렸으니 점검 위주로 가려고 한다. AdSense 심사 준비 진전시키고, 오늘 수정된 SEO 구조화 데이터가 서치콘솔에서 어떻게 잡히는지 실측 확인할 것.
댓글 0
첫 댓글 달아줘.