XSS 공격으로부터 안전한 웹 개발을 위한 10가지 방법 🛡️
웹 개발을 하다 보면, 우리의 웹사이트가 다양한 공격에 노출될 수 있습니다. 그 중에서도 Cross-Site Scripting, 즉 XSS 공격은 매우 흔하게 발생합니다. 이런 공격으로부터 웹사이트를 보호하기 위해, 여러분이 쉽게 따라 할 수 있는 10가지 방법을 소개합니다.
1. 사용자 입력 검증
사용자로부터 입력 받은 데이터는 항상 검증해야 합니다. 예를 들어, 스크립트 태그(<script>
)나 SQL 명령어 같은 것들이 포함되어 있지 않은지 확인하세요.
<!-- 잘못된 입력 예시 -->
<input type="text" name="username" value="<script>alert('XSS');</script>">
2. 데이터 살균(Sanitization)
사용자로부터 받은 데이터를 웹 페이지에 출력하기 전에, 위험한 문자들을 안전한 형태로 변환하세요. 예를 들어, <
는 <
로, >
는 >
로 변환합니다.
function sanitize(input) {
return input.replace(/</g, "<").replace(/>/g, ">");
}
3. 콘텐츠 보안 정책(CSP)
웹사이트의 헤더에 콘텐츠 보안 정책을 설정하여, 어떤 종류의 스크립트가 실행될 수 있는지 제한하세요. 예를 들어, 자신의 도메인에서만 스크립트를 허용하도록 설정할 수 있습니다.
Content-Security-Policy: script-src 'self'
4. 쿠키에 HttpOnly 플래그 사용
쿠키에 HttpOnly 플래그를 설정하면, 자바스크립트를 통해 쿠키에 접근하는 것을 막을 수 있습니다. 이는 XSS 공격을 통한 세션 탈취를 방지하는 데 도움이 됩니다.
Set-Cookie: sessionId=abc123; HttpOnly
5. 입력 길이 제한
사용자로부터 받는 입력의 길이를 제한하여, 공격자가 긴 스크립트 코드를 삽입하는 것을 방지하세요.
6. 라이브러리와 프레임워크 최신 유지
사용하는 라이브러리와 프레임워크는 항상 최신 버전으로 유지하세요. 보안 취약점이 발견되면, 개발자들은 이를 수정한 새 버전을 릴리스합니다.
7. URL 인코딩 사용
URL에서 사용자 입력을 사용할 때는, URL 인코딩을 사용하여 안전하게 만드세요. 이는 특정 문자를 %
뒤에 오는 두 자리 16진수로 변환하는 방법입니다.
const safeURL = encodeURI(userInput);
8. DOM 기반 XSS 방지
DOM을 직접 조작할 때는, 사용자 입력을 안전하게 처리하세요. 예를 들어, innerText
속성을 사용하여 사용자 입력을 텍스트로만 취급하게 하여, 스크립트가 실행되지 않도록 합니다.
document.getElementById("userInput").innerText = userInput;
9. 외부 스크립트의 안전성 확인
외부에서 가져오는 스크립트는 항상 신뢰할 수 있는 출처에서만 가져오세요. 또한, 가능하다면 Subresource Integrity(SRI)를 사용하여, 스크립트가 변경되지 않았는지 검증하세요.
<script src="https://example.com/script.js" integrity="sha384-oqVuAfXRKap7fdgcCY5..." crossorigin="anonymous"></script>
10. 정기적인 보안 검사
마지막으로, 정기적으로 웹사이트의 보안을 검사하여, 새로운 취약점이 없는지 확인하세요. 여러 온라인 도구를 사용하여 웹사이트를 스캔할 수 있습니다.
이러한 방법들을 통해, 여러분의 웹사이트를 XSS 공격으로부터 보호할 수 있습니다. 웹 개발은 끊임없이 변화하고 있으니, 항상 새로운 보안 위협에 대해 알아보고 대비하는 것이 중요합니다.