Published:

Last Updated:

๋ธ”๋กœ๊ทธ ๋ณต์‚ฌ ์ž๋™ ์ถ”์ : ๋””์ง€ํ„ธ ์ง€๋ฌธ ํ™œ์šฉ ์ฝ˜ํ…์ธ  ๋ฌด๋‹จ ๋ณต์ œ ๋ฐฉ์ง€

์ด ๊ธ€์€ ๋ธ”๋กœ๊ทธ์— ๋””์ง€ํ„ธ ์ง€๋ฌธ ๊ธฐ์ˆ ์„ ํ™œ์šฉํ•˜์—ฌ ๋ธ”๋กœ๊ทธ ์ฝ˜ํ…์ธ  ๋ฌด๋‹จ ๋ณต์ œ ์ƒํ™ฉ์„ ์ •๊ตํ•˜๊ฒŒ ์ถ”์ ํ•˜๊ณ , ๋ณต์‚ฌ ๊ธฐ๋ก์„ Google ์‹œํŠธ์— ์ž๋™์œผ๋กœ ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‹ค์ œ ์ ์šฉ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ์™€ ํ•จ๊ป˜ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ณผ์ •์€ ์‹ค์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ์™€ ์ ˆ์ฐจ ์ค‘์‹ฌ์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์œผ๋ฉฐ, ํ‹ฐ์Šคํ† ๋ฆฌ, ์›Œ๋“œํ”„๋ ˆ์Šค, ๊ตฌ๊ธ€ ๋ธ”๋กœ๊ทธ ํ™˜๊ฒฝ์—์„œ๋„ ๋ฐ”๋กœ ์ ์šฉํ•˜์—ฌ ๋ณต์‚ฌ ์ž๋™ ์ถ”์  ์‹œ์Šคํ…œ์„ ๋‹จ๊ณ„๋ณ„๋กœ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๋„๋ก ์•ˆ๋‚ดํ•ฉ๋‹ˆ๋‹ค. .


๋””์ง€ํ„ธ ์ง€๋ฌธ์ด ์ฝ˜ํ…์ธ  ๋ฌด๋‹จ ๋ณต์ œ ๋ฐฉ์ง€์— ํ•„์š”ํ•œ ์ด์œ 

ํ‹ฐ์Šคํ† ๋ฆฌ๋Š” HTML/CSS/JS ํŽธ์ง‘์ด ์ž์œ ๋กœ์›Œ ๋ฌด๋‹จ ๋ณต์ œ ๋ฐฉ์ง€ ๊ธฐ๋Šฅ์„ ์ง์ ‘ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‹จ์ˆœํ•œ ์šฐํด๋ฆญ ๋ฐฉ์ง€๋‚˜ ์„ ํƒ ๊ธˆ์ง€ ์Šคํฌ๋ฆฝํŠธ๋Š” ๋Œ€๋ถ€๋ถ„ ์šฐํšŒ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์‹ค์ œ๋กœ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์€ ์ „์ฒด ๊ธ€ ๋ณต์‚ฌ ํ›„ ๊ทธ๋Œ€๋กœ ๋ถ™์—ฌ๋„ฃ์–ด ์ฝ˜ํ…์ธ ๋ฅผ ์žฌํ™œ์šฉํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐ˜๋ณต๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ํ™˜๊ฒฝ์—์„œ ๊ฐ€์žฅ ํšจ๊ณผ์ ์ธ ์ฝ˜ํ…์ธ  ๋ณดํ˜ธ ๋ฐฉ๋ฒ•์€ ์‚ฌ์šฉ์ž ํ–‰๋™์„ ์ œ์–ดํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๋ณต์‚ฌ๋œ ์ˆœ๊ฐ„์„ ๊ธฐ๋กํ•˜์—ฌ ๋ณต์‚ฌ ์ž๋™ ์ถ”์ ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ํ•ต์‹ฌ ๊ธฐ์ˆ ์ด ๋ฐ”๋กœ ๋””์ง€ํ„ธ ์ง€๋ฌธ์ž…๋‹ˆ๋‹ค.

