๋ธ๋ก๊ทธ ๋ณต์ฌ ์๋ ์ถ์ : ๋์งํธ ์ง๋ฌธ ํ์ฉ ์ฝํ ์ธ ๋ฌด๋จ ๋ณต์ ๋ฐฉ์ง
์ด ๊ธ์ ๋ธ๋ก๊ทธ์ ๋์งํธ ์ง๋ฌธ ๊ธฐ์ ์ ํ์ฉํ์ฌ ๋ธ๋ก๊ทธ ์ฝํ ์ธ ๋ฌด๋จ ๋ณต์ ์ํฉ์ ์ ๊ตํ๊ฒ ์ถ์ ํ๊ณ , ๋ณต์ฌ ๊ธฐ๋ก์ 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 ์ฃผ์์ฒ๋ผ ๋จ์ํ ๋ฌธ์์ด ์ฝ์ ์ด ์๋๋๋ค. ์ด ๋ฐฉ์์ ์ฝํ ์ธ ๋ณต์ ์ถ์ ์ ํ์ํ ์๋ณ๋ ฅ์ ๊ฐํํ๋ ์ ๊ตํ ์๋ฆฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ์ง๋ฌธ ์์ฑ: ํ์ด์ง URL ๊ธฐ๋ฐ ๊ณ ์ ID ์์ฑ
- ์ง๋ฌธ ์ฝ์ : ๋ณธ๋ฌธ ์ปจํ ์ด๋ ๋ด๋ถ ๋น๊ฐ์ ์์ญ์ hidden span ์ฝ์
- ์ง๋ฌธ ๊ฒฐํฉ: ๋ณต์ฌ ์ ์ ํ๋ ํ ์คํธ์ ์ง๋ฌธ์ ๊ฒฐํฉํด ํด์ ์์ฑ (์๋ณ๋ ฅ ๊ฐํ)
- ์ง๋ฌธ ์ถ์ถ: ์ ํ ํ ์คํธ์ SHA-256๊ณผ ์ง๋ฌธ ํด์๋ฅผ ์กฐํฉํด ์๋ณธ ์๋ณ๋ ฅ ๊ฐํ
์ด ๋ฐฉ์์ ๋จ์ํ ์จ๊น ํ ์คํธ๋ณด๋ค ํจ์ฌ ์ ๊ตํ๋ฉฐ, ๋ธ๋ก๊ทธ ๋์งํธ ์ง๋ฌธ์ ์์์ํค์ง ์๊ณ ๋ณต์ฌํ๋๋ผ๋, ์ ํ ํ ์คํธ ๊ธธ์ด์ ํด์๊ฐ์ด Google ์ํธ์ ์ ์ฅ๋๋ฏ๋ก ํ ์คํธ ๋งค์นญ์ ํตํด ์๋ณธ ์ถ์ฒ ํ๋ณ์ด ๊ฐ๋ฅํฉ๋๋ค.
๋ณต์ฌ ์ด๋ฒคํธ ๋ฐ์ดํฐ ํ๋ฆ: Google ์ํธ ์๋ ์ ์ฅ ํ๋ก์ธ์ค
๋์งํธ ์ง๋ฌธ์ด ํ์ฑํ๋ ์ํ์์ ์ฌ์ฉ์๊ฐ ํ ์คํธ๋ฅผ ์ ํํ๊ณ Ctrl+C, ์ฐํด๋ฆญ ๋ณต์ฌ ๋ฑ์ ์ํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋ณต์ฌ ์๋ ์ถ์ ๋ฐ์ดํฐ ํ๋ฆ์ด ์๋ํฉ๋๋ค.
- ์ฌ์ฉ์๊ฐ ํ ์คํธ ๋๋๊ทธ
- ์ ํ ์์ญ์ ํ ์คํธ ๊ธธ์ด ๊ณ์ฐ
- SHA-256 ํด์ ์์ฑ (selectionHash)
- ๋ธ๋ผ์ฐ์ ์ ๋ณด(userAgent)์ referrer ์์ง
- clientIp ์กฐํ
- Google Apps Script URL๋ก GET/POST ์์ฒญ (API ํธ์ถ)
- Google Sheet์ appendRow๋ก ์ ์ฅ (์๋ ์ ์ฅ)
์ฌ๊ธฐ์ ํต์ฌ์ selectionHash์ ๋๋ค. ์ด๋ ํ ์คํธ์ ์ผ๋ถ๋ถ๋ง ๋ณต์ฌ๋๋๋ผ๋ ๋์ผํ ๋ด์ฉ์ ๋ค๋ฅธ ๊ณณ์์ ๋ณต์ฌํ๋ฉด ๋์ผํ ํด์๊ฐ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์, ๋ณต์ฌ์ ์๋ณ ๋ฐ ์ค๋ณต ๋ณต์ ํ์ง์ ๋งค์ฐ ์ ๋ฆฌํฉ๋๋ค.
์์ง๋ ๋ฐ์ดํฐ์ ์๋ฏธ: ์ฝํ ์ธ ๋ฌด๋จ ๋ณต์ ๋ถ์
๊ตฌ๊ธ(Google) ์ํธ์์ ์ ์ฅ๋ ๋ธ๋ก๊ทธ ๋์งํธ ์ง๋ฌธ ๋ฐ์ดํฐ๋ ๋จ์ํ ๋ก๊ทธ๊ฐ ์๋๋ผ, ์ฝํ ์ธ ์ถ์ฒ ์ถ์ ์ ์ํ ๊ฐ๋ ฅํ ๋ฐ์ดํฐ์ ๋๋ค. ์๋ฅผ ๋ค์ด ํน์ selectionHash ๊ฐ์ด ๋ฐ๋ณต์ ์ผ๋ก ๊ธฐ๋ก๋์๋ค๋ฉด ๊ทธ ํ ์คํธ๊ฐ ๊ฐ์ฅ ๋ง์ด ๋ณต์ฌ๋ ๋ฌธ๋จ์ด๋ผ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ฝํ ์ธ ๊ตฌ์กฐ ๊ฐ์ ์ด๋ ์ฝํ ์ธ ๋ณดํธ ๊ฐํ๋ฅผ ์๋ฆฝํ ์ ์์ต๋๋ค. ์ด๋ SEO์ ๋ฐ๋ฅธ ๋ ์ ๊ด์ฌ์ฌ๋ฅผ ํ์ ํ๋ ๋ฐ๋ ์ ์ฉํฉ๋๋ค.
Q1. ํฐ์คํ ๋ฆฌ ๋์งํธ ์ง๋ฌธ์ ๋ชจ๋ ๋ธ๋ผ์ฐ์ ์์ ๋ณต์ฌ ์๋ ์ถ์ ์ด ๊ฐ๋ฅํ๊ฐ์?
์ต์ ๋ฒ์ ์ ํฌ๋กฌ, ์ฌํ๋ฆฌ, ์ฃ์ง ๋ฑ ์ฃผ์ ๋ธ๋ผ์ฐ์ ์์๋ ์๋ฒฝํ๊ฒ ์๋ํฉ๋๋ค. ์ผ๋ถ ๊ตฌํ ๋ธ๋ผ์ฐ์ ์์ ์ ํ ์ด๋ฒคํธ ์ธํฐํ์ด์ค๊ฐ ๋ฌ๋ผ ํน์ ๊ธฐ๋ฅ์ด ์ ํ๋ ์ ์์ผ๋, ์ฃผ์ ๊ธฐ๋ฅ์ ๋๋ถ๋ถ ํธํ๋ฉ๋๋ค.
Q2. ๊ฐ์ธ์ ๋ณด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง๋ ์๋์?
ํฐ์คํ ๋ฆฌ ๋์งํธ ์ง๋ฌธ์ ๊ณต์ฉ IP์ UserAgent๋ง ์์งํ๋ฉฐ, ๊ฐ์ธ ์๋ณ ์ ๋ณด๋ ์ ๋ ์ ์ฅํ์ง ์์ต๋๋ค. ์ด๋ ๋น์๋ณ ์ ๋ณด์ด๋ฉฐ ๋ฒ์ ์ธ ๋ฌธ์ ๋ ์์ต๋๋ค.
Q3. Google ์ํธ ์๋ ์ ์ฅ ๋ฐ ๋ธ๋ก๊ทธ ์คํฌ๋ฆฝํธ์ ์ฐ๋์ ์ด๋ป๊ฒ ๊ฒ์ฆํ๋์?
๋ธ๋ก๊ทธ์์ ์ผ๋ถ ํ ์คํธ๋ฅผ ๋ณต์ฌํ ํ ์ํธ๋ฅผ ์๋ก๊ณ ์นจํ๋ฉด ์ ํ์ด ์ถ๊ฐ๋ฉ๋๋ค. pageUrl, copyTime, selectionLength๊ฐ ์ ํํ ๊ธฐ๋ก๋๋ฉด ๋ณต์ฌ ์๋ ์ถ์ ์์คํ ์ด ์ ์ ์๋ํ๋ ๊ฒ์ ๋๋ค.