1. XSS의 위험성
CWE-79는 애플리케이션이 외부에서 입력받은 데이터를 적절한 검증이나 필터링 없이 웹 페이지에 포함시켜 출력할 때 발생합니다. 공격자는 이를 이용해 사용자의 브라우저에서 실행될 수 있는 악성 스크립트를 주입합니다.
스크립트가 실행되면 사용자의 세션 쿠키 탈취, 피싱 페이지 유도, 페이지 변조 등이 가능해지며, 사용자가 웹사이트를 신뢰하는 점을 이용해 정상적인 기능을 공격자의 의도대로 조작할 수 있습니다.
2. XSS의 3가지 주요 유형
• Stored(저장형) XSS: 악성 스크립트가 서버의 DB에 영구적으로 저장되어, 해당 글을 읽는 모든 사용자가 공격 대상이 됩니다. (예: 게시판 댓글)
• Reflected(반사형) XSS: URL 파라미터 등에 포함된 스크립트가 서버를 거쳐 즉시 사용자에게 '반사'되어 실행됩니다. (예: 검색어 노출)
• DOM-based XSS: 서버와 상관없이 브라우저 측 자바스크립트가 데이터를 안전하지 않게 처리할 때 발생합니다.
3. 실무적 대응: 출력 필터링과 보안 정책
가장 핵심은 **"외부에서 온 모든 데이터는 신뢰하지 않는 것"**입니다.
• 입력값 검증: 서버 단에서 허용된 문자(White-list)만 들어오도록 강력하게 필터링합니다.
• 출력값 인코딩(HTML Encoding): < → <, > → > 와 같이 특수문자를 안전한 문자로 변환하여 브라우저가 스크립트로 인식하지 못하게 합니다.
• 보안 헤더 설정: Content-Security-Policy(CSP) 헤더를 설정하여 실행 가능한 스크립트의 출처를 제한합니다.
• 쿠키 보안 속성: 세션 쿠키에 HttpOnly 옵션을 적용하여 자바스크립트가 쿠키를 읽지 못하게 차단합니다.
4. CWE-79 대응 및 안전한 출력 자바 코드 예시
코멘트: XSS 방어의 골든 룰은 **"입력할 때 막고, 출력할 때 변환하는 것"**입니다. 특히 데이터가 JSON 형태로 전달되거나 자바스크립트 내부에 변수로 삽입될 때 인코딩 방식이 달라져야 함을 주의하십시오. logger.debug()를 통해 위험한 태그가 포함된 입력 시도를 모니터링하되, 서버 단에서 Lucy-XSS-Filter와 같은 검증된 라이브러리를 적용하여 전방위적인 방어막을 구축하는 것이 시큐어 코딩의 정석입니다.
댓글 달기