๋””์ง€ํ„ธ ์ง€๋ฌธ์€ ๋‹จ์ˆœํžˆ ํ…์ŠคํŠธ์— ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๋ˆˆ์— ๋ณด์ด์ง€ ์•Š๋Š” ๊ณ ์œ  ์‹๋ณ„ ๋ฐ์ดํ„ฐ(Fingerprint)๋ฅผ ์ฝ˜ํ…์ธ  ๋‚ด๋ถ€์— ๊ตฌ์กฐ์ ์œผ๋กœ ์‹ฌ์–ด ๋†“๋Š” ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ง€๋ฌธ์€ ๋ณต์‚ฌ ์‹œ ํ•จ๊ป˜ ์ „์†ก๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์„ ํƒํ•œ ํ…์ŠคํŠธ ๊ธธ์ด, ํ•ด์‹œ๊ฐ’, ๋ธŒ๋ผ์šฐ์ € ์ •๋ณด ๋“ฑ๊ณผ ๊ฒฐํ•ฉํ•˜์—ฌ ๋ฌด๋‹จ ๋ณต์ œ ์—ฌ๋ถ€์™€ ๋ณต์‚ฌ ๋‹น์‚ฌ์ž์˜ ํ–‰์œ„ ํ๋ฆ„์„ ์ •๋ฐ€ํ•˜๊ฒŒ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


์ „์ฒด ๋ณต์‚ฌ ์ž๋™ ์ถ”์  ์‹œ์Šคํ…œ ํ๋ฆ„ ์š”์•ฝ

๋ธ”๋กœ๊ทธ ๋””์ง€ํ„ธ ์ง€๋ฌธ์„ ํ™œ์šฉํ•œ ๋ณต์‚ฌ ์ถ”์  ์‹œ์Šคํ…œ์€ ํฌ๊ฒŒ ๋„ค ๋‹จ๊ณ„๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ฒซ ๋ฒˆ์งธ๋Š” Google ์‹œํŠธ๋ฅผ ๊ตฌ์„ฑํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์ €์žฅ ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ๋‘ ๋ฒˆ์งธ๋Š” Apps Script๋ฅผ ํ†ตํ•ด ๋ณต์‚ฌ ์ถ”์  API ์—”๋“œํฌ์ธํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ์„ธ ๋ฒˆ์งธ ๋‹จ๊ณ„์—์„œ๋Š” ํ‹ฐ์Šคํ† ๋ฆฌ ๋ธ”๋กœ๊ทธ ๋‚ด๋ถ€์— ๋””์ง€ํ„ธ ์ง€๋ฌธ๊ณผ ๋ณต์‚ฌ ๊ฐ์ง€ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฝ์ž…ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋™ ์ˆ˜์ง‘ํ•˜๋„๋ก ๊ตฌ์„ฑํ•˜๋ฉฐ,
  • ๋งˆ์ง€๋ง‰ ๋‹จ๊ณ„์—์„œ๋Š” ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„์„ํ•˜์—ฌ ์–ด๋–ค ํŽ˜์ด์ง€๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋ณต์‚ฌ๋˜์—ˆ๋Š”์ง€ ํŒŒ์•…ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ์ „์ฒด ๊ตฌ์กฐ๋Š” ๋””์ง€ํ„ธ ์ง€๋ฌธ ์‚ฝ์ž… ๋ณต์‚ฌ ๊ฐ์ง€ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ Google ์‹œํŠธ ์ €์žฅ ๋ถ„์„์ด๋ผ๋Š” ๋ณต์‚ฌ ์ž๋™ ์ถ”์  ํ๋ฆ„์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.


1๋‹จ๊ณ„ Google ์‹œํŠธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ตฌ์„ฑ: ๋ณต์‚ฌ ์ถ”์  ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ

๋””์ง€ํ„ธ ์ง€๋ฌธ ๋ฐ์ดํ„ฐ ๋ฐ ๋ณต์‚ฌ ์ž๋™ ์ถ”์  ๊ธฐ๋ก์„ ๊ธฐ๋กํ•˜๋ ค๋ฉด ๋จผ์ € Google ์‹œํŠธ์—์„œ ์ €์žฅํ•  ์—ด ๊ตฌ์กฐ๋ฅผ ๋ฏธ๋ฆฌ ์ •์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋‹จ๊ณ„๋Š” ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. Apps Script๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ pushํ•  ๋•Œ JSON ํ‚ค ์ด๋ฆ„๊ณผ ์‹œํŠธ ์—ด ์ด๋ฆ„์ด ์ •ํ™•ํ•˜๊ฒŒ ์ผ์น˜ํ•ด์•ผ ๋ณต์‚ฌ ๊ธฐ๋ก์ด ๋ˆ„๋ฝ ์—†์ด ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ์ฝ˜ํ…์ธ  ๋ฌด๋‹จ ๋ณต์ œ ์ถ”์ ์— ์ถ”์ฒœ๋˜๋Š” ํ•ต์‹ฌ ์—ด ๊ตฌ์„ฑ์ž…๋‹ˆ๋‹ค.

