๐ŸฆŽ [๋”ฅ๋‹ค์ด๋ธŒ ์Šคํ„ฐ๋””] 2nd- 39. DOM

์ด์ง€ยท2021๋…„ 9์›” 11์ผ
0

DeepDive

๋ชฉ๋ก ๋ณด๊ธฐ
3/13

1. querySelectorAll๋กœ ์ทจ๋“ํ•œ ์š”์†Œ ๋…ธ๋“œ์™€ getElementsByTagName์œผ๋กœ ์ทจ๋“ํ•œ ์š”์†Œ ๋…ธ๋“œ์˜ ๊ณตํ†ต์ ๊ณผ ์ฐจ์ด์ ์„ ์„ค๋ช…ํ•ด๋ณด์‹œ์˜ค.

query selector all โ‡’ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•œ css ์„ ํƒ์ž๋ฅผ ๋งŒ์กฑ์‹œํ‚ค๋Š” ๋ชจ๋“  ์š”์†Œ ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•˜์—ฌ ๋ฐ˜ํ™˜. ์—ฌ๋Ÿฌ๊ฐœ์˜ ์š”์†Œ ๋…ธ๋“œ ๊ฐ์ฒด๋ฅผ ๊ฐ–๋Š” dom ์ปฌ๋ ‰์…˜ ๊ฐ์ฒด์ธ nodelist๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด๋Š” ์œ ์‚ฌ๋ฐฐ์—ด๊ฐ์ฒด์ด๋ฉด์„œ ์ดํ„ฐ๋Ÿฌ๋ธ”์ด๋‹ค.

htmlcollection VS nodelist : htmlcollection์€ live nodelist, nodelist๋Š” static ํ˜•ํƒœ์˜ node list๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. getElementsByTagName method ๋Š” htmlcollection์„, querySelectorAll์€ static node list๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, live nodelist ๋Š” ์œ„ํ—˜์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

example

<!doctype html> 
<html> 
<head> 
    <meta charset="utf-8"> 
    <title>Yandex</title> 

</head> 
<body> 
    <a href="((http://yandex.ru))">ะฏะฝะดะตะบั</a>, 
    <a href="((http://yandex.com))">Yandex</a> 
</body> 
<script>

var elems1 = document.getElementsByTagName('a'), // return 2 lements, elems1.length = 2 
    elems2 = document.querySelectorAll("a");  // return 2 elements, elems2.length = 2 

document.body.appendChild(document.createElement("a")); 

console.log(elems1.length, elems2.length);  // now elems1.length = 3! 
                                            // while elems2.length = 2
</script>
</html>

2. ์š”์†Œ ๋…ธ๋“œ์˜ ํ…์ŠคํŠธ๋ฅผ ์กฐ์ž‘ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ตœ์†Œ 2๊ฐœ ์ด์ƒ ๋งํ•˜๊ณ  ๊ฐ๊ฐ์˜ ์ฐจ์ด์ ์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด๋ณด์‹œ์˜ค.

createtextnode โ‡’ ํ…์ŠคํŠธ๋…ธ๋“œ๋Š” ์š”์†Œ๋…ธ๋“œ์˜ ์ž์‹๋…ธ๋“œ์ด์ง€๋งŒ, ์ด๋ฅผ ํ†ตํ•ด ์ƒ์„ฑํ•œ ํ…์ŠคํŠธ๋…ธ๋“œ๋Š” ์š”์†Œ ๋…ธ๋“œ์˜ ์ž์‹๋…ธ๋“œ๋กœ ์ถ”๊ฐ€๋˜์ง€ ์•Š๊ณ  ํ™€๋กœ ์กด์žฌํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์ดํ›„์— ์ƒ๋œ ํ…์ŠคํŠธ ๋…ธ๋“œ๋ฅผ ์š”์†Œ ๋…ธ๋“œ์— ์ถ”๊ฐ€ํ•˜๋Š” ๋ณ„๋„ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ex. appendChild..

์š”์†Œ ๋…ธ๋“œ์— ์ž์‹๋…ธ๋“œ๊ฐ€ ํ•˜๋‚˜๋„ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” ํ…์ŠคํŠธ ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์š”์†Œ ๋…ธ๋“œ์˜ ์ž์‹๋…ธ๋“œ๋กœ ํ…์ŠคํŠธ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ ๋ณด๋‹ค textContext ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํŽธ์ด ํ›จ์”ฌ ๊ฐ„ํŽธํ•˜๋‹ค. ๋‹จ, ์š”์†Œ ๋…ธ๋“œ์— ์ž์‹๋…ธ๋“œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๋ชจ๋“  ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์ œ๊ฑฐ๋˜๊ณ  ํ• ๋‹น๋œ ๋ฌธ์ž์—ด์ด ํ…์ŠคํŠธ๋กœ ์ถ”๊ฐ€๋˜๋ฏ€๋กœ ์ฃผ์˜ํ•ด์•ผํ•œ๋‹ค.

HTML Collection ๊ฐ์ฒด๋Š” ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋…ธ๋“œ ๊ฐ์ฒด์˜ ์ƒํƒœ ๋ณ€๊ฒฝ์„ ๋ฐ˜์˜ํ•˜์—ฌ ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— for๋ฌธ์„ ์ˆœํšŒํ•˜์—ฌ ๋…ธ๋“œ ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์„ ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.

3.htmlcollection ๊ฐ์ฒด๋ฅผ for ๋ฌธ์œผ๋กœ ์ˆœํšŒํ•˜๋ฉฐ ๋…ธ๋“œ ๊ฐ์ฒด๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ ์ฃผ์˜ํ•ด์•ผํ•  ์‚ฌํ•ญ์€? ๊ทธ๋ฆฌ๊ณ  ์ด๋ฅผ ํšŒํ”ผํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ผ๊นŒ?

