ํฐ์คํ ๋ฆฌ ๋๊ธ๋, ๋จ์ ์ํต ๋์ด์ ์ฝํ ์ธ ํ์ฅ ์์ญ์ผ๋ก ํ์ฅํ๋ ๋ฐฉ๋ฒ
๋ธ๋ก๊ทธ ๋๊ธ์ ๋จ์ํ ๋ฐฉ๋ฌธ์์ ์ํตํ๋ ์ฐฝ๊ตฌ ์ด์์ ์๋ฏธ๋ฅผ ์ง๋๋๋ค. ํ์ง๋ง ๋ธ๋ก๊ทธ์ ๊ธฐ๋ณธ ์์คํ ์ ๋ณด์๊ณผ ์์ ์ฑ์ ์ํด ๋๊ธ ๋ด์์ HTML ํ๊ทธ ์ฌ์ฉ์ ์ ํํ๊ณ ์์ด, ์ด๋ฏธ์ง๋ ํ์ดํผ๋งํฌ ๋ฑ ๋ค์ํ ์ฝํ ์ธ ๋ฅผ ์์ ๋กญ๊ฒ ํํํ๊ธฐ ์ด๋ ต์ต๋๋ค. ์ด๋ก ์ธํด ๋๊ธ๋์ด ๋จ์ํ ํ ์คํธ ๊ตํ ๊ณต๊ฐ์ ๋จธ๋ฌด๋ฅด๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ , ์ด์์๊ฐ ๋๊ธ์ ์ฒด๊ณ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์๋ค๋ฉด, ์ด ํ๊ณ๋ฅผ ๊ทน๋ณตํ๊ณ ๋๊ธ๋์ ๋ธ๋ก๊ทธ ์ฝํ ์ธ ์ ํ์ฅ ์์ญ์ผ๋ก ํ์ฉํ ์ ์๋ ์ข์ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ๋๊ธ์ ์ด๋ฏธ์ง์ ๋งํฌ๋ฅผ ์์ ํ๊ฒ ๋ณต์ํด ํ์ํจ์ผ๋ก์จ, ๋๊ธ ์์ฒด๊ฐ ๋ฐฉ๋ฌธ์์์ ์ ๊ทน์ ์ธ ์ํต๋ฟ ์๋๋ผ ์ฝํ ์ธ ๋ฅผ ํ๋ถํ๊ฒ ๋ง๋๋ ์ค์ํ ๋๊ตฌ๊ฐ ๋ ์ ์์ต๋๋ค.
ํฐ์คํ ๋ฆฌ ๋๊ธ์ ์ฝํ ์ธ ํ์ฅ ๋๊ตฌ๋ก! ์ด๋ฏธ์ง ๋งํฌ์ HTML ํ๊ทธ ํ์ํ๊ธฐ
์ด๋ฒ ๊ธ์์๋ ํฐ์คํ ๋ฆฌ ๋๊ธ์ ์จ๊ฒจ์ง HTML ํ๊ทธ๋ฅผ ์์ ํ๊ฒ ํ์ฉํ๊ณ , ์ด๋ฏธ์ง ๋งํฌ์ ๋ด๋น๊ฒ์ด์ ๊ธฐ๋ฅ๊น์ง ๊ตฌํํ ์ ์๋ ์ค์ฉ์ ์ธ ์คํฌ๋ฆฝํธ์ ์ ์ฉ ๋ฐฉ๋ฒ์ ์์ธํ ์๊ฐํฉ๋๋ค. ๋๊ธ์ ๋จ์ํ ์๊ฒฌ ๊ตํ์ด ์๋, ๋ธ๋ก๊ทธ ํ์ฑํ๋ฅผ ์ํ ์ฌ์ฉ์ ์ฐธ์ฌํ ์ฝํ ์ธ ๊ณต๊ฐ์ผ๋ก ํ์ฅํด ๋ณด์ธ์!
์ ๋ธ๋ก๊ทธ์์๋ ๋๊ธ์ HTML ํ๊ทธ๋ฅผ ์ฐจ๋จํ ๊น?
ํฐ์คํ ๋ฆฌ ๋ฐ ๋ธ๋ก๊ทธ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋๊ธ์ script, img, iframe ๋ฑ HTML ํ๊ทธ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ทธ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
1. XSS(ํฌ๋ก์ค์ฌ์ดํธ์คํฌ๋ฆฝํ ) ๋ณด์ ์ํ ๋ฐฉ์ง
- ์ ์ฑ ์ฌ์ฉ์๊ฐ ๋๊ธ์ script๋ img onerror=... ๊ฐ์ ์คํฌ๋ฆฝํธ๋ฅผ ์ฝ์ ํ ๊ฒฝ์ฐ,
- ํ์ด์ง๋ฅผ ๋ฐฉ๋ฌธํ ๋ค๋ฅธ ์ด์ฉ์์๊ฒ ์ ์ฑ ์ฝ๋๊ฐ ์คํ๋ ์ ์์ต๋๋ค.
2. ์คํธ ๋ฐ ๊ด๊ณ ๋งํฌ ๋จ๋ฐ ๋ฐฉ์ง
- a ๋งํฌ, ์ธ๋ถ ์ด๋ฏธ์ง, iframe ๋ฑ์ ์ฝ์ ํด ๊ด๊ณ , ํผ์ฑ, ๋ถ๋ฒ ํ๋ณด๊ฐ ๊ฐ๋ฅํด์ง๋ฏ๋ก ์ฐจ๋จํฉ๋๋ค.
3. ๋ธ๋ก๊ทธ ๋ ์ด์์ ๊นจ์ง ๋ฐฉ์ง
- div, table ๊ฐ์ ํ๊ทธ๊ฐ ๋๊ธ์ ๋ค์ด๊ฐ๋ฉด ์ ์ฒด ํ์ด์ง ๊ตฌ์กฐ๊ฐ ๋ฌด๋์ง ์ ์์ต๋๋ค.
4. ๋ถ๋ฒ ์ฝํ ์ธ ์ ํฌ ์ฐจ๋จ
- ์ฑ์ธ ์ฝํ ์ธ , ๋ถ๋ฒ ์์ ๋งํฌ ๋ฑ์ HTML๋ก ๋ ธ์ถํ๋ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํฉ๋๋ค.
HTML ํ๊ทธ ๋ณต์ ์คํฌ๋ฆฝํธ ์๊ฐ (์ด๋ฏธ์ง, ๋งํฌ ์๋ ํ์)
๊ทธ๋ฌ๋ ์ด์์๊ฐ ๋๊ธ์ ๊ด๋ฆฌํ ์ ์๋ค๋ฉด ๊ตณ์ด ์ด๋ฌํ ๊ธฐ๋ฅ์ ์ฐจ๋จํ ํ์๋ ์์ด ๋ณด์ด๊ธฐ๋ ํฉ๋๋ค. ๋๊ธ๋์ ํ์ฉํด ๋ธ๋ก๊ทธ๋ฅผ ๋์ฑ ํ์ฑํํ ์ ์๋ค๋ฉด, ๋๊ธ๋ ์ญ์ ์ฝํ ์ธ ์์ญ์ผ๋ก ํ์ฅํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์๋๋ ์ด๋ฏธ์ง์ ๋งํฌ๋ฅผ ํ์ฉํ์ฌ ๋๊ธ๋ ๊ธฐ๋ฅ์ ํ์ฅํ ์ ์๋ ์คํฌ๋ฆฝํธ ์ฝ๋์ ๋๋ค.
์ฝ๋ ๊ธฐ๋ฅ ์ค๋ช
์๋ ์คํฌ๋ฆฝํธ๋ ๋๊ธ์ img, a ๋ฑ HTML ํ๊ทธ๊ฐ ์ด์ค์ผ์ดํ๋ ์ฑ ์ ์ฅ๋์ด ์์ ๊ฒฝ์ฐ, ์ด๋ฅผ ์ค์ ํ๊ทธ๋ก ๋ณต์ํ๊ณ , ์ด๋ฏธ์ง๋ฅผ lazy-loading ์ฒ๋ฆฌํ๋ฉฐ, ๋ก๋ฉ ์ค๋ฅ ์ ์จ๊น ์ฒ๋ฆฌ๊น์ง ์ ์ฉํฉ๋๋ค.
์ ์ฉ ํจ๊ณผ
- ๋๊ธ์ ์ด๋ฏธ์ง, ๋งํฌ ์๋ ํ์
- ๋ณด์ ์ํ ์์ด HTML ํ๊ทธ ๋ณต์
- ๋๊ธ UI ์ ์ง ๋ฐ ๋ ์ด์์ ์์ ์ฑ ๋ณด์ฅ
- React ๊ธฐ๋ฐ ํฐ์คํ ๋ฆฌ ์คํจ์์๋ ์๋ ์ ์ฉ
๋จ. ์ฝ๋๋ ํ์ค๋ก ์์ฑํ์ธ์!
| ๊ตฌ๋ถ | ์ค๋ช |
| 1. HTML ๋์ฝ๋ฉ | ๋๊ธ ๋ด์ , ๋ฑ์ผ๋ก ํ์๋ HTML ์ฝ๋๋ฅผ ์ค์ ํ๊ทธ๋ก ๋ณํํฉ๋๋ค. |
| 2. ์ด๋ฏธ์ง lazy-loading ์ฒ๋ฆฌ | ์ด๋ฏธ์ง์ loading="lazy" ์์ฑ์ ์ถ๊ฐํด ํ์ด์ง ๋ก๋ฉ ์๋๋ฅผ ๊ฐ์ ํฉ๋๋ค. |
| 3. ์ด๋ฏธ์ง ์ค๋ฅ ์ฒ๋ฆฌ | ์ด๋ฏธ์ง๊ฐ ์ ๋๋ก ํ์๋์ง ์์ ๊ฒฝ์ฐ ํด๋น ์ด๋ฏธ์ง๋ฅผ ์จ๊น๋๋ค. |
| 4. ์ค๋ณต ์ฒ๋ฆฌ ๋ฐฉ์ง | ์ด๋ฏธ ์ฒ๋ฆฌํ ๋๊ธ์๋ ํ์ ์ฒ๋ฆฌ ์ค๋ณต์ ๋ง๊ธฐ ์ํ ํ์๋ฅผ ์ถ๊ฐํฉ๋๋ค. |
| 5. ๋์ ๋๊ธ ๋์ | ์๋ก์ด ๋๊ธ์ด ์ถ๊ฐ๋๊ฑฐ๋ ๋ณ๊ฒฝ๋ ๋ ์๋์ผ๋ก ๋ค์ ์ฒ๋ฆฌํด ์ค๋๋ค. |
| 6. ๋๊ธ ์์ฑ ํ ์ฌ์ฒ๋ฆฌ | ๋๊ธ ์์ฑ ํ 1์ด ๋ค์ ๋ค์ ํ๋ฒ ์ฒ๋ฆฌ๋ฅผ ์คํํ์ฌ ์ ์ ๋ฐ์์ ์ ์ฉํฉ๋๋ค. |
์ ์ฉ ์คํฌ๋ฆฝํธ ์ฝ๋
script
(function() {
const decodeEntities = (str) = {
const textarea = document.createElement("textarea");
textarea.innerHTML = str;
return textarea.value;
};
const processComments = () = {
const commentContainer = document.querySelector('[data-tistory-react-app="Comment"]');
if (!commentContainer) return;
commentContainer.querySelectorAll('.tt_desc').forEach((el) = {
if (!el.dataset.processed) {
const decoded = decodeEntities(el.innerHTML);
if (/[a-z][\s\S]*/i.test(decoded)) {
el.innerHTML = decoded;
el.querySelectorAll('img._LAZY_LOADING').forEach(img = {
img.classList.remove('_LAZY_LOADING_INIT_HIDE');
img.loading = 'lazy';
img.onerror = function() {
this.style.display = 'none';
};
});
}
el.dataset.processed = 'true';
}
});
};
if (document.readyState !== 'loading') {
processComments();
} else {
document.addEventListener('DOMContentLoaded', processComments);
}
const observer = new MutationObserver((mutations) = {
let shouldProcess = false;
mutations.forEach((mutation) = {
if (mutation.addedNodes.length) {
shouldProcess = true;
}
});
if (shouldProcess) {
processComments();
}
});
observer.observe(document.body, {
childList: true,
subtree: true
});
const commentForm = document.querySelector('.tt-area-write form');
if (commentForm) {
commentForm.addEventListener('submit', () = {
setTimeout(processComments, 1000);
});
}
})();
/script
์ ์ฉ ๋ฐฉ๋ฒ
- ํฐ์คํ ๋ฆฌ ๋ธ๋ก๊ทธ ๊ด๋ฆฌ์ ์ ์
- ์คํจ ํธ์ง HTML ํธ์ง
- body ํ๊ทธ ๋ฐ๋ก ๋ซํ๊ธฐ ์ง์ /body ์์ ์คํฌ๋ฆฝํธ ์ฝ์
- ์ ์ฅ ํ ๋ธ๋ก๊ทธ์์ ๋๊ธ ์์ญ ํ์ธ
๋๊ธ์ ํ์ฉํ ์ด๋ฏธ์ง ๋งํฌ์ ๋ด๋น๊ฒ์ด์ ํ
์ด ์คํฌ๋ฆฝํธ๋ฅผ ํ์ฉํ๋ฉด ๋ธ๋ก๊ทธ ๋๊ธ์ ์๋ก์ด ๋ค๋น๊ฒ์ด์ ์๋จ์ผ๋ก ๋ง๋ค ์ ์์ต๋๋ค:
- ๋ฐฉ๋ฌธ์,์ด์์๊ฐ ๋๊ธ๋ก ์ด๋ฏธ์ง ๋งํฌ๋ฅผ ๋จ๊ธฐ๋ฉด ์๋์ผ๋ก ๋ณด์
- a href="๋งํฌ"์ค๋ช /a ํํ๋ ๋ณต์๋๋ฏ๋ก ๊ด๋ จ ํ์ด์ง๋ก ์ฐ๊ฒฐ
- ๋๊ธ๋ก ๋ณด์กฐ ์ฝํ ์ธ , ์ฐธ๊ณ ์๋ฃ, ์ธ๋ถ ์ด๋ฏธ์ง ๋ฑ ๊ณต์ ๊ฐ๋ฅ
- ๋๊ธ ๊ธฐ๋ฐ ์ฌ์ฉ์ ์ฐธ์ฌํ ์ฝํ ์ธ ๊ณต๊ฐ ๊ตฌ์ฑ ๊ฐ๋ฅ
์ฃผ์์ฌํญ ๋ฐ ๋ณด์ ํ
- script ํ๊ทธ ์ฝ์ ์ ์์คํ ์์ ๋ฌด์กฐ๊ฑด ์ฐจ๋จ๋๋ฏ๋ก ์ด ์คํฌ๋ฆฝํธ ์ฌ์ฉ์ ๋ถ๊ฐ๋ฅ ํฉ๋๋ค.
- ๋๊ธ ํํฐ๋ง์ ๊ทธ๋๋ก ์ ์ง๋๋ฉฐ, ๋จ์ํ ๋ฌธ์์ด๋ก ๋ณด์ด๋ HTML์ ์ค์ ๋ก ๋ณต์ํด์ฃผ๋ ๊ธฐ๋ฅ์ ๋๋ค.
- ๊ด๋ฆฌ์๋ ์ ์ฑ ๋๊ธ ํํฐ๋ง์ ๋ณํํด์ผ ํฉ๋๋ค.
๋๊ธ ๊ธฐ๋ฅ์ ๋ธ๋ก๊ทธ ์ฝํ ์ธ ๋ก ํ์ฅ
์ด ์คํฌ๋ฆฝํธ๋ฅผ ํ์ฉํ๋ฉด ๋๊ธ ๊ธฐ๋ฅ์ด ๋จ์ํ ์ํต์ ๋์ด์ ๋ธ๋ก๊ทธ ์ฝํ ์ธ ์ ํ์ฅ ์ํฌ์ ์์ต๋๋ค.์ด๋ฏธ์ง ๋งํฌ, ์ฝํ ์ธ ์ฐ๊ฒฐ, ๋ณด์กฐ ์ ๋ณด ์ ๊ณต ๋ฑ ๋ค์ํ ๊ธฐ๋ฅ์ด ๊ฐ๋ฅํด์ง๋ฉฐ, ๋๊ธ์ ํตํด ๋ฐฉ๋ฌธ์์์ ์ง์์ ์ธ ์ํต๋ ์ ๋ํ ์์๋ ์ฅ์ ๋ ์์ต๋๋ค.