์—ด ์ด๋ฆ„ ์„ค๋ช…
pageUrl ๋ณต์‚ฌ๊ฐ€ ๋ฐœ์ƒํ•œ ํŽ˜์ด์ง€์˜ ์ „์ฒด URL (์›๋ณธ ์ฝ˜ํ…์ธ  ์ถœ์ฒ˜)
referrer ์ด์ „ ๋ฐฉ๋ฌธ ํŽ˜์ด์ง€ URL (์œ ์ž… ๊ฒฝ๋กœ ์ถ”์ )
copyTime ๋ณต์‚ฌ ์‹œ๊ฐ(ISO 8601)
selectionHash ์„ ํƒ๋œ ํ…์ŠคํŠธ์˜ SHA-256 ํ•ด์‹œ๊ฐ’ (๋ณต์‚ฌ ๋‚ด์šฉ์˜ ๊ณ ์œ  ์‹๋ณ„์ž)
selectionLength ์„ ํƒ๋œ ํ…์ŠคํŠธ ๊ธธ์ด
userAgent ๋ธŒ๋ผ์šฐ์ € ์ •๋ณด (์ ‘์† ํ™˜๊ฒฝ ๋ถ„์„)
clientIp ์ ‘์†์ž์˜ ๊ณต์šฉ IP ์ฃผ์†Œ (๋น„์‹๋ณ„ ๋ณต์‚ฌ ๋‹น์‚ฌ์ž ์‹๋ณ„)

์ด ๊ตฌ์กฐ๋ฅผ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•ด์•ผ ํ‹ฐ์Šคํ† ๋ฆฌ ๋””์ง€ํ„ธ ์ง€๋ฌธ ๋ฐ์ดํ„ฐ๊ฐ€ ์†์‹ค ์—†์ด ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค. ํŠนํžˆ selectionHash๋Š” ์ค‘๋ณต ๋ณต์ œ ์—ฌ๋ถ€๋ฅผ ํŒ๋ณ„ํ•˜๋Š” ํ•ต์‹ฌ ์š”์†Œ์ด๋ฏ€๋กœ ๋ฐ˜๋“œ์‹œ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. referrer ๊ฐ’์€ ๋ณต์‚ฌ ํ๋ฆ„์„ ์ดํ•ดํ•˜๋Š” ๋ฐ ๋งค์šฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋„ค์ด๋ฒ„ ๊ฒ€์ƒ‰์—์„œ ๋“ค์–ด์˜จ ์‚ฌ์šฉ์ž๊ฐ€ ์–ด๋–ค ๋ฌธ๋‹จ์„ ์„ ํƒํ•˜๋Š”์ง€ ๋ณต์‚ฌ ์ž๋™ ์ถ”์ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

2๋‹จ๊ณ„ Google Apps Script ์„ค์น˜: ๋ณต์‚ฌ ์ž๋™ ์ถ”์  API ์—”๋“œํฌ์ธํŠธ ๊ตฌ์ถ•

Apps Script๋Š” Google ์‹œํŠธ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๋Š” API ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ํ‹ฐ์Šคํ† ๋ฆฌ ๋””์ง€ํ„ธ ์ง€๋ฌธ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋ณต์‚ฌ ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ ์ด API URL๋กœ POST ์š”์ฒญ์„ ์ „์†กํ•˜๊ณ , POST ์š”์ฒญ์„ ๋ฐ›์€ Apps Script๋Š” ์ด๋ฅผ ์ž๋™์œผ๋กœ Sheet1์— ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ๋Š” ๊ฐ€์žฅ ์•ˆ์ •์ ์ธ doPost ๊ตฌ์กฐ์ด๋ฉฐ, JSON ํŒŒ์‹ฑ, ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ, ์‘๋‹ต ํ˜•์‹์„ ๋ชจ๋‘ ๊ฐ–์ถ˜ ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค.

Google Apps Script๋Š” Google Workspace(๊ตฌ๊ธ€ ์‹œํŠธ, ๋ฌธ์„œ, ๋“œ๋ผ์ด๋ธŒ, ์บ˜๋ฆฐ๋” ๋“ฑ)๋ฅผ ์ž๋™ํ™”ํ•˜๊ณ  ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•˜๊ธฐ ์œ„ํ•ด Google์—์„œ ์ œ๊ณตํ•˜๋Š” ํด๋ผ์šฐ๋“œ ๊ธฐ๋ฐ˜์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ”Œ๋žซํผ์ž…๋‹ˆ๋‹ค.
function doPost(e) {
try {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("์‹œํŠธ์ด๋ฆ„");
const data = JSON.parse(e.postData.contents);

sheet.appendRow([
data.pageUrl || '',
data.referrer || '',
data.copyTime || '',
data.selectionHash || '',
data.selectionLength || '',
data.userAgent || '',
data.clientIp || ''
]);

return ContentService.createTextOutput(JSON.stringify({result: "success"}))
.setMimeType(ContentService.MimeType.JSON);
} catch(err) {
return ContentService.createTextOutput(JSON.stringify({result: "error", message: err.message}))
.setMimeType(ContentService.MimeType.JSON);
}
}

