[๐ ] ๋ธ๋ก๊ทธ ํต๊ณ์์ ๋ด ์นด์ดํธ ์ค์ด๊ธฐ
โจ GPT-5.5์ ์์ฝ ใ
Cloudflare Worker ๋ฐฉ๋ฌธ ์ง๊ณ์ ํด๋ผ์ฐ๋ ํฌ๋กค๋ฌ์ ์์ ํค๋๋ฆฌ์ค ์ ๊ทผ์ด ์์ด๋ ๋ฌธ์ ๋ฅผ ์ค์ด๊ธฐ ์ํด, ASN/์กฐ์ง ํํฐ์ visible engagement ์ ํธ๋ฅผ ์ถ๊ฐํ๊ณ ์๋ชป ๋งํ ํต์ ์ฌ ASN์ ํ์ด๋ธ ๊ธฐ๋ก.
ํต๊ณ ์ซ์๊ฐ ๋ค์ ์ด์ํ๋ค.
๊ณต๊ฐ ๋ธ๋ก๊ทธ ํต๊ณ ํ์ด์ง๋ฅผ ๋ถ์ธ ๋ค์๋ ์ ์ด๋ ๋ก์ปฌ ์์ ์ด production ์นด์ดํฐ๋ฅผ ๋๋ฝํ์ง๋ ์๊ฒ ๋๋ค. ๊ทธ๋ฐ๋ฐ ์ด๋ฒ์๋ ๋ค๋ฅธ ๋ฌธ์ ๊ฐ ๋ณด์๋ค.
์ฌ๋์ด ์ฝ์๋ค๊ธฐ์๋ ๋ฆฌ๋ฌ์ด ์ด์ํ ์์ฒญ๋ค์ด ๋ค์ด์๋ค.
ํ์ด์ง๋ฅผ ์ด์๋ง์ ์ฌ๋ฌ ๊ฒฝ๋ก๋ฅผ ํ๊ณ , ๋ธ๋ผ์ฐ์ ์ฒ๋ผ ๋ณด์ด๋ User-Agent๋ฅผ ๋ฌ๊ณ , ๊ทธ๋ฐ๋ฐ ์ค์ ๋
์์ฒ๋ผ ๋จธ๋ฌด๋ ๋๋์ ์์๋ค. ์ ์ ๋ธ๋ก๊ทธ๋ ๊ณต๊ฐ๋์ด ์์ผ๋ ํฌ๋กค๋ฌ๊ฐ ์ค๋ ๊ฑด ๋น์ฐํ๋ค. ๋ฌธ์ ๋ ๊ทธ ํฌ๋กค๋ฌ๊ฐ /track๊น์ง ๋๋ฆฌ๋ฉด ๊ณต๊ฐ ์กฐํ์์ ๋ฐฉ๋ฌธ์ ์๊ฐ ๊ฐ์ด ๋ถํ์ด ์ค๋ฅธ๋ค๋ ์ ์ด์๋ค.
์ฒ์ ๋ฐฉ๋ฌธ์ ์นด์ดํฐ๋ฅผ ๋ถ์ผ ๋๋ ๋ด๊ณผ ์ค๋ณต ๋ฐฉ๋ฌธ์ ์ ๋นํ ๋ง์๋ค๊ณ ์ผ๋ค. ๊ทธ๋ฐ๋ฐ ๋ง์ ์ด์ํด๋ณด๋ โ์ ๋นํโ์ ๊ธฐ์ค์ ์กฐ๊ธ ๋ ์ฌ๋ ค์ผ ํ๋ค.
User-Agent๋ง์ผ๋ก๋ ๋ถ์กฑํ๋ค
๊ธฐ์กด Worker์๋ ๊ธฐ๋ณธ์ ์ธ ๋ด ํ๋ณ์ด ์์๋ค.
bot user-agent
Cloudflare verified bot
Cloudflare bot score
dedupe window
์ด ์ ๋๋ฉด ๋ ธ๊ณจ์ ์ธ ๋ด์ ์ด๋ ์ ๋ ๊ฑธ๋ฆฐ๋ค.
ํ์ง๋ง ๋ชจ๋ ํฌ๋กค๋ฌ๊ฐ bot์ด๋ผ๊ณ ์ ํ User-Agent๋ฅผ ์ฐ์ง๋ ์๋๋ค. ์ด๋ค ์์ฒญ์ ์ผ๋ฐ Chrome์ฒ๋ผ ๋ณด์ธ๋ค. ๊ทธ๋ฌ๋ฉด User-Agent๋ง ๋ณด๊ณ ๋ ์ฌ๋์ธ์ง ์์ ์๋ํ ๋ธ๋ผ์ฐ์ ์ธ์ง ๊ตฌ๋ถํ๊ธฐ ์ด๋ ต๋ค.
Cloudflare๊ฐ ์ฃผ๋ request.cf ์ ๋ณด์๋ ASN๊ณผ ASN organization์ด ์๋ค. ๊ทธ๋์ /track ์์ฒญ์ ๋ฐ์ ๋ ์ด ์ ๋ณด๋ ๋ณด๊ฒ ํ๋ค.
TRACK_BLOCKED_ASNS
TRACK_BLOCKED_AS_ORGS
์ค์ ๊ฐ์ ์์ ํ ๋ฎ์ด์ฐ๊ธฐ๋ณด๋ค, Worker ์์ ๊ธฐ๋ณธ๊ฐ์ ํ๊ฒฝ ๋ณ์ ๊ฐ์ ์ถ๊ฐํ๋ ๋ฐฉ์์ผ๋ก ๋ฐ๊ฟจ๋ค. ๊ธฐ๋ณธ์ผ๋ก ๋ง์์ผ ํ๋ ์ถ์ ์ฝ๋์ ๋จ๊ธฐ๊ณ , ์ด์ ์ค ์๋ก ํ์ธํ ๊ฐ์ ํ๊ฒฝ ๋ณ์๋ก ๋ํ ์ ์๊ฒ ํ๊ธฐ ์ํด์๋ค.
์กฐ์ง๋ช ์ ์ ํํ ๊ฐ์ ๋ฌธ์์ด๋ง ๋น๊ตํ๋ฉด ์ฝํ๋ค.
Huawei Cloud
Huawei-Cloud-HK
Huawei Cloud Singapore POP
Huawei Clouds Singapore
์ด๋ฐ ์์ผ๋ก ํํ์ด ์กฐ๊ธ์ฉ ๋ฌ๋ผ์ง ์ ์๋ค. ๊ทธ๋์ ์กฐ์ง๋ช ๋น๊ต๋ exact match์ contained string์ ๋ ๋ค ํ์ฉํ๋ค. ํ๋์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ฌ๋ฌ ๋ณํ์ ์ก๊ธฐ ์ํ ์ ํ์ด์๋ค.
3์ด visible engagement๋ฅผ ๋ฃ์๋ค
ASN ํํฐ๋ง์ผ๋ก ๋๋ด๋ฉด ๋๋ฌด ๋คํธ์ํฌ ์ค์ฌ์ ๊ท์น์ด ๋๋ค.
์ ์ ๋ ์๋ ํน์ ํต์ ์ฌ๋ ํ์ฌ๋ง ๋ค์ ์์ ์ ์๋ค. ๋ฐ๋๋ก ํฌ๋กค๋ฌ๋ ํํ ๋คํธ์ํฌ์์ ์ฌ ์ ์๋ค. ๊ทธ๋์ ํด๋ผ์ด์ธํธ ์ชฝ ์ ํธ๋ ๊ฐ์ด ๋ด์ผ ํ๋ค.
์ด๋ฒ์ ํด๋ผ์ด์ธํธ๋ ํ์ด์ง๊ฐ ์ค์ ๋ก ๋ณด์ด๋ ์ํ๋ก ์ผ์ ์๊ฐ ์ง๋ ๋ค์๋ง /track์ ๋ณด๋ธ๋ค.
track_delay_seconds = 3
3์ด๋ ๊ธด ์๊ฐ์ด ์๋๋ค. ๊ธ์ ์ฝ์ผ๋ ค๋ ์ฌ๋์๊ฒ๋ ๊ฑฐ์ ๋๊ปด์ง์ง ์๋๋ค. ํ์ง๋ง ํ์ด์ง๋ฅผ ์ด์๋ง์ ๋ฐ๋ก ๋ซ๊ฑฐ๋, ๋ฐฑ๊ทธ๋ผ์ด๋ ํญ์์ ๋์ถฉ DOM๋ง ๊ธ๊ณ ์ง๋๊ฐ๋ ์์ฒญ์ ๊ฑธ๋ฌ๋ผ ์ ์๋ค.
ํด๋ผ์ด์ธํธ๋ /track payload์ ์ด๋ฐ ๊ฐ์ ๊ฐ์ด ๋ณด๋ธ๋ค.
engagementMs
visibilityState
documentHidden
viewportWidth
viewportHeight
Worker๋ ์ด ๊ฐ์ ๋ค์ ๊ฒ์ฆํ๋ค.
ํด๋ผ์ด์ธํธ JS๊ฐ ๊ธฐ๋ค๋ ธ๋ค๊ณ ํด์ ๊ทธ๋๋ก ๋ฏฟ์ง๋ ์๋๋ค. ์๋ฒ ์ชฝ์์ engagementMs๊ฐ ๊ธฐ์ค๋ณด๋ค ์งง์ผ๋ฉด client_visible_too_short๋ก ๋ฌด์ํ๋ค. viewport๊ฐ 0์ด๊ฑฐ๋ ์ด์ํ๋ฉด client_viewport_invalid๋ก ๋ฌด์ํ๋ค.
visible ์ ํธ๋ ์ ํ๊ฐ์ด ์๋์๋ค
์ฒ์ ๊ตฌํ์ ์ฝ๊ฐ ๋์จํ๋ค.
visibilityState์ documentHidden์ด ์์ผ๋ฉด ํ์ธํ๊ณ , ์์ผ๋ฉด ์ง๋๊ฐ ์ ์๋ ๊ตฌ์กฐ์๋ค. ์ด๋ฌ๋ฉด ์ ํด๋ผ์ด์ธํธ๋ ๋ ์๊ฒฉํด์ง์ง๋ง, ํ๋๋ฅผ ๋นผ๊ณ ์ง์ /track์ ์น๋ ์์ฒญ์ ์ฌ์ ํ ๋จ๋๋ค.
๊ทธ๋์ Worker ์กฐ๊ฑด์ ๋ ๋จ๋จํ๊ฒ ๋ฐ๊ฟจ๋ค.
visibilityState === "visible"
documentHidden === false
์ด ๋ ์กฐ๊ฑด์ด ์ ํํ ๋ง์ง ์์ผ๋ฉด client_signal_missing์ผ๋ก ๋ฌด์ํ๋ค.
์ฌ๊ธฐ์ ์ค์ํ ๊ฑด hidden๊ณผ missing์ ๊ฐ์ ๊ณ์ด๋ก ๋ณธ ์ ์ด๋ค. /track์ ๊ณต๊ฐ ์กฐํ์๋ฅผ ์ฌ๋ฆฌ๋ endpoint๋ค. ์ด endpoint์ ๋ค์ด์ค๋ ์์ฒญ์ โ์ ์ ํ์ด์ง์์ ์ ์ ํด๋ผ์ด์ธํธ๊ฐ ๋ณด๋ธ ์์ฒญโ์ด์ด์ผ ํ๋ค. ์ ํธ๊ฐ ์์ผ๋ฉด ๋ด์ค ์ด์ ๊ฐ ์๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก /analytics ์กฐํ๋ ๊ทธ๋๋ก ์ด๋ ค ์์ง๋ง, /track์ ๋ ๊น๋ค๋ก์์ก๋ค.
ํต๊ณ ์ฝ๊ธฐ
-> ๊ณต๊ฐ ๊ฐ๋ฅ
์กฐํ์ ์ฆ๊ฐ
-> production origin
-> visible engagement
-> ์ ์ viewport
-> bot/ASN/org ํํฐ ํต๊ณผ
๋ง๋ ๊ฐ์ ๊ณ์ ์ฌ๊ฒํ ํด์ผ ํ๋ค
์ฐจ๋จ ๋ชฉ๋ก์ ๋ฌด์กฐ๊ฑด ๋ํ๋ฉด ์ ๋๋ค.
ํด๋ผ์ฐ๋ ํฌ๋กค๋ฌ๋ฅผ ์ก์ผ๋ ค๋ค๊ฐ ์ ์ ํต์ ์ฌ ASN๊น์ง ๊ธฐ๋ณธ ์ฐจ๋จ๊ฐ์ ๋ค์ด๊ฐ๋ฉด, ์ค์ ๋ ์ ๊ธฐ๋ก๋ ๋น ์ง ์ ์๋ค. ๊ทธ๋์ ๊ธฐ๋ณธ ์ฐจ๋จ ASN์์ ์๋ชป ๋ค์ด๊ฐ ๊ฐ์ ์ ๊ฑฐํ๋ค.
ํํฐ๋ ๊ฐํ ์๋ก ์ข์ ๋ณด์ด์ง๋ง, ํต๊ณ์์๋ false positive๋ ๋น์ฉ์ด๋ค.
๋ด์ ์ธ๋ฉด ์ซ์๊ฐ ๋ถํ์ด ์ค๋ฅธ๋ค.
์ฌ๋์ ๋ง์ผ๋ฉด ์ค์ ๋
์๋ฅผ ์ง์ด๋ค.
๋ ๋ค ๋ฌธ์ ๋ค.
๊ทธ๋์ ์ด๋ฒ ๊ธฐ์ค์ ์ด๋ ๊ฒ ์ ๋ฆฌํ๋ค.
ํ์คํ ํด๋ผ์ฐ๋/ํฌ๋กค๋ฌ ์ถ์ Worker์์ ๋ง๋๋ค.
ํด๋ผ์ด์ธํธ visible ์ ํธ๋ ํ์๋ก ๋ฐ๋๋ค.
ํต์ ์ฌ์ฒ๋ผ ์ฌ๋ ํธ๋ํฝ์ผ ์ ์๋ ์ถ์ ๊ธฐ๋ณธ ์ฐจ๋จ๊ฐ์ ๋ฃ์ง ์๋๋ค.
์์ฌ์ค๋ฌ์ด ๊ฐ์ ignored_reason์ผ๋ก ๋จ๊ฒจ์ ๋์ค์ ๊ฐ์ฌํ๋ค.
analytics_events์๋ ๋ฌด์๋ ์์ฒญ๋ ์ต์ ์ ๋ณด์ ignored_reason์ ๋จ๊ธด๋ค. ์ด๊ฒ ์์ผ๋ฉด ๋์ค์ ์ซ์๊ฐ ์ ์ค์๋์ง, ๋ฌด์์ด ๋งํ๋์ง ๋ค์ ๋ณผ ์ ์๋ค.
์ซ์๋ ๋ฐ๋ก ๋ณด์ฌ์ผ ํ์ง๋ง ํจ๋ถ๋ก ์ธ๋ฉด ์ ๋๋ค
๋ฐฉ๋ฌธ์ ์นด์ดํฐ๋ ์ด์ํ ๊ท ํ ์์ ์๋ค.
๋๋ฌด ๋ฆ๊ฒ ๋ฐ์๋๋ฉด ๊ณ ์ฅ๋ ๊ฒ์ฒ๋ผ ๋ณด์ธ๋ค. ๊ทธ๋์ ๋ฐฉ๋ฌธ์ ์นด์ดํฐ ์์ ๋๋ GA baseline ์์ D1 ์ฆ๊ฐ๋ถ์ ๋ฐ๋ก ๋ํ๋ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค์๋ค.
๊ทธ๋ฐ๋ฐ ๋๋ฌด ์ฝ๊ฒ ์ธ๋ฉด ๋ด๋ ๊ฐ์ด ์ผ๋ค.
์ฌ์ ํ 3์ด ๋ค๋ฉด ์ ์ ๋ ์๋ ์นด์ดํธ๋๋ค. ํ์ง๋ง ์ฆ์ ์ค์ณ ์ง๋๊ฐ๋ ์๋ํ ์์ฒญ, hidden document, ๋น์ ์ viewport, ์๋ ค์ง ํด๋ผ์ฐ๋ ํฌ๋กค๋ฌ ์ถ์ ์นด์ดํฐ์ ๋ค์ด๊ฐ๊ธฐ ์ด๋ ต๋ค.
๊ณต๊ฐ ํต๊ณ๋ ์ ํํ ๋ถ์ ๋๊ตฌ๊ฐ ์๋๋ค.
๊ทธ๋๋ ์ต์ํ โ์ฌ๋์ด ์ฝ์ ํ์ โ์ ๊ฐ๊น์์ผ ํ๋ค. ์ซ์๊ฐ ํฌ๋ค๊ณ ์ข์ ๊ฒ ์๋๋ผ, ์ซ์๊ฐ ๋ฏฟ์ ๋งํด์ผ ๋ค์ ํ๋จ์ ํ ์ ์๋ค.
visible engagement์ ๋ด ์ฐจ๋จ smoke๋ฅผ ํ์ธํ๋ค
๋ช ๋ น์ ์ด๋ ๊ฒ ๋๋ ธ๋ค.
node --check cloudflare/ga-stats-worker.js
node --check assets/js/custom/visitor-stats.js
git diff --check
bundle exec jekyll build
Cloudflare Worker deploy
GitHub Pages deploy
Worker smoke๋ ๋ดค๋ค.
/analytics?range=today
-> trackDelaySeconds: 3
/track without visibilityState
-> ignored, client_signal_missing
/track with visibilityState="hidden"
-> ignored, client_signal_missing
/track with documentHidden=true
-> ignored, client_signal_missing
๊ทธ๋ฆฌ๊ณ ๋ฐฐํฌ๋ ํ HTML์๋ data-track-delay-seconds="3"์ด ๋ค์ด๊ฐ๋์ง ํ์ธํ๋ค.
๊ณต๊ฐ ์ซ์๋ ์๋ชป ์ธ๋ฉด ๋ฐ๋ก ๋ฏฟ๊ธฐ ์ด๋ ค์์ง๋ค. ์ด๋ฒ์๋ ์นด์ดํฐ๋ฅผ ๋ ํฌ๊ฒ ๋ง๋ ๊ฒ ์๋๋ผ, ๋ ์ฝ๊ฒ ์๊ฒ ๋ง๋ ์์ ์ด์๋ค.
๋๊ธ ๋จ๊ธฐ๊ธฐ