๋ฐ˜์‘ํ˜•

๋ฆฌ์•กํŠธ๋งŒ ํ•˜๋‹ค๋ณด๋‹ˆ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ง€์‹์ด ๋ชจ๋‘ ์ฆ๋ฐœํ•ด๋ฒ„๋ฆฐ ๋Š๋‚Œ....

๋ฉ”์„œ๋“œ๋ช…๋“ค์„ ์ฃ„๋‹ค ๊นŒ๋จน์–ด๋ฒ„๋ฆฐ ๊ฒƒ ๊ฐ™๋‹ค. ๊ธ‰ํ•˜๊ฒŒ ํˆฌ๋‘ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์–ด๋ณด๋ฉฐ ๊ธฐ์–ตํ•ด๋‚ด๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค.

 

DOM์„ ์กฐ์ž‘ํ•˜๊ธฐ ์œ„ํ•œ ๋‹ค์–‘ํ•œ ๋ฉ”์„œ๋“œ ์ค‘ ์–ด๋–ค ๊ฒƒ์„ ์„ ํƒํ•ด์•ผ ํ•  ์ง€ ๊ณ ๋ฏผ์ด ๋˜์—ˆ๋‹ค.

๋งค๋ฒˆ ๊นŒ๋จน์–ด์„œ ๋งค๋ฒˆ ๊ณ ๋ฏผํ•˜๊ณ  ๋งค๋ฒˆ ๊ฒ€์ƒ‰ํ•˜๊ณ !!! ์ง€๊ฒจ์›Œ... ์ด๋ฒˆ์—” ์ •๋ฆฌํ•ด๋†”์•ผ์ง€.


ํ…์ŠคํŠธ ์ฝ˜ํ…์ธ ๋ฅผ ๋‹ค๋ฃจ๊ธฐ:  innerText,textContent

๐Ÿ“š innerText

  • ์š”์†Œ์˜ ๋ Œ๋”๋ง๋œ ํ…์ŠคํŠธ๋งŒ ๋‹ค๋ฃจ๊ธฐ ๋•Œ๋ฌธ์— ์Šคํƒ€์ผ์ด ์ ์šฉ๋œ ํ›„์˜ ํ…์ŠคํŠธ๋งŒ ๊ฐ€์ ธ์˜จ๋‹ค.
  • display: none์ด๋‚˜ visibility: hidden์œผ๋กœ ์ˆจ๊ฒจ์ง„ ์š”์†Œ์˜ ํ…์ŠคํŠธ๋„ textContent๋กœ๋Š” ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, innerText๋Š” ์ˆจ๊ฒจ์ง„ ์š”์†Œ์˜ ํ…์ŠคํŠธ๋ฅผ ๋ฌด์‹œํ•œ๋‹ค.
  • textContent๋ณด๋‹ค ๋ Œ๋”๋ง ๊ฒฐ๊ณผ์— ์˜์กดํ•˜๋ฏ€๋กœ ๋ณต์žกํ•œ ๊ตฌ์กฐ์—์„œ๋Š” ์กฐ๊ธˆ ๋” ๊นŒ๋‹ค๋กœ์šธ ์ˆ˜ ์žˆ๋‹ค.
  • innerText๋Š” DOM์˜ ์Šคํƒ€์ผ์„ ๊ณ„์‚ฐํ•˜๋ฏ€๋กœ textContent๋ณด๋‹ค ์•ฝ๊ฐ„ ๋Š๋ฆด ์ˆ˜ ์žˆ์ง€๋งŒ, ์ผ๋ฐ˜์ ์ธ ์ƒํ™ฉ์—์„œ๋Š” ํฐ ์ฐจ์ด๊ฐ€ ์—†๋‹ค.

๐Ÿ“š textContent

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

HTML ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์‚ฝ์ž…: innerHTML, appendChild, insertAdjacentHTML

๐Ÿ“š innerHTML 

  • ์š”์†Œ ๋‚ด๋ถ€์˜ HTML์ด๋‚˜ XML ๋งˆํฌ์—…์„ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ์„ค์ •ํ•œ๋‹ค.
  • HTML ๋งˆํฌ์—…์„ ํฌํ•จํ•œ ๋ฌธ์ž์—ด์„ ์‰ฝ๊ฒŒ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ๋‹ค. ์†๋„๊ฐ€ ๋น ๋ฅด๋‹ค.
  • ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ,  ํฌ๋กœ์Šค ์‚ฌ์ดํŠธ ์Šคํฌ๋ฆฝํŒ…(XSS) ๊ณต๊ฒฉ์— ์ทจ์•ฝํ•˜๋‹ค.
    • ๋‚ด์šฉ์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ์ถ”๊ฐ€์ ์œผ๋กœ HTML์„ ์‚ฝ์ž…ํ•˜๊ณ ์ž ํ•  ๋•Œ๋Š” insertAdjacentHTML() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์ ํ•ฉํ•˜๋‹ค.
      ..Why๐Ÿง?
      innerHTML์€ ์š”์†Œ์˜ ๋ชจ๋“  ๋‚ด์šฉ์„ ๋‹ค์‹œ ๋ Œ๋”๋งํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ณ , ๊ธฐ์กด์˜ ์ž์‹ ์š”์†Œ๊ฐ€ ์†์ƒ๋  ์ˆ˜ ์žˆ๋‹ค. ๋ฐ˜๋ฉด, insertAdjacentHTML()์€ ๊ธฐ์กด์˜ DOM ๊ตฌ์กฐ๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ ์ƒˆ๋กœ์šด HTML์„ ํšจ์œจ์ ์œผ๋กœ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ์–ด ์„ฑ๋Šฅ๊ณผ ์•ˆ์ •์„ฑ ๋ฉด์—์„œ ์œ ๋ฆฌํ•˜๋‹ค.