์ด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ฐฐํฌํ•˜๋ฉด ์›น ์•ฑ URL์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ด URL์„ ๋ธ”๋กœ๊ทธ ๋””์ง€ํ„ธ ์ง€๋ฌธ ์Šคํฌ๋ฆฝํŠธ ๋‚ด์—์„œ ํ˜ธ์ถœํ•˜์—ฌ ๋ณต์‚ฌ ์ž๋™ ์ถ”์  ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. POST ์š”์ฒญ์„ ์•ˆ์ •์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฐ˜๋“œ์‹œ์›น ์•ฑ ์‹คํ–‰ ๊ถŒํ•œ์„ ๋ชจ๋“  ์‚ฌ์šฉ์ž์—๊ฒŒ ํ—ˆ์šฉ์œผ๋กœ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ณต์‚ฌ ์ถ”์  ๊ธฐ๋Šฅ์˜ ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค.


3๋‹จ๊ณ„ ๋ธ”๋กœ๊ทธ์— ๋””์ง€ํ„ธ ์ง€๋ฌธ ์‚ฝ์ž… ๋ฐ ๋ณต์‚ฌ ์ž๋™ ์ถ”์  ์Šคํฌ๋ฆฝํŠธ ์ ์šฉ

ํ‹ฐ์Šคํ† ๋ฆฌ ๊ด€๋ฆฌ ํŽ˜์ด์ง€์—์„œ HTML/CSS ํŽธ์ง‘ ๋˜๋Š” ์Šคํ‚จ ํŽธ์ง‘ ์˜์—ญ์— ์ง„์ž…ํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ •์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ body ๋‹ซ๊ธฐ ์ง์ „์— ์‚ฝ์ž…ํ•˜๋Š” ๊ฒƒ์ด ์Šคํฌ๋ฆฝํŠธ ๋กœ๋”ฉ ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ  ๋ณต์‚ฌ ๊ฐ์ง€ ์•ˆ์ •์„ฑ์„ ๋†’์ด๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

