XSS (Cross-Site Scripting)는 웹 보안 취약점 중 하나로, 공격자가 악의적인 스크립트를 다른 사용자의 브라우저에서 실행하도록 만드는 공격이다.
XSS 공격은 주로 웹 애플리케이션에서 사용자 입력을 제대로 검증하지 않거나 필터링하지 않는 경우 발생한다.
<script>alert('XSS');</script>
와 같은 악성 스크립트를 입력한다.http://example.com/page?search=<script>alert('XSS');</script>
와 같은 URL을 사용자에게 제공한다.<img src="doesnotexist">
와 같은 스크립트를 삽입하여, 해당 요소가 렌더링될 때 'XSS'라는 경고창이 표시될 수 있다.<!-- 사용자 입력을 동적으로 생성된 HTML 요소에 반영하는 코드 -->
<div id="dynamicContent"></div>
<script>
// 사용자 입력을 동적으로 생성된 HTML 요소에 반영하는 스크립트
const userInput = "<img src='doesnotexist' onerror='alert(\"XSS\")'>";
document.getElementById('dynamicContent').innerHTML = userInput;
</script>
// XSS에 취약함
element.innerHTML = userInput;
// XSS에 안전함
element.textContent = userInput;
textContent
와 innerText
, innerHTML
의 차이점 정리
▶️ textContent
와 innerText
의 차이점
textContent
는 <script>
와 <style>
요소를 포함한 모든 요소의 콘텐츠를 가져온다.innerText
는 사람이 읽을 수 있는 요소만 처리한다.textContent
는 노드의 모든 텍스트를 반환한다.innerText
는 스타일링을 고려하며, 숨겨진 요소의 텍스트는 반환하지 않는다.innerText
를 읽을 때 최신 계산값을 반영하기 위해 리플로우가 발생할 수 있다. 리플로우는 성능에 영향을 미칠 수 있으므로 가능하면 피하는 것이 좋다.▶️ textContent
와 innerHTML
의 차이점
텍스트 vs HTML
innerHTML
은 HTML을 반환한다. 반면 textContent
는 텍스트를 반환하며, HTML을 분석할 필요가 없으므로 성능이 더 좋다.XSS 공격의 위험성
- textContent
는 XSS 공격의 위험이 없다. 따라서 보안 측면에서도 더 안전하다.
HTML 구조:
<div id="divA">This is <span>some</span> text!</div>
textContent
로 요소의 텍스트 콘텐츠를 가져오기:
const text = document.getElementById("divA").textContent;
// text 변수는 이제 'This is some text!'를 가리킨다.
textContent
로 요소의 텍스트 내용을 설정하기:
document.getElementById("divA").textContent = "This text is different!";
// divA의 HTML은 이제 <div id="divA">This text is different!</div>가된다.
innerText와 textContent 렌더링 차이점 보기 (MDN 문서 예제 코드)
// Bad practice (XSS vulnerable)
response.send(`<p>${userInput}</p>`);
// Good practice (XSS safe)
response.send(`<p>${escapeHtml(userInput)}</p>`);
function escapeHtml(unsafe) {
return unsafe.replace(/[&<"']/g, function(match) {
return {
'&': '&',
'<': '<',
'>': '>',
'"': '"',
"'": '''
}[match];
});
}
const userInput = '<script>alert("XSS attack!")</script>';
const element = <div>{userInput}</div>;
React는 자동으로 userInput의 값에 포함된 HTML 특수 문자를 이스케이핑하여 다음과 같이 렌더링한다.<div><script>alert("XSS attack!")</script></div>
따라서 React를 사용하여 UI를 개발할 때에도 HTML 이스케이핑은 자동으로 수행되므로 XSS 공격에 대한 보호가 강화된다.Content-Security-Policy: default-src 'self';
// Bad practice (XSS vulnerable)
const searchTerm = req.query.searchTerm;
// Good practice (XSS safe)
const searchTerm = validateSearchTerm(req.query.searchTerm);
function validateSearchTerm(searchTerm) {
// Whitelist validation: Allow only alphanumeric characters
return searchTerm.replace(/[^a-zA-Z0-9]/g, '');
}
Set-Cookie: session=sessionId; HttpOnly;