
innerHTML의 공포에서 벗어나는 법: HTML Sanitizer API가 바꾸는…
XSS 공격의 주범인 innerHTML을 대체할 브라우저 표준 API의 등장으로, 이제 외부 라이브러리 없이도 안전하고 빠르게 HTML 콘텐츠를 렌더링할 수 있게 되었습니다.
웹 개발자라면 누구나 한 번쯤 innerHTML의 편리함과 위험성 사이에서 갈등해 본 적이 있을 것입니다. 사용자로부터 입력받은 HTML 태그를 화면에 그대로 보여줘야 하는 에디터나 댓글 시스템을 구현할 때, 우리는 항상 ‘교차 사이트 스크립팅(XSS)’이라는 거대한 위협에 노출됩니다. 악의적인 사용자가 <script> 태그나 onerror 속성을 이용해 세션 쿠키를 탈취하거나 페이지를 변조하는 시나리오는 더 이상 이론적인 가설이 아니라 실재하는 위협입니다.
그동안 우리는 이 문제를 해결하기 위해 DOMPurify와 같은 무거운 외부 라이브러리를 도입하거나, 정규표현식을 이용한 불안전한 필터링에 의존해 왔습니다. 하지만 라이브러리 의존성은 번들 크기를 키우고, 업데이트 관리를 필요로 하며, 때로는 브라우저의 최신 파싱 방식과 충돌을 일으키기도 합니다. 이러한 배경 속에서 등장한 HTML Sanitizer API는 브라우저 수준에서 HTML 정화 작업을 수행함으로써 보안성과 성능이라는 두 마리 토끼를 동시에 잡으려는 시도입니다.
브라우저가 직접 검열한다: HTML Sanitizer API의 핵심
HTML Sanitizer API는 신뢰할 수 없는 HTML 문자열을 안전하게 정화하여 Element, ShadowRoot 또는 Document에 삽입할 수 있게 해주는 새로운 웹 표준 API입니다. 기존의 방식이 문자열을 단순히 ‘치환’하는 수준이었다면, 이 API는 브라우저의 실제 HTML 파서를 사용하여 DOM 트리를 분석하고, 미리 정의된 안전한 화이트리스트를 기준으로 위험한 요소와 속성을 제거합니다.
가장 큰 변화는 개발자가 더 이상 ‘무엇을 막을 것인가’를 고민하며 블랙리스트를 작성할 필요가 없다는 점입니다. API는 기본적으로 안전한 태그와 속성만을 허용하며, 필요에 따라 개발자가 허용 범위를 확장하거나 더 엄격하게 제한할 수 있는 유연성을 제공합니다. 이는 보안 설정의 실수로 인해 발생하는 취약점을 획기적으로 줄여줍니다.
기술적 구현과 작동 원리
이 API의 핵심은 Sanitizer 객체와 setHTMLUnsafe()의 안전한 대안으로서 작동하는 메커니즘에 있습니다. 기본적으로 브라우저는 입력된 HTML 문자열을 가상 DOM으로 파싱한 뒤, 각 노드를 순회하며 보안 정책에 위배되는지 확인합니다. 예를 들어 <img src='x' onerror='alert(1)'>라는 입력이 들어오면, API는 img 태그는 허용하지만 onerror라는 이벤트 핸들러 속성은 즉시 제거합니다.
구현 관점에서 보면, 개발자는 다음과 같은 흐름으로 API를 활용하게 됩니다.
- 기본 정화: 별도의 설정 없이 브라우저 기본 정책을 사용하여 위험 요소를 제거합니다.
- 사용자 정의 정책: 특정 비즈니스 요구사항에 따라
이나<embed>같은 태그를 추가로 허용하거나, 특정 데이터 속성(data-*)만을 남기도록 설정합니다. - 직접 삽입: 정화된 결과물을 DOM에 즉시 반영하여 렌더링 성능을 최적화합니다.
기존 방식 vs HTML Sanitizer API 비교
기존의 라이브러리 기반 방식과 브라우저 내장 API 방식의 차이를 명확히 이해하는 것이 중요합니다. 가장 큰 차이는 ‘실행 컨텍스트’와 ‘오버헤드’에 있습니다.
| 비교 항목 | 외부 라이브러리 (예: DOMPurify) | HTML Sanitizer API |
|---|---|---|
| 성능 | JS 엔진에서 처리 (추가 연산 발생) | 브라우저 네이티브 C++ 수준 처리 (매우 빠름) |
| 번들 크기 | 수십 KB의 라이브러리 추가 필요 | 0KB (브라우저 내장) |
| 업데이트 | npm 업데이트 및 재배포 필요 | 브라우저 업데이트로 자동 반영 |
| 신뢰도 | 커뮤니티 검증 기반 | W3C/WHATWG 표준 기반 |
실무 적용 시 고려해야 할 장단점
물론 모든 새로운 기술이 그렇듯, HTML Sanitizer API 역시 명확한 장단점이 존재합니다. 우선 장점은 압도적인 성능 향상입니다. 대량의 HTML 콘텐츠를 처리해야 하는 뉴스 피드나 대형 커뮤니티 사이트에서 JS 기반의 정화 작업은 메인 스레드를 점유하여 화면 버벅임(Jank)을 유발하곤 했습니다. 하지만 네이티브 API는 이를 효율적으로 처리하여 사용자 경험을 개선합니다.
반면, 가장 큰 단점은 브라우저 호환성입니다. 최신 표준 API인 만큼 모든 브라우저에서 즉시 지원되지 않을 수 있습니다. 특히 구형 브라우저를 지원해야 하는 엔터프라이즈 환경에서는 여전히 폴리필(Polyfill)이나 기존 라이브러리를 병행해서 사용해야 하는 ‘과도기적 비용’이 발생합니다.
실제 활용 사례: 안전한 리치 텍스트 에디터 구현
실제 서비스에서 이 API가 가장 빛을 발하는 곳은 ‘사용자 생성 콘텐츠(UGC)’를 처리하는 영역입니다. 예를 들어, 블로그 서비스의 마크다운 에디터에서 HTML 모드를 지원한다고 가정해 보겠습니다. 사용자가 작성한 HTML을 관리자 페이지나 다른 사용자의 브라우저에 출력할 때, 서버 사이드에서 한 번 정화하고 클라이언트 사이드에서 다시 한번 HTML Sanitizer API를 통해 정화하는 ‘이중 방어 체계’를 구축할 수 있습니다.
이 과정에서 API의 유연한 정책 설정을 통해 <b>, <i>, <strong> 같은 기본 서식 태그는 허용하되, 외부 스크립트를 불러오는 <script>나 <object> 태그는 원천 차단함으로써 보안 사고를 미연에 방지할 수 있습니다.
지금 당장 실무자가 해야 할 액션 아이템
HTML Sanitizer API가 완전히 보급되기 전이라도, 보안 의식을 높이고 전환 준비를 하는 것이 중요합니다. 다음은 실무 개발자와 팀 리더가 취해야 할 단계별 가이드입니다.
- 취약점 전수 조사: 현재 프로젝트에서
innerHTML,outerHTML,document.write()를 사용하는 모든 지점을 검색하고 리스트업 하십시오. - 정화 전략 수립: 단순히 ‘모두 막기’가 아니라, 서비스 특성에 맞게 ‘허용할 태그 리스트(Allow-list)’를 명확히 정의하십시오.
- 점진적 도입 계획: 최신 브라우저 사용자에게는 Sanitizer API를 적용하고, 구형 브라우저 사용자에게는 기존 라이브러리를 제공하는 ‘점진적 향상법(Progressive Enhancement)’ 전략을 설계하십시오.
- 보안 테스트 자동화: XSS 페이로드를 이용한 테스트 케이스를 작성하여, API 도입 전후의 정화 결과가 동일하게 안전한지 검증하는 자동화 테스트를 구축하십시오.
결국 웹 보안의 핵심은 ‘신뢰하지 않는 것’에서 시작합니다. 외부에서 들어오는 모든 데이터는 오염되었다고 가정하고, 이를 처리하는 도구를 표준화하는 것이 가장 안전한 길입니다. HTML Sanitizer API는 그동안 개발자의 어깨에 지워졌던 보안의 짐을 브라우저라는 플랫폼이 나누어 가지겠다는 선언과 같습니다. 이제 우리는 더 안전하고, 더 가벼운 웹 환경을 구축할 준비가 되었습니다.
FAQ
HYML Sanitizer API의 핵심 쟁점은 무엇인가요?
핵심 문제 정의, 비용 구조, 실제 적용 방법, 리스크를 함께 봐야 합니다.
HYML Sanitizer API를 바로 도입해도 되나요?
작은 범위에서 실험하고 데이터를 확인한 뒤 단계적으로 확대하는 편이 안전합니다.
실무에서 가장 먼저 확인할 것은 무엇인가요?
목표 지표, 대상 사용자, 예산 범위, 운영 책임자를 먼저 명확히 해야 합니다.
법률이나 정책 이슈도 함께 봐야 하나요?
네. 데이터 수집 방식, 플랫폼 정책, 개인정보 관련 제한을 반드시 점검해야 합니다.
성과를 어떻게 측정하면 좋나요?
비용, 전환율, 클릭률, 운영 공수, 재사용 가능성 같은 지표를 함께 보는 것이 좋습니다.
관련 글 추천
- https://infobuza.com/2026/06/01/20260601-wgaobv/
- https://infobuza.com/2026/06/01/20260601-rsfesr/
지금 바로 시작할 수 있는 실무 액션
- 현재 팀의 AI 활용 범위와 검증 절차를 먼저 문서화합니다.
- 작은 파일럿 프로젝트로 KPI를 정하고 2~4주 단위로 검증합니다.
- 보안, 품질, 리뷰 기준을 자동화 도구와 함께 연결합니다.