์•„๋ž˜ ์Šคํฌ๋ฆฝํŠธ๋Š” ํ‹ฐ์Šคํ† ๋ฆฌ ํ™˜๊ฒฝ์— ๋””์ง€ํ„ธ ์ง€๋ฌธ(Digital Fingerprinting) ๊ธฐ์ˆ ์„ ์ ์šฉํ•ด, ๋ณธ๋ฌธ ๋‚ด๋ถ€์— ๋ˆˆ์— ๋ณด์ด์ง€ ์•Š๋Š” ๊ณ ์œ  ์‹๋ณ„ ์ •๋ณด๋ฅผ ์ž๋™์œผ๋กœ ์‚ฝ์ž…ํ•˜๊ณ , ์‚ฌ์šฉ์ž๊ฐ€ ํ…์ŠคํŠธ๋ฅผ ๋ณต์‚ฌํ•˜๋Š” ์ˆœ๊ฐ„ ์ด๋ฅผ ์ฆ‰์‹œ ๊ฐ์ง€ํ•˜์—ฌ Google Apps Script๋กœ ์ „์†กํ•จ์œผ๋กœ์จ ๋ชจ๋“  ๋ณต์‚ฌ ๊ธฐ๋ก์„ ๊ตฌ๊ธ€(Google) ์‹œํŠธ์— ์ž๋™์œผ๋กœ ๋ˆ„์  ์ €์žฅํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  • ๋…์ž๊ฐ€ ํŠน์ • ๋ฌธ์žฅ์„ ๋ณต์‚ฌํ•  ๋•Œ๋งˆ๋‹ค ๋ณต์‚ฌ ์ž๋™ ์ถ”์  ๋ฐ์ดํ„ฐ๊ฐ€ ์ˆ˜์ง‘๋ฉ๋‹ˆ๋‹ค.
    • ๋ณต์‚ฌ๋œ ๋‚ด์šฉ์˜ ๊ธธ์ด ๋ฐ ํ•ด์‹œ๊ฐ’(SHA-256)
    • ๋ณต์‚ฌ ์‹œ๊ฐ ๋ฐ ๋ฐฉ๋ฌธ์ž์˜ IP
    • ๋ธŒ๋ผ์šฐ์ € ์ •๋ณด(User-Agent) ๋“ฑ์ด Google ์‹œํŠธ์— ์ž๋™์œผ๋กœ ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ๋ณธ๋ฌธ ๋‚ด๋ถ€์—๋Š” ๋ณด์ด์ง€ ์•Š๋„๋ก ๋””์ง€ํ„ธ ์ง€๋ฌธ(๊ณ ์œ  ID + ์›๋ณธ URL)์ด ์ˆจ๊ฒจ์„œ ์‚ฝ์ž…๋˜๋ฏ€๋กœ, ์ฝ˜ํ…์ธ ๊ฐ€ ์–ด๋””์„œ ๋ณต์‚ฌ ์žฌ์‚ฌ์šฉ๋˜์—ˆ๋Š”์ง€ ์ถ”์ ํ•˜๋Š” ๋ฐ ํฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

  • SHA-256 ํ•ด์‹œ ์ƒ์„ฑ: ๋ณต์‚ฌ๋œ ๋ฌธ์žฅ์˜ ๊ณ ์œ ๊ฐ’ ์ƒ์„ฑ์œผ๋กœ ๋ฌด๋‹จ ๋ณต์ œ ๋‚ด์šฉ ์‹๋ณ„
  • ๊ณต์šฉ IP ์ž๋™ ์ˆ˜์ง‘: ๋ฐฉ๋ฌธ์ž ์‹๋ณ„์„ ํ†ตํ•œ ๋ณต์‚ฌ ๋‹น์‚ฌ์ž ์ถ”์ •
  • Google Apps Script๋กœ GET ์ „์†ก: ์„œ๋ฒ„ ์—†์ด ๋ณต์‚ฌ ๊ธฐ๋ก ์ €์žฅ (๊ตฌ๊ธ€ ์‹œํŠธ ์ž๋™ ์ €์žฅ)
  • ๋ณต์‚ฌํ•œ ํ…์ŠคํŠธ์— ์ž๋™์œผ๋กœ ์ถœ์ฒ˜ ์ •๋ณด ์ถ”๊ฐ€: ์ฝ˜ํ…์ธ  ๋ณดํ˜ธ ๋ฉ”์‹œ์ง€ ์‚ฝ์ž…
  • ๋ณธ๋ฌธ์— ๋ณด์ด์ง€ ์•Š๋Š” ๋””์ง€ํ„ธ ์ง€๋ฌธ ์‚ฝ์ž…: ์›๋ณธ ์ถœ์ฒ˜ ๋ช…์‹œ
script
// ========================================================
// [ํ•„์ˆ˜ ์„ค์ •] Google Apps Script ๋ฐฐํฌ URL (๋ณต์‚ฌ ์ž๋™ ์ถ”์  ๋ฐ์ดํ„ฐ ์ „์†ก ์—”๋“œํฌ์ธํŠธ)
// ========================================================
const WEB_APP_URL = 'https://script.google.com/macros/s/์ฃผ์†Œ ๋ณ€๊ฒฝ/exec';

async function sendToSheet(payload) {
try {
// URLSearchParams๋กœ GET ์ฟผ๋ฆฌ ์ƒ์„ฑ
const params = new URLSearchParams(payload).toString();
const res = await fetch(`${WEB_APP_URL}?${params}`)
.then(r = r.text());
console.log('Tracking data sent successfully:', res);
} catch(err) {
console.error('Failed to send tracking data to Google Apps Script:', err);
}
}

// ========================================================
// ์ˆจ๊ฒจ์ง„ ๋””์ง€ํ„ธ ์ง€๋ฌธ ์‚ฝ์ž… (์ฝ˜ํ…์ธ  ์›๋ณธ ์‹๋ณ„์ž)
// ========================================================
function insertHiddenFingerprint(contentContainer) {
const currentUrl = window.location.href;
const currentTitle = document.title;
const uniqueId = new Date().getTime().toString(36) + Math.random().toString(36).substring(2, 7);

const fingerprintElement = document.createElement('div');

fingerprintElement.style.cssText =
'position: absolute; width: 1px; height: 1px; overflow: hidden; opacity: 0; pointer-events: none; white-space: nowrap; font-size: 0; color: transparent;';

const fingerprintContent = `
!-- noindex --
!-- Digital Source Traceability ID: ${uniqueId} --
!-- Original URL: ${currentUrl} --
!-- Original Title: ${currentTitle} --
COPYRIGHT-TRACE-${uniqueId}-${currentUrl.replace(/[^a-zA-Z0-9]/g, '').substring(0, 50)}
!-- /noindex --
`;

fingerprintElement.innerHTML = fingerprintContent;
contentContainer.appendChild(fingerprintElement);

console.log(`Digital Fingerprinting: Hidden trace ID (${uniqueId}) inserted.`);
}