htmlCollection์€ ์œ ์‚ฌ๋ฐฐ์—ด๋กœlive nodelist ํ˜•ํƒœ์ด๊ธฐ ๋•Œ๋ฌธ์—, ๋…ธ๋“œ๊ฐ์ฒด๋ฅผ ์‚ฝ์ž…ํ•˜๊ฑฐ๋‚˜ ์ƒ์„ฑํ•  ๋•Œ, index์˜ ๊ฐ’์ด ๊ณ„์† ๋ณ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— for๋ฌธ์„ ๋Œ๋ฆด ๋•Œ ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํšŒํ”ผํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” 1. for๋ฌธ์„ ์—ญ์ˆœ์œผ๋กœ ์ˆœํšŒํ•˜์—ฌ ๋…ธ๋“œ ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•œ๋‹ค. 2. while๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ๋…ธ๋“œ ๊ฐ์ฒด์˜ ์ƒํƒœ๊ฐ€ ๋ฐ”๋€”๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค. 3. ์œ ์‚ฌ ๋ฐฐ์—ด์„ ๊ฐ์ฒด๋ฅผ ๋ฐฐ์—ด๋กœ ๋ณ€๊ฒฝํ•œ ๋’ค, ๋ฐฐ์—ด์ด ๊ฐ€์ง„ ๊ณ ์ฐจํ•จ์ˆ˜์ธ forEach ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๋…ธ๋“œ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•œ๋‹ค. ๋“ฑ 3๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

4. ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ์ž…๋ ฅ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋Œ€๋กœ inner HTML ํ”„๋กœํผํ‹ฐ์— ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ค ๋ฌธ์ œ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š”๊ฐ€: ์˜ˆ์‹œ + ์˜ˆ๋ฐฉ๋ฒ•

XSS(Cross Stie Scripting) ๊ณต๊ฒฉ์— ์ทจ์•ฝํ•˜๋‹ค.

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

์ด๋ฅผ ์˜ˆ๋ฐฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ์ž…๋ ฅ๋ฐ›์€ ๋ฐ์ดํ„ฐ์˜ ์ž ์žฌ์  ์œ„ํ—˜์„ ์ œ๊ฑฐํ•˜๋Š” HTML sanitization ๊ณผ์ •์ด ํ•„์š”ํ•˜๋‹ค. ์ง์ ‘ ๊ตฌํ˜„ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์•ˆ์ •์ ์œผ๋กœ ๋ฐฐํฌ๋˜์–ด ์‚ฌ์šฉ์ค‘์ธ DOMPurify๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค.

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

5. insertAdjacentHTML ์ด innerHTML ๋ฉ”์„œ๋“œ์— ๋น„ํ•ด ๊ฐ€์ง€๋Š” ์žฅ์ ?

insertAdjacent์™€ innerHTML ๋ฉ”์„œ๋“œ ๋‘˜ ๋‹ค DOM ์กฐ์ž‘์‹œ ์‚ฌ์šฉ๋˜๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค. ๋‘ ๋ฉ”์„œ๋“œ๋Š” textContent(innerText)์™€ ๋‹ค๋ฅด๊ฒŒ ์š”์†Œ ๋…ธ๋“œ์˜ ๋ชจ๋“  ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์ œ๊ฑฐ๋˜๊ณ  ํ• ๋‹นํ•œ ๋ฌธ์ž์—ด์— ํฌํ•จ๋˜์–ด ์žˆ๋Š” HTML ๋งˆํฌ์—…์ด ํŒŒ์‹ฑ๋˜์–ด ์š”์†Œ ๋…ธ๋“œ์˜ ์ž์‹ ๋…ธ๋“œ๋กœ DOM์— ๋ฐ˜์˜๋œ๋‹ค๋Š” ๊ณตํ†ต์ ์ด ์žˆ๋‹ค. ๋ฐ˜๋ฉด textContent๋Š” HTML ๋งˆํฌ์—…์ด ํŒŒ์‹ฑ๋˜์ง€ ์•Š๊ณ  text ํ˜•ํƒœ๋กœ ๋ฐ˜์˜๋œ๋‹ค.

์ฐจ์ด๋Š” ๊ธฐ์กด์˜ ์š”์†Œ ๋…ธ๋“œ๋ฅผ ์ œ๊ฑฐํ•˜์ง€ ์•Š๊ณ  ์š”์†Œ ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์‚ฝ์ž…ํ•  ๋•Œ innerHTML์€ ์œ„์น˜๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์—†์–ด ๊ธฐ์กด ๋…ธ๋“œ๋ฅผ ์ œ๊ฑฐํ–ˆ๋‹ค๊ฐ€ ์ƒˆ๋กœ์šด ๋…ธ๋“œ์™€ ๊ฐ™์ด ์‚ฝ์ž…ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์ ์œผ๋กœ ์ข‹์ง€ ์•Š์ง€๋งŒ(reflow, repaint๊ฐ€ ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ฐœ์ƒ) insetAdjacent๋Š” ๊ธฐ์กด์˜ ์š”์†Œ ๋…ธ๋“œ๋Š” ์‚ญ์ œํ•˜์ง€ ์•Š์œผ๋ฉด์„œ ์ƒˆ๋กœ ์ƒ์„ฑํ•œ ๋…ธ๋“œ๋ฅผ ์œ„์น˜๋ฅผ ์ง€์ •ํ•ด์„œ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด๋‹ค. ์ฆ‰ ๋” ํšจ์œจ์ ์ด๋‹ค.

profile
์ด์ง€ํ”ผ์ง€๋ ˆ๋ชฌ์Šคํ€ด์ง€๐Ÿ‹

0๊ฐœ์˜ ๋Œ“๊ธ€

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด