새로운 메서드인 setHTML, setHTMLUnsafe에 대해 알고 계신가요? 이 새로운 메서드는 개발자들에게 매우 유용한 도구가 될 수 있습니다. 그런데 이 메서드의 이름이 왜 ‘unsafe’로 명명되었는지, 그리고 어떻게 사용해야 할지 궁금하지 않으신가요? 지금부터 함께 알아보겠습니다.
setHTMLUnsafe란 무엇인가요?
setHTMLUnsafe는 innerHTML과 유사하게 작동하지만, 그 이름에서 알 수 있듯이 안전하지 않은(unsafe) 방법으로 HTML을 설정하는 메서드입니다. 이 메서드는 입력 값에 대한 검증을 수행하지 않기 때문에, XSS(Cross-Site Scripting) 공격에 노출될 수 있는 위험이 있습니다.
예를 들어, 사용자가 텍스트 입력 필드에 `<img src=”doesnotexist”>`와 같은 값을 입력하면, 해당 값이 그대로 HTML로 렌더링됩니다. 이 경우 이미지가 로드되지 않더라도 자바스크립트는 실행될 수 있습니다. 이러한 위험 때문에 setHTMLUnsafe는 신중하게 사용해야 합니다.
왜 setHTMLUnsafe가 필요할까요?
innerHTML 메서드는 HTML 조각(fragment)을 보관하거나 렌더링되지 않는 HTML을 삽입하는 데 유용합니다. 그러나 선언적 섀도 DOM(declarative shadow DOM)을 생성하려면 setHTMLUnsafe가 필요합니다. 섀도 DOM은 웹 컴포넌트의 핵심 기술로, 특정 요소의 스타일과 구조를 캡슐화하여 다른 요소와 독립적으로 작동하도록 합니다.
예를 들어, 다음 코드를 보겠습니다:
const main = document.querySelector('main');
main.setHTMLUnsafe(`
<h2>I am in the Light DOM</h2>
<div>
<template shadowrootmode="open">
<style>
h2 { color: blue; }
</style>
<h2>Shadow DOM</h2>
</template>
</div>
`);
이 코드는 섀도 DOM을 동적으로 추가하여 `template`의 내용을 렌더링합니다. 이를 통해 스타일과 구조가 독립적으로 작동하게 됩니다.
안전한 대안: setHTML
setHTML 메서드는 setHTMLUnsafe와 유사하게 HTML을 설정하지만, 안전하게 사용될 수 있도록 설계되었습니다. 이 메서드는 스크립트를 실행하는 마크업을 제거하여 XSS 공격을 방지합니다.
예를 들어, 다음 코드를 사용하면 `template` 요소가 섀도 DOM으로 변환되지 않습니다:
const main = document.querySelector('main');
main.setHTML(`
<h2>I am in the Light DOM</h2>
<div>
<template shadowrootmode="open">
<style>
h2 { color: blue; }
</style>
<h2>Shadow DOM</h2>
</template>
</div>
`);
HTML을 가져오는 메서드: getHTML
setHTML과 setHTMLUnsafe를 보완하는 메서드로 getHTML이 있습니다. 이 메서드는 HTML을 설정하는 것뿐만 아니라 가져오는(get) 기능도 제공합니다. 기본적으로 섀도 DOM 내의 마크업은 반환되지 않지만, 옵션을 사용하여 제어할 수 있습니다.
예를 들어, 다음과 같이 사용할 수 있습니다:
const main = document.querySelector('main');
const html = main.getHTML({ serializableShadowRoots: true });
이 옵션을 사용하면 직렬화가 가능한 섀도 DOM 트리를 직렬화할 수 있습니다.
결론
setHTMLUnsafe는 선언적 섀도 DOM을 동적으로 추가하는 데 매우 유용한 도구입니다. 그러나 그 이름에서 알 수 있듯이, 안전하지 않은 방법으로 HTML을 설정하기 때문에 신중하게 사용해야 합니다. 반면, setHTML은 안전하게 HTML을 설정할 수 있는 메서드로, XSS 공격을 방지합니다.
새로운 브라우저 메서드들을 이해하고 적절히 사용하는 것은 웹 개발자들에게 매우 중요합니다. 이를 통해 더 안전하고 효율적인 웹 애플리케이션을 개발할 수 있습니다.
참고 자료: fullystacked, “New alternatives to innerHTML”