// ====================================================
// ๋ณต์‚ฌ ์ด๋ฒคํŠธ ์ถ”์ 
// ====================================================
document.addEventListener('copy', async function(e){
// ... (SHA-256, IP ์ˆ˜์ง‘ ๋“ฑ ๋ˆ„๋ฝ๋œ ๋กœ์ง์ด ํฌํ•จ๋˜์–ด์•ผ ํ•จ) ...
const copyTime = new Date().toISOString();
const selection = document.getSelection().toString();
// ์ž„์‹œ ํ•ด์‹œ ๋ฐ ๊ธธ์ด ๊ฐ’ (์‹ค์ œ ์ฝ”๋“œ์—๋Š” ํ•ด์‹œ ํ•จ์ˆ˜ ๊ตฌํ˜„ ํ•„์š”)
const selectionHash = 'MOCK_HASH_' + selection.length; 
const selectionLength = selection.length;
const clientIp = 'MOCK_IP'; // ์‹ค์ œ IP ์ˆ˜์ง‘ ๋กœ์ง ํ•„์š”

sendToSheet({
pageUrl: location.href,
referrer: document.referrer || '',
copyTime: copyTime,
selectionHash: selectionHash,
selectionLength: selectionLength,
userAgent: navigator.userAgent || '',
clientIp: clientIp
});

console.log('Copy captured and logged.', {
selectionHash, selectionLength, copyTime, clientIp
});
});

console.log("Tistory Tracking Script Initialized. Waiting for copy events.");
});
/script

๋ธ”๋กœ๊ทธ ์‚ฌ์ดํŠธ ๋””์ง€ํ„ธ ์ง€๋ฌธ ์Šคํฌ๋ฆฝํŠธ๋Š” ๋‘ ๊ฐ€์ง€ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ์ฝ˜ํ…์ธ  ๋ฌด๋‹จ ๋ณต์ œ ๋ฐฉ์ง€๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  • โ‘  ๋ณธ๋ฌธ ์š”์†Œ ๋‚ด๋ถ€์— ๊ณ ์œ  ๋””์ง€ํ„ธ ์ง€๋ฌธ ์‚ฝ์ž… (์›๋ณธ ์ถœ์ฒ˜ ์ฆ๋ช…)
  • โ‘ก ๋ณต์‚ฌ ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ ์„ ํƒ ํ…์ŠคํŠธ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ ๋ฐ POST ์š”์ฒญ ์ „์†ก ๋ณต์‚ฌ ์ž๋™ ์ถ”์ 

๋””์ง€ํ„ธ ์ง€๋ฌธ์€ ์‚ฌ์šฉ์ž๊ฐ€ ๋ˆˆ์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ๊ฐ€ ์•„๋‹ˆ๋ผ, HTML ๊ตฌ์กฐ ๋‚ด ๋ณด์ด์ง€ ์•Š๋Š” ์˜์—ญ์— ์‚ฝ์ž…๋˜๋ฏ€๋กœ, SEO๋‚˜ ๋ ˆ์ด์•„์›ƒ์— ์ „ํ˜€ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


๋””์ง€ํ„ธ ์ง€๋ฌธ์ด ํ…์ŠคํŠธ์— ์ˆจ๊ฒจ์ง€๋Š” ์›๋ฆฌ: ์ฝ˜ํ…์ธ  ์ถ”์ 

