Intro
์๋ ํ์ธ์. ๋ฆฌ์กํธ์์ innerHtml์ ํ์ํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค. ์ต๊ทผ์ ์ค๋งํธ์๋ํฐ ๊ด๋ จํ ์์ ์ ์งํํ๊ณ ์์์ต๋๋ค. ์๋ํฐ์ ์ ์ฅ๋ ๋ด์ฉ์ด ๊ทธ๋๋ก html tag๋ก ์ ์ฅ๋๊ณ , ์ ์ฅ๋ html tag๋ฅผ ๊ทธ๋๋ก ํ๋ฉด์ ํ์ํด์ผ ํ์ฃ . ์ ์ฅ๋ ์ด innerHtml๋ฅผ ์ด๋ป๊ฒ ํ์ํด์ผ ํ ๊น์? ํจ๊ป ์์๋ด ์๋ค :)
How to solve the problem
React์์ innerHtml๋ฅผ ํ์ํ๋ ์ํด์๋ ์๋ ์ฝ๋์ ๊ฐ์ด dangerouslySetInnerHTML๋ฅผ ํ์ฉํ ์ ์์ต๋๋ค.
import React from 'react';
function MyComponent() {
const sampleHtml = '<p>Hello world! </p>';
return (
<div dangerouslySetInnerHTML={{ __html: sampleHtml }} />
);
}
์ฌ๊ธฐ์ dangerouslySetInnerHTML์ prop ๊ฐ์ผ๋ก html ๊ฐ์ ์ ๋ฌํ๊ณ ์๊ณ , ์ด๋ __html์ด๋ผ๋ ์์ฑ์ ๊ฐ๊ณ ์์ต๋๋ค. __html ์์ฑ์ ๋ฆฌ์กํธ์์ ํ์ฉํ์ง ์๋ HTML ๋ฌธ์์ด์ ํฌํจํ ์ ์๋ค๊ณ ํฉ๋๋ค.
- script tag
- on ์ ๋์ฌ๋ฅผ ๊ฐ์ง ์ด๋ฒคํธ ํธ๋ค๋ฌ (ex. onclick, onload)
- javascript URL (ex. href ์์ฑ, src ์์ฑ)
- style ์์ฑ
- form ํ๊ทธ
์ฃผ์์
๋ณด์ ๋ฌธ์ ๋๋ฌธ์ ์ ์คํ๊ฒ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ๋ด์ฉ์ ๋ ๋๋งํด์ผ ํ๋ ๊ฒฝ์ฐ, ์ฌ์ฉ์๊ฐ ์ ์ฑ ์คํฌ๋ฆฝํธ๋ฅผ ์ฝ์ ํ๋ ๋ฑ์ ๋ณด์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์ด๋ฐ ๊ฒฝ์ฐ์๋ ์ ๋ ฅ ๊ฐ์ ๋ณด์ ๊ฒ์ฌ๋ฅผ ํตํด ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ์๋ฐฉํด์ผ ํฉ๋๋ค.
๋ณด์ ๊ฒ์ฌ ๋ฐฉ๋ฒ
๋ณด์๊ฒ์ฌ ๋ฐฉ๋ฒ์๋ ์ฌ๋ฌ ๋ฐฉ๋ฒ์ด ์์ ์ ์๋๋ฐ์, ๋ฆฌ์กํธ์์๋ DOMPurify์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋ ฅ ๊ฐ์ ๋ณด์ ๊ฒ์ฌ๋ฅผ ์คํํ ์ ์์ต๋๋ค. ์๋๋ ์์ ์ฝ๋์ ๋๋ค.
import React from 'react';
import DOMPurify from 'dompurify';
function MyComponent({ htmlContent }) {
const sanitizedHtml = DOMPurify.sanitize(htmlContent);
return (
<div dangerouslySetInnerHTML={{ __html: sanitizedHtml }} />
);
}