본문으로 건너뛰기

SiteStats

이용자에게 보여주는 공개 방문자 통계 플러그인입니다. 운영자 분석용 Analytics와 달리, 사이트 화면에 현재 방문자, 오늘 방문자, 전체 방문자, 인기페이지, 실시간 방문자 현황을 표시합니다.

상태

항목
Layercomposite
TierL1
Statuswip
Version0.1.0
가격Free
카테고리Social

Analytics와의 분리

플러그인목적데이터 흐름
Analytics운영자 분석GA4, Naver Analytics 등 외부 provider로 전송
SiteStats이용자 공개 표시자체 Redis 집계 후 사이트 화면에 표시

SiteStats는 전환 이벤트 분석이나 광고 측정용이 아닙니다. 사이트 방문자에게 "지금 몇 명이 보고 있는지", "인기 페이지가 무엇인지"를 보여주는 소셜 프루프 영역입니다.

기능 토글

feature내용
counters현재 / 오늘 / 전체 방문자
popular_pages인기페이지 Top N
live_feed실시간 방문자 현황
dwell_time평균 체류시간 보조 지표
content_top인기 글 adapter, 후속

설치 / 활성화

프로젝트 composer.json에 SiteStats PSR-4 매핑이 있어야 합니다.

"App\\Plugins\\SiteStats\\": "app/Plugins/SiteStats/src/",
"App\\Plugins\\SiteStats\\Database\\": "app/Plugins/SiteStats/database/",
"App\\Plugins\\SiteStats\\Tests\\": "app/Plugins/SiteStats/tests/"

플러그인 provider가 활성화되면 route, view, lang, config, migration이 등록됩니다.

App\Plugins\SiteStats\Providers\SiteStatsServiceProvider::class

Blade 사용법

레이아웃의 </body> 직전에 beacon을 한 번 넣습니다.

<x-sitestats::beacon />

표시할 위치에 필요한 위젯을 배치합니다.

<x-sitestats::current />
<x-sitestats::today />
<x-sitestats::total />
<x-sitestats::popular :limit="10" />
<x-sitestats::live />

방문자 국가/언어 표시

Core가 요청 단위로 만든 visitor.context를 live feed에 함께 저장합니다.

필드의미
country_codeKR, JP 같은 국가 코드
country_source기본 cloudflare
locale_hint국가 기반 추정 locale
resolved_locale실제 적용된 locale
is_estimatedIP 기반 추정 여부

Cloudflare 프록시가 켜져 있으면 CF-IPCountry 헤더로 국가를 추정합니다. 헤더가 없거나 지원하지 않는 국가면 필드를 비운 채 기존 live feed만 표시합니다.

표시 예:

손님 🇯🇵 JP · ja /bible

이 값은 추정치입니다. VPN, 프록시, 해외 거주자 때문에 실제 언어 선호와 다를 수 있으므로 보안, 권한, 과금 판단에는 사용하지 않습니다.

관련 Core 설정

CORE_VISITOR_COUNTRY_DETECTION=true
CORE_VISITOR_COUNTRY_HEADER=CF-IPCountry
CORE_VISITOR_COUNTRY_SOURCE=cloudflare

국가 기반 locale hint는 ?lang, 로그인 사용자 설정, 세션, 브라우저 Accept-Language보다 낮은 우선순위입니다.

저장 구조

항목저장소
현재 접속자Redis ZSET
오늘/전체 uniqueRedis HyperLogLog
인기페이지Redis ZSET
live feedRedis HASH
누적 스냅샷DB snapshot table

Redis live payload에는 원본 IP를 저장하지 않습니다. 국가 코드는 Core visitor.context에서 정규화된 값만 저장합니다.

보안 / 개인정보

  • beacon POST는 same-origin + CSRF 토큰을 사용합니다.
  • 봇은 JS beacon 미실행 + 서버측 UA 필터로 제외합니다.
  • 원본 IP는 공개 표시용으로 저장하지 않습니다.
  • Redis 키는 tenant key prefix로 분리합니다.

데모 / 문서 링크

  • Platform plugin demo: https://template.codebase.how/platform/plugin-demo/site-stats
  • Plugin Store: https://store.codebase.how/plugins/site-stats
  • 운영 문서: https://docs.codebase.how/operations/visitor-context-site-stats