๋ธ”๋กœ๊ทธ ๋””์ง€ํ„ธ ์ง€๋ฌธ์€ HTML ์ฃผ์„์ฒ˜๋Ÿผ ๋‹จ์ˆœํ•œ ๋ฌธ์ž์—ด ์‚ฝ์ž…์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ด ๋ฐฉ์‹์€ ์ฝ˜ํ…์ธ  ๋ณต์ œ ์ถ”์ ์— ํ•„์š”ํ•œ ์‹๋ณ„๋ ฅ์„ ๊ฐ•ํ™”ํ•˜๋Š” ์ •๊ตํ•œ ์›๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  1. ์ง€๋ฌธ ์ƒ์„ฑ: ํŽ˜์ด์ง€ URL ๊ธฐ๋ฐ˜ ๊ณ ์œ  ID ์ƒ์„ฑ
  2. ์ง€๋ฌธ ์‚ฝ์ž…: ๋ณธ๋ฌธ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€ ๋น„๊ฐ€์‹œ ์˜์—ญ์— hidden span ์‚ฝ์ž…
  3. ์ง€๋ฌธ ๊ฒฐํ•ฉ: ๋ณต์‚ฌ ์‹œ ์„ ํƒ๋œ ํ…์ŠคํŠธ์™€ ์ง€๋ฌธ์„ ๊ฒฐํ•ฉํ•ด ํ•ด์‹œ ์ƒ์„ฑ (์‹๋ณ„๋ ฅ ๊ฐ•ํ™”)
  4. ์ง€๋ฌธ ์ถ”์ถœ: ์„ ํƒ ํ…์ŠคํŠธ์˜ SHA-256๊ณผ ์ง€๋ฌธ ํ•ด์‹œ๋ฅผ ์กฐํ•ฉํ•ด ์›๋ณธ ์‹๋ณ„๋ ฅ ๊ฐ•ํ™”

์ด ๋ฐฉ์‹์€ ๋‹จ์ˆœํ•œ ์ˆจ๊น€ ํ…์ŠคํŠธ๋ณด๋‹ค ํ›จ์”ฌ ์ •๊ตํ•˜๋ฉฐ, ๋ธ”๋กœ๊ทธ ๋””์ง€ํ„ธ ์ง€๋ฌธ์„ ์†์ƒ์‹œํ‚ค์ง€ ์•Š๊ณ  ๋ณต์‚ฌํ•˜๋”๋ผ๋„, ์„ ํƒ ํ…์ŠคํŠธ ๊ธธ์ด์™€ ํ•ด์‹œ๊ฐ’์ด Google ์‹œํŠธ์— ์ €์žฅ๋˜๋ฏ€๋กœ ํ…์ŠคํŠธ ๋งค์นญ์„ ํ†ตํ•ด ์›๋ณธ ์ถœ์ฒ˜ ํŒ๋ณ„์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.


๋ณต์‚ฌ ์ด๋ฒคํŠธ ๋ฐ์ดํ„ฐ ํ๋ฆ„: Google ์‹œํŠธ ์ž๋™ ์ €์žฅ ํ”„๋กœ์„ธ์Šค

๋””์ง€ํ„ธ ์ง€๋ฌธ์ด ํ™œ์„ฑํ™”๋œ ์ƒํƒœ์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ํ…์ŠคํŠธ๋ฅผ ์„ ํƒํ•˜๊ณ  Ctrl+C, ์šฐํด๋ฆญ ๋ณต์‚ฌ ๋“ฑ์„ ์ˆ˜ํ–‰ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ณต์‚ฌ ์ž๋™ ์ถ”์  ๋ฐ์ดํ„ฐ ํ๋ฆ„์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

  1. ์‚ฌ์šฉ์ž๊ฐ€ ํ…์ŠคํŠธ ๋“œ๋ž˜๊ทธ
  2. ์„ ํƒ ์˜์—ญ์˜ ํ…์ŠคํŠธ ๊ธธ์ด ๊ณ„์‚ฐ
  3. SHA-256 ํ•ด์‹œ ์ƒ์„ฑ (selectionHash)
  4. ๋ธŒ๋ผ์šฐ์ € ์ •๋ณด(userAgent)์™€ referrer ์ˆ˜์ง‘
  5. clientIp ์กฐํšŒ
  6. Google Apps Script URL๋กœ GET/POST ์š”์ฒญ (API ํ˜ธ์ถœ)
  7. Google Sheet์— appendRow๋กœ ์ €์žฅ (์ž๋™ ์ €์žฅ)

์—ฌ๊ธฐ์„œ ํ•ต์‹ฌ์€ selectionHash์ž…๋‹ˆ๋‹ค. ์ด๋Š” ํ…์ŠคํŠธ์˜ ์ผ๋ถ€๋ถ„๋งŒ ๋ณต์‚ฌ๋˜๋”๋ผ๋„ ๋™์ผํ•œ ๋‚ด์šฉ์„ ๋‹ค๋ฅธ ๊ณณ์—์„œ ๋ณต์‚ฌํ•˜๋ฉด ๋™์ผํ•œ ํ•ด์‹œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋ณต์‚ฌ์ž ์‹๋ณ„ ๋ฐ ์ค‘๋ณต ๋ณต์ œ ํƒ์ง€์— ๋งค์šฐ ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์ˆ˜์ง‘๋œ ๋ฐ์ดํ„ฐ์˜ ์˜๋ฏธ: ์ฝ˜ํ…์ธ  ๋ฌด๋‹จ ๋ณต์ œ ๋ถ„์„

