방문자를 기록하지 않는 경우와 봇으로 기록하는 경우

방문 수집을 처음 붙였을 때는 새로고침과 자동 요청까지 섞여 숫자가 커지는 문제가 있었습니다. 이후 경로 제외와 봇 표시를 추가했지만, 초기 예제만 읽으면 봇을 전부 차단하거나 로그에서 삭제하는 것으로 오해할 수 있습니다. 현재 visitor.py와 미들웨어에서는 수집 대상 제외 → 반복 기록 억제 → 봇 분류 후 저장을 구분합니다.

이 글은 2026-09-23 코드 기준입니다. 실제 운영 로그의 이용자를 식별하거나 검색엔진 접근을 막는 절차가 아니라, 통계에 어떤 요청이 들어가는지 설명합니다.

요청 제외 조건을 먼저 적용

should_track_request(request, response)는 다음 경우 수집하지 않습니다.

요청 사례 수집 여부 이유
익명 사용자의 일반 글 GET, 200 다음 단계 진행 기본 수집 후보
일반 글 HEAD, 200 다음 단계 진행 현재 GET과 HEAD 허용
일반 글 POST, 200 제외 요청 메서드 조건
존재하지 않는 글 GET, 404 제외 응답 코드 400 이상
로그인한 staff의 일반 글 GET 제외 관리자 계정 조건
/manager/, /static/ 아래 경로 제외 경로 조건

관리자 URL을 제외하는 것과 관리자 계정의 일반 글 방문을 제외하는 것은 별도 조건입니다. 또 현재 조건은 400 미만 응답을 허용하므로 3xx 리디렉션까지 자동 제외한다고 설명할 수 없습니다.

이미지·CSS·JS·PDF 등의 파일 확장자와 /robots.txt, /sitemap.xml, /ads.txt, /health/도 제외합니다. 목록은 정확한 경로나 접두사로 비교하므로 /admin/과 /admin처럼 슬래시가 다른 요청은 같은 분기라고 가정하지 않습니다.

같은 화면을 새로고침하면 어떻게 될까

현재 방문 식별자는 winj_visitor_id 쿠키를 사용합니다. 최근 30초 안에 같은 식별자와 같은 경로가 저장돼 있으면 추가 로그를 만들지 않습니다. 식별자가 없는 과거 형식의 기록은 IP·User-Agent·경로를 함께 비교하는 대체 검사도 있습니다.

예를 들어 같은 브라우저가 /sample-post/를 연 뒤 10초 후 새로고침하면 보통 로그 한 건으로 남습니다. 다른 경로로 이동하거나 다른 방문 식별자로 접속하면 별도 기록 대상입니다. 쿠키를 지우거나 차단하면 같은 사람의 요청도 다르게 집계될 수 있습니다.

그 전에 같은 IP의 최근 1분 저장 로그 수가 30보다 많으면 기록을 건너뜁니다. 이는 모든 네트워크 요청 수를 세는 방화벽이 아니며, 서비스 접근을 차단하지도 않습니다. 회사·학교처럼 IP를 공유하는 환경의 방문도 영향을 받을 수 있습니다.

User-Agent는 분류 단서이며 신원 증명이 아님

현재 봇 판별은 User-Agent의 소문자 문자열에 지정 키워드가 포함되는지 봅니다. 빈 값, Googlebot, curl, python-requests, 일부 모니터링·자동화 도구 이름은 봇으로 분류됩니다. 일반 브라우저 모양의 문자열은 이 검사에 걸리지 않을 수 있습니다.

봇 요청도 앞선 필터를 통과하면 is_bot=True로 저장합니다. 공개 방문자 수는 봇으로 표시된 로그를 제외해 계산합니다. 반대로 요청 제외 단계에서 빠진 기록은 저장 자체가 되지 않으므로, 봇 로그를 따로 보더라도 전체 요청량을 복원할 수 없습니다.

키워드가 없다는 이유로 실제 사람임을 보장하지 않고, 키워드가 있다는 이유만으로 검색엔진의 공식 봇임을 증명하지 않습니다. Google 요청의 신원을 확인해야 할 때는 Google의 검증 안내에 나온 IP 범위 또는 DNS 확인 절차와 구분해야 합니다.

통계를 바꾸기 전에 남길 점검 기록

필터를 조정할 때는 요청 메서드, 응답 코드, 경로, 관리자 여부, User-Agent 분류, 중복 여부를 가상 요청으로 나누어 확인합니다. 같은 날짜의 숫자가 달라졌다는 사실만으로 사람 방문이 늘거나 줄었다고 판단하면 원인을 놓칠 수 있습니다.

IP는 현재 X-Forwarded-For의 첫 값을 우선 사용합니다. 프록시가 해당 헤더를 신뢰할 수 있게 구성됐는지는 별도 확인이 필요합니다. 또한 수집에서 제외되더라도 미들웨어의 방문 식별 쿠키 생성 흐름까지 자동으로 없어지는 것은 아닙니다.

로그에는 IP·User-Agent·유입 경로가 포함되므로 외부에 원문을 붙이지 않고 가상 값으로 재현합니다. 필터 변경은 과거 로그를 자동 재분류하지 않습니다. 저장된 숫자의 의미는 방문자 통계 숫자 읽기, 전체 구조는 Django 방문 통계 기록과 함께 확인할 수 있습니다.