innerHTML

1. ๊ฐœ์š”

textContent ํ”„๋กœํผํ‹ฐ, innerText ํ”„๋กœํผํ‹ฐ๋Š” HTML ๋งˆํฌ์—…์ด ํŒŒ์‹ฑ๋˜์ง€ ์•Š์€ ์ฑ„ ํ…์ŠคํŠธ์˜ ํ˜•ํƒœ๋กœ ์ถ”๊ฐ€๋œ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ํ…์ŠคํŠธ ๋…ธ๋“œ์— HTML ๋งˆํฌ์—…์„ ํŒŒ์‹ฑํ•˜์—ฌ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ผ๊นŒ? ๋ฐ”๋กœ innerHTML ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

innerHTML ํ”„๋กœํผํ‹ฐ๋Š” ์š”์†Œ ๋…ธ๋“œ์˜ HTML ๋งˆํฌ์—…์„ ์ทจ๋“ํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.


2. innerHTML ํ”„๋กœํ”ผํ„ฐ ๋ฐ˜ํ™˜ ๊ฐ’

<!DOCTYPE html>
<html lang="en">
  <body>
    <div id="foo">
      Hello
      <span>world</span>
    </div>
    <script>
      const $foo = document.getElementById("foo");
      console.log($foo.innerHTML);
    </script>
  </body>
</html>

์œ„์˜ ์ฝ”๋“œ์—์„œ ์ฝ˜์†” ๊ฐ’์œผ๋ก  "Hello <span>world</span>"์ด ์ถœ๋ ฅ๋œ๋‹ค.


3. innerHTML ํ”„๋กœํ”ผํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž์‹ ๋…ธ๋“œ ์ˆ˜์ •ํ•˜๊ธฐ

์š”์†Œ ๋…ธ๋“œ์˜ innerHTML ํ”„๋กœํผํ‹ฐ์— ๋ฌธ์ž์—ด์„ ํ• ๋‹นํ•˜๋ฉด ์š”์†Œ ๋…ธ๋“œ์˜ ๋ชจ๋“  ์ž์‹ ๋…ธ๋“œ๊ฐ€ ์ œ๊ฑฐ๋˜๊ณ  ํ• ๋‹นํ•œ ๋ฌธ์ž์—ด์— ํฌํ•จ๋˜์–ด ์žˆ๋Š” HTML ๋งˆํฌ์—…์ด ํŒŒ์‹ฑ๋˜์–ด ์š”์†Œ ๋…ธ๋“œ์˜ ์ž์‹ ๋…ธ๋“œ๋กœ DOM์— ๋ฐ˜์˜ํ•œ๋‹ค.

<!DOCTYPE html>
<html lang="en">
  <body>
    <div id="foo">
      Hello
      <span>world</span>
    </div>
    <script>
      const $foo = document.getElementById("foo");
      $foo.innerHTML = "Hi <span>everyone</span>";
    </script>
  </body>
</html>

innerHTML ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์•„๋ž˜์˜ ์˜ˆ์‹œ์ฒ˜๋Ÿผ ๋…ธ๋“œ ์ถ”๊ฐ€, ๊ต์ฒด, ์‚ญ์ œ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

<!DOCTYPE html>
<html lang="en">
  <body>
    <ul id="animal">
      <li>dog</li>
    </ul>
    <script>
      const $foo = document.getElementById("animal");
      // ๋…ธ๋“œ ์ถ”๊ฐ€
      $foo.innerHTML += "<li>cat</li>";
      $foo.innerHTML += "<li>lion</li>";

      // ๋…ธ๋“œ ๊ต์ฒด
      $foo.innerHTML = "<li>tiger</li>";

      // ๋…ธ๋“œ ์‚ญ์ œ
      $foo.innerHTML = "";
    </script>
  </body>
</html>

4. innerHTML ํ”„๋กœํผํ‹ฐ์˜ ๋‹จ์ 

4-1. ์ทจ์•ฝํ•œ ํฌ๋กœ์Šค ์‚ฌ์ดํŠธ ์ŠคํŠธ๋ฆฝํŒ… ๊ณต๊ฒฉ