๊ตฌ๊ธ€(Google) ์‹œํŠธ์—์„œ ์ €์žฅ๋œ ๋ธ”๋กœ๊ทธ ๋””์ง€ํ„ธ ์ง€๋ฌธ ๋ฐ์ดํ„ฐ๋Š” ๋‹จ์ˆœํ•œ ๋กœ๊ทธ๊ฐ€ ์•„๋‹ˆ๋ผ, ์ฝ˜ํ…์ธ  ์ถœ์ฒ˜ ์ถ”์ ์„ ์œ„ํ•œ ๊ฐ•๋ ฅํ•œ ๋ฐ์ดํ„ฐ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํŠน์ • selectionHash ๊ฐ’์ด ๋ฐ˜๋ณต์ ์œผ๋กœ ๊ธฐ๋ก๋˜์—ˆ๋‹ค๋ฉด ๊ทธ ํ…์ŠคํŠธ๊ฐ€ ๊ฐ€์žฅ ๋งŽ์ด ๋ณต์‚ฌ๋œ ๋ฌธ๋‹จ์ด๋ผ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ฝ˜ํ…์ธ  ๊ตฌ์กฐ ๊ฐœ์„ ์ด๋‚˜ ์ฝ˜ํ…์ธ  ๋ณดํ˜ธ ๊ฐ•ํ™”๋ฅผ ์ˆ˜๋ฆฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” SEO์— ๋”ฐ๋ฅธ ๋…์ž ๊ด€์‹ฌ์‚ฌ๋ฅผ ํŒŒ์•…ํ•˜๋Š” ๋ฐ๋„ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.


Q1. ํ‹ฐ์Šคํ† ๋ฆฌ ๋””์ง€ํ„ธ ์ง€๋ฌธ์€ ๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ณต์‚ฌ ์ž๋™ ์ถ”์ ์ด ๊ฐ€๋Šฅํ•œ๊ฐ€์š”?

์ตœ์‹  ๋ฒ„์ „์˜ ํฌ๋กฌ, ์‚ฌํŒŒ๋ฆฌ, ์—ฃ์ง€ ๋“ฑ ์ฃผ์š” ๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” ์™„๋ฒฝํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ถ€ ๊ตฌํ˜• ๋ธŒ๋ผ์šฐ์ €์—์„œ ์„ ํƒ ์ด๋ฒคํŠธ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋‹ฌ๋ผ ํŠน์ • ๊ธฐ๋Šฅ์ด ์ œํ•œ๋  ์ˆ˜ ์žˆ์œผ๋‚˜, ์ฃผ์š” ๊ธฐ๋Šฅ์€ ๋Œ€๋ถ€๋ถ„ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค.

Q2. ๊ฐœ์ธ์ •๋ณด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€๋Š” ์•Š๋‚˜์š”?

ํ‹ฐ์Šคํ† ๋ฆฌ ๋””์ง€ํ„ธ ์ง€๋ฌธ์€ ๊ณต์šฉ IP์™€ UserAgent๋งŒ ์ˆ˜์ง‘ํ•˜๋ฉฐ, ๊ฐœ์ธ ์‹๋ณ„ ์ •๋ณด๋Š” ์ ˆ๋Œ€ ์ €์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋น„์‹๋ณ„ ์ •๋ณด์ด๋ฉฐ ๋ฒ•์ ์ธ ๋ฌธ์ œ๋Š” ์—†์Šต๋‹ˆ๋‹ค.

Q3. Google ์‹œํŠธ ์ž๋™ ์ €์žฅ ๋ฐ ๋ธ”๋กœ๊ทธ ์Šคํฌ๋ฆฝํŠธ์˜ ์—ฐ๋™์€ ์–ด๋–ป๊ฒŒ ๊ฒ€์ฆํ•˜๋‚˜์š”?

๋ธ”๋กœ๊ทธ์—์„œ ์ผ๋ถ€ ํ…์ŠคํŠธ๋ฅผ ๋ณต์‚ฌํ•œ ํ›„ ์‹œํŠธ๋ฅผ ์ƒˆ๋กœ๊ณ ์นจํ•˜๋ฉด ์ƒˆ ํ–‰์ด ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. pageUrl, copyTime, selectionLength๊ฐ€ ์ •ํ™•ํžˆ ๊ธฐ๋ก๋˜๋ฉด ๋ณต์‚ฌ ์ž๋™ ์ถ”์  ์‹œ์Šคํ…œ์ด ์ •์ƒ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.