컨테이너를 로컬에 재현해 규명했다. '컨테이너가 문제'가 아니라 **UA 가 리눅스라고 말하는 것**이 원인이다. 네이버는 리눅스 데스크톱 Chrome 을 HTTP 405 로 거부한다. 실측(같은 이미지·같은 KR 프록시, 서로 다른 IP 3개씩): X11; Linux x86_64 0/3 통과 전부 405 + wtm_captcha (~50KB) Macintosh; Intel Mac 3/3 통과 전부 200 · 6건 · ~1.0MB 안드로이드·아이폰 모바일 0/2 418 '비정상적인 접근'(2.6KB, 회전 무효 하드차단) 프록시 없이 같은 집 IP 로도 호스트 통과 / 컨테이너 차단이 재현돼 IP·게이트웨이는 배제됐다. 맥에서 잘 되던 이유도 이걸로 설명된다. **405 가 열쇠였다** — JS 가 돌기 전에 HTTP 계층에서 거부당한다. 그래서 그동안 의심하던 WebGL·폰트·plugins 는 애초에 원인이 될 수 없었다(확인차 --enable-unsafe-swiftshader 로 WebGL 을 살려봤지만 405 그대로였다). 조치: - services/search/user_agent.py: 리눅스에서만 UA 플랫폼 토큰을 맥으로 치환. Chrome 버전은 `--version` 으로 실제 값을 읽어 유지한다 — 하드코딩하면 컨테이너 Chrome 업데이트 시 UA 와 엔진이 어긋나 그 불일치가 새 봇 신호가 된다. 조회 실패해도 크롤을 막지 않는다. - NaverShopAdapter.mac_ua_on_linux = True (쿠팡은 잘 통과하므로 기본 False 그대로 — 멀쩡한 걸 건드리지 않는다). 맥/윈도우에서는 자동 미적용. - 실제 어댑터로 컨테이너 검증: '생수' 40건, '스페셜티 원두 1kg' 40건 통과. 부수: - fingerprint.judge: WebGL 이 **아예 없는** 경우를 OK 로 흘려보내던 판정 버그 수정(컨테이너 재현 중 발견 — 소프트웨어 렌더링보다 더 튀는 값인데 침묵했다). UA 플랫폼 항목 추가. - docs/operations.md: '미해결' 절을 원인·수치·조치·확인법으로 교체. - fingerprint.py: JS 위장이 이 스택에서 불가능하다는 실측 기록 유지(재시도 방지). 테스트 8건 추가(리눅스에서만 보정·실제 버전 유지·조회 실패 폴백·네이버만 opt-in), 전체 270 passed. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| ai | ||
| naver_hub | ||
| pipeline | ||
| search | ||
| .gitkeep | ||
| admin_service.py | ||
| lps_service.py | ||
| metrics.py | ||