2026.06.11 (๋ชฉ)

โœจ 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"์ด ๋“ค์–ด๊ฐ€๋Š”์ง€ ํ™•์ธํ–ˆ๋‹ค.

๊ณต๊ฐœ ์ˆซ์ž๋Š” ์ž˜๋ชป ์„ธ๋ฉด ๋ฐ”๋กœ ๋ฏฟ๊ธฐ ์–ด๋ ค์›Œ์ง„๋‹ค. ์ด๋ฒˆ์—๋Š” ์นด์šดํ„ฐ๋ฅผ ๋” ํฌ๊ฒŒ ๋งŒ๋“  ๊ฒŒ ์•„๋‹ˆ๋ผ, ๋œ ์‰ฝ๊ฒŒ ์†๊ฒŒ ๋งŒ๋“  ์ž‘์—…์ด์—ˆ๋‹ค.

๋Œ“๊ธ€ ๋‚จ๊ธฐ๊ธฐ