๐Ÿ“š  insertAdjacentHTML() 

  • element.insertAdjacentHTML(position, text)
  • ๊ธฐ์กด ์š”์†Œ๋ฅผ ์œ ์ง€ํ•œ ์ฑ„๋กœ ์ง€์ •๋œ ์œ„์น˜(position)์— HTML ๋ฌธ์ž์—ด์„ ํŒŒ์‹ฑํ•˜์—ฌ ์š”์†Œ๋กœ ์‚ฝ์ž…ํ•œ๋‹ค.
  • insertAdjacentHTML์€ ์š”์†Œ๋ฅผ ๋‹ค์‹œ ํŒŒ์‹ฑํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ํ•ด๋‹น ์š”์†Œ ์•ˆ์˜ ๊ธฐ์กด ์ž์‹ ์š”์†Œ๋ฅผ ์†์ƒ์‹œํ‚ค์ง€ ์•Š๋Š”๋‹ค.
  • HTML์„ ํ•œ ๋ฒˆ์— ์ถ”๊ฐ€ํ•˜๋ฏ€๋กœ ์„ฑ๋Šฅ์ด ๋น ๋ฅผ ์ˆ˜ ์žˆ์ง€๋งŒ ๋ณด์•ˆ ๋ฌธ์ œ(XSS: Cross-site scripting)๋กœ ์ธํ•ด ์™ธ๋ถ€ ์ž…๋ ฅ์„ ์‚ฝ์ž…ํ•  ๋•Œ๋Š” ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.
const el = document.getElementById('el')
el.insertAdjacentHTML('beforebegin', '<span>Before Begin</span>');// el ์ด์ „์— ์‚ฝ์ž…
el.insertAdjacentHTML('afterbegin', '<span>After Begin</span>'); // el์˜ ์ฒซ ๋ฒˆ์งธ ์ž์‹ ์ด์ „์— ์‚ฝ์ž…
el.insertAdjacentHTML('beforeend', '<span>Before End</span>'); // el์˜ ๋งˆ์ง€๋ง‰ ์ž์‹ ์ดํ›„์— ์‚ฝ์ž… 
el.insertAdjacentHTML('afterend', '<span>After End</span>'); // el ์ดํ›„์— ์‚ฝ์ž…
<span> --A-- </span>
<span>Before Begin</span> 
<span id="el"> 
	<span>After Begin</span> 
    <span> --B-- </span>
    --C-- 
    <span> --D-- </span> 
    <span>Before End</span> 
 </span> 
 <span>After End</span> 
 <span> --E-- </span>

 

๐Ÿ“š appendChild()

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

โœจ ๊ฒฐ๋ก 

innerText vs textContent

innerText๋Š” ๋ Œ๋”๋ง๋œ ํ…์ŠคํŠธ๋งŒ ๋‹ค๋ฃจ๊ธฐ ๋•Œ๋ฌธ์— ์Šคํƒ€์ผ์— ์˜์กด์ ์ด๋‹ค. ๋˜ํ•œ ์ˆจ๊ฒจ์ง„ ์š”์†Œ์˜ ํ…์ŠคํŠธ๋Š” ๋ฌด์‹œ๋˜๋ฏ€๋กœ, ์ˆœ์ˆ˜ํ•œ ํ…์ŠคํŠธ ์ฒ˜๋ฆฌ์—์„œ๋Š” textContent๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋”์šฑ ๋น ๋ฅด๊ณ  ๋‹จ์ˆœํ•˜๋‹ค. DOM ๊ตฌ์กฐ๋ฅผ ๋‹ค์‹œ ๋ Œ๋”๋งํ•˜์ง€ ์•Š๊ณ  ์ˆœ์ˆ˜ ํ…์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์„ฑ๋Šฅ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๊ฑฐ์˜ ์—†๋‹ค. 

 

innerHTML vs insertAdjacentHTML vs appendChild

innerHTML์€ ๊ธฐ์กด์˜ ๋ชจ๋“  ๋‚ด์šฉ์„ ๋ฎ์–ด์“ฐ๊ธฐ ๋•Œ๋ฌธ์—, ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ๋‹ค. insertAdjacentHTML์€ ๊ธฐ์กด ์š”์†Œ๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ ์ƒˆ๋กœ์šด HTML์„ ์ถ”๊ฐ€ํ•˜๋ฏ€๋กœ ๋” ๋‚˜์€ ์„ฑ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. (์ž์‹์š”์†Œ์˜ ํŒŒ์‹ฑ๊ณผ์ •์ด ์ƒ๋žต๋˜์–ด ๋” ๋น ๋ฅด๊ณ  ์„ฑ๋Šฅโฌ†)

 

ํ•˜์ง€๋งŒ insertAdjacentHTML๊ณผ innerHTML์€ XSS ๊ณต๊ฒฉ์— ์ทจ์•ฝํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด appendChild๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์•ˆ์ „ํ•˜๋‹ค๊ณ  ํŒ๋‹จํ•˜์˜€๋‹ค. ์„ฑ๋Šฅ ๋ฉด์—์„œ๋„ ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ์—์„œ๋Š” ์ถฉ๋ถ„ํ•˜๋‹ค๊ณ  ์ƒ๊ฐ๋œ๋‹ค.

 


๐Ÿง ์ฐธ๊ณ 
https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/innerText
https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent

https://developer.mozilla.org/ko/docs/Web/API/Element/innerHTML

https://developer.mozilla.org/ko/docs/Web/API/Element/insertAdjacentHTML

https://developer.mozilla.org/en-US/docs/Web/API/Node/appendChild

๋ฐ˜์‘ํ˜•

+ Recent posts