dompurify
npm
React 개발을 하다보면 어쩔수 없이 dangerouslySetInnerHTML
을 사용해야 할때가 있습니다. CMS 에서 가져온 HTML을 그대로 렌더링하거나, 위지윅 에디터 또는 Markdown 을 HTML로 변환해야 할때 등등 인데요.
문제는 dangerous
라는 이름이 붙은 만큼 dangerouslySetInnerHTML
은 보안상 XSS(Cross-Site Scripting)
공격의 위험이 됩니다. XSS공격 이란 웹사이트에 악의적인 스크립트를 주입하는 공격 기법으로 사용자 입력값이 직접 HTML로 삽입되는 경우, 공격자는 악성 스크립트를 삽입하여 실행시킬수 있습니다. 이런 이유로 React 팀에서는 이 기능의 위험성을 강조하기 위해 일부러 'dangerous
' 라는 이름을 사용했다고 설명하고 있는데요.
따라서 dangerouslySetInnerHTML
을 어쩔수 없이 사용할때는 Sanitization
(살균, 소독)을 시켜야 합니다. React 공식 문서에서도 HTML을 직접 삽입할 때는 XSS 방지를 위한 소독(sanitization)이 필요하다고 언급하고 있는데요. 마치 의료기구를 소독해서 세균을 제거하듯이, 사용자가 입력한 데이터에서 악성 코드를 자동으로 제거할 수 있습니다.
따라서 이런 경우 DOMPurify 같은 라이브러리 사용을 추천합니다. 사용법또한 매우 간단합니다. DOMPurify.sanitize 함수로 해당 HTML을 감싸주기만 하면 됩니다.
<div dangerouslySetInnerHTML={{
__html: DOMPurify.sanitize(dirtyHTML)
}} />
React 팀에서는 가능하면 dangerouslySetInnerHTML
사용을 피하되 꼭 필요한 경우에는 Sanitize 하는걸 권장하고 있습니다. 따라서 dangerouslySetInnerHTML
을 어쩔 수 없이 사용해야 할 경우에는 DOMPurify 라이브러리를 이용해 소독하는 과정을 거쳐 보안을 좀 더 강화할 것을 추천드립니다.
https://www.npmjs.com/package/dompurify
다음 내용이 궁금하다면?
이미 회원이신가요?
2025년 2월 16일 오전 2:17