프론트엔드 개발자와 이야기하다가 React는 기본적으로 XSS 공격을 막아준다는 말을 들었다. 이게 과연 어디까지 맞는 이야기일까?
결론부터 말하면
const userInput = '<img src=x onerror=alert("XSS") />';
return <div>{userInput}</div>;
위 코드에서 userInput은 HTML로 인식되지 않고 그냥 텍스트로 표시됨.
React는 내부적으로 textContent 방식으로 DOM에 넣어주기 때문에,
<, >, &, ", ' 등을 자동으로 이스케이프(escape) 처리해준다.이로 인해 <img>나 onerror 속성은 작동하지 않음.
즉, JSX 내부에서는 기본적으로 안전하다.
dangerouslySetInnerHTML 사용 시return <div dangerouslySetInnerHTML={{ __html: userInput }} />;
✔️ 반드시 DOMPurify 같은 라이브러리로 sanitize(정화) 처리해야 함.
dangerouslySetInnerHTML로 렌더링하면 위험함DOMPurify로 안전하게 HTML 렌더링하기 (예시)import DOMPurify from 'dompurify';
const rawHtml = '<img src=x onerror=alert("XSS") />';
const safeHtml = DOMPurify.sanitize(rawHtml);
return <div dangerouslySetInnerHTML={{ __html: safeHtml }} />;