<!DOCTYPE html>
<html lang="en">
  <body>
    <div id="foo">
      Hello
      <span>world</span>
    </div>
    <script>
      const $foo = document.getElementById("foo");
      $foo.innerHTML = `<img src="x" onerror="alert(document.cookie)">`;
    </script>
  </body>
</html>

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

๋Œ€ํ‘œ์ ์ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” DOMPurify๊ฐ€ ์žˆ๋‹ค.


4-2. ๋ชจ๋“  ์ž์‹ ๋…ธ๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  DOM์„ ๋ณ€๊ฒฝ

<!DOCTYPE html>
<html lang="en">
  <body>
    <ul id="animal">
      <li>dog</li>
    </ul>
    <script>
      const $foo = document.getElementById("animal");
      $foo.innerHTML += "<li>cat</li>";
    </script>
  </body>
</html>

์œ„์˜ ์˜ˆ์‹œ์—์„œ <li>dog</li>๋Š” ๋ณ€๊ฒฝ์ด ์—†์œผ๋ฏ€๋กœ ๋‹ค์‹œ ์ƒ์„ฑํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ํ•˜์ง€๋งŒ $foo.innerHTML += "<li>cat</li>";์œผ๋กœ ์ธํ•ด <li>dog</li>๋Š” ์‚ญ์ œ๋˜์—ˆ๋‹ค๊ฐ€ ๋‹ค์‹œ ์ƒ์„ฑ๋œ๋‹ค.

์ฆ‰, innerHTML ํ”„๋กœํผํ‹ฐ์— HTML ๋งˆํฌ์—… ๋ฌธ์ž์—ด์„ ํ• ๋‹นํ•˜๋ฉด ์œ ์ง€๋˜์–ด๋„ ์ข‹์€ ๊ธฐ์กด์˜ ์ž์‹ ๋…ธ๋“œ๊นŒ์ง€ ๋ชจ๋‘ ์ œ๊ฑฐํ•˜๊ณ  ๋‹ค์‹œ ์ฒ˜์Œ๋ถ€ํ„ฐ ์ƒˆ๋กญ๊ฒŒ ์ž์‹ ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ DOM์— ๋ฐ˜์˜ํ•œ๋‹ค. ์ด๋ฅผ ํšจ์œจ์ ์ด์ง€ ์•Š๋‹ค.


4-3. ๋ถˆ๊ฐ€๋Šฅํ•œ ์ƒˆ๋กœ์šด ์š”์†Œ๋ฅผ ์‚ฝ์ž…ํ•  ๋•Œ ์‚ฝ์ž…๋  ์œ„์น˜ ์ง€์ •

<ul id="animal">
  <li>dog</li>
  <li>cat</li>
</ul>

innerHTML ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ dog์™€ cat ์‚ฌ์ด์— ์ƒˆ๋กœ์šด ์š”์†Œ๋ฅผ ์‚ฝ์ž…ํ•  ์ˆ˜ ์—†๋‹ค.

innerHTML ํ”„๋กœํผํ‹ฐ๋Š” ๋ณต์žกํ•˜์ง€ ์•Š์€ ์š”์†Œ๋ฅผ ์ƒˆ๋กญ๊ฒŒ ์ถ”๊ฐ€ํ•  ๋•Œ ์œ ์šฉํ•˜์ง€๋งŒ ๊ธฐ์กด ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•˜์ง€ ์•Š์œผ๋ฉด ์œ„์น˜๋ฅผ ์ง€์ •ํ•ด ์ƒˆ๋กœ์šด ์š”์†Œ๋ฅผ ์‚ฝ์ž…ํ•ด์•ผ ํ•  ๋•Œ๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.


5. Conclusion

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


์ฐธ๊ณ 

๋„์„œ - ๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Deep Dive: ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๊ธฐ๋ณธ ๊ฐœ๋…๊ณผ ๋™์ž‘ ์›๋ฆฌ


๐Ÿ“… 2022-10-13

Last updated