[REFACTOR] URL 분석 공통 콘텐츠 탐지 정확도 개선#31
Conversation
| "lxml>=5.3.0", | ||
| "cachetools>=5.5.0", | ||
| "openai>=1.60.0", | ||
| "playwright>=1.45.0", |
There was a problem hiding this comment.
playwright가 필수 의존성으로 추가 문제
render.py에서는 ImportError를 잡아 graceful degradation하는데, 정작 설치를 강제하고 있는 것으로 보입니다.
Playwright는 Chromium 바이너리까지 포함하므로 이미지 크기가 수백 MB 늘어납니다.
optional-dependencies로 이동하는 게 어떨까 제안 드립니다.
[project.optional-dependencies]
render = ["playwright>=1.45.0"]
There was a problem hiding this comment.
넵 확인했습니다! render.py가 Playwright 미설치 시 playwright_unavailable로 graceful degradation하도록 되어 있어서, playwright를 기본 dependencies에서 제거하고 [project.optional-dependencies].render로 이동했습니다.
렌더링 분석이 필요한 환경에서는 .[render]로 설치하는 방식으로 분리했습니다.
| _MAX_CTA_TEXTS = 40 | ||
| _MAX_DOWNLOAD_LINKS = 40 | ||
| _RISKY_DOWNLOAD_EXTENSIONS: frozenset[str] = frozenset( | ||
| {".apk", ".ipa", ".exe", ".msi", ".dmg", ".scr", ".bat", ".cmd", ".js", ".vbs"} |
There was a problem hiding this comment.
.js 위험 확장자 오탐 문제
.js는 정상 웹사이트 모든 <script src="..."> 로드에서 나타난다고 합니다.
<a href="/bundle.js"> 형태로 링크된 경우 RISKY_DOWNLOAD_LINK 시그널이 발생합니다.
실제 위협 벡터인 APK/EXE/BAT류와 성격이 다르다고 합니다.
js를 목록에서 제거하거나, <a> 태그의 download 속성이 있는 경우에만 적용하는 조건을 추가하는 게 어떨까 합니다.
다만 저도 이 부분에 대해서는 잘 알지 못하기 때문에 리뷰가 타당한다고 생각하시면 반영하면 좋을 거 같습니다!
There was a problem hiding this comment.
넵 맞습니다! 일반 .js 링크는 정상 사이트의 번들 파일에서도 흔하게 노출될 수 있어서 RISKY_DOWNLOAD_LINK 대상에서 제외했습니다.
대신 <a download href="...js">처럼 명시적인 다운로드 의도가 있는 .js 링크만 위험 다운로드 후보로 유지했고, 해당 케이스에 대한 테스트도 추가했습니다.
| _render_semaphore: asyncio.Semaphore | None = None | ||
|
|
||
|
|
||
| def _get_render_semaphore() -> asyncio.Semaphore: |
There was a problem hiding this comment.
전역 세마포어가 이벤트 루프에 묶임 문제
asyncio.Semaphore는 생성 시점의 이벤트 루프에 묶입니다.
pytest-asyncio는 테스트마다 새 루프를 만들기 때문에 모듈 재로드 없이 두 번째 테스트부터 "Future
attached to a different loop" 오류가 발생할 수 있습니다.
asyncio.Semaphore를 anyio.Semaphore로 교체하거나,
함수 진입 시 루프를 비교해 무효 시 재생성하는 방어 로직을 넣으면 어떨까 제안 드립니다.
There was a problem hiding this comment.
asyncio.Semaphore를 전역으로 재사용하지 않고, 현재 running loop를 저장한 뒤 루프가 바뀌면 semaphore를 재생성하도록 수정했습니다.
pytest처럼 테스트마다 이벤트 루프가 바뀌는 환경에서도 기존 loop에 묶인 semaphore를 재사용하지 않도록 회귀 테스트를 추가했습니다.
요약
URL 콘텐츠 분석 정확도를 높이기 위해 공통
content_analyzer계층을 보강했습니다.기존에는 정적 HTML에서 title, password input, 이미지 alt, meta refresh, 외부 링크 비율 등을 중심으로 판단했습니다.
이번 변경에서는 이미 가져온 HTML에서 더 많은 고신호 정보를 추출하고, 정적 HTML만으로 부족한 SPA/동적 페이지는 조건부로 렌더링 분석까지 수행합니다.
주요 변경 내용은 다음과 같습니다.
HTML 정적 추출 피처 확장
로컬 룰 점수화 보강
OpenAI 프롬프트 컨텍스트 개선
조건부 렌더링 정밀 분석 추가
precision_analysis_used,precision_analysis_error,RENDERED_DOM_ANALYZED를 노출탐지 성능 평가 메트릭 추가
성능 저하를 줄이기 위해 렌더링 분석은 모든 URL에 적용하지 않고, 정적 분석만으로 부족하거나 의심 신호가 있는 경우에만 실행됩니다.
(실제 렌더링 분석을 사용하려면 배포 환경에서 Chromium 설치가 필요)
연관 이슈 및 Close 할 이슈
close #29
Pull Request 체크리스트
TODO
테스트
api/test_stages.py -q