메뉴 건너뛰기

app

브라우저를 지배하는 악성 코드: CWE-79 크로스사이트 스크립팅(XSS)

suritam92026.01.18 11:06조회 수 5댓글 0

    • 글자 크기

1. XSS의 위험성

CWE-79는 애플리케이션이 외부에서 입력받은 데이터를 적절한 검증이나 필터링 없이 웹 페이지에 포함시켜 출력할 때 발생합니다. 공격자는 이를 이용해 사용자의 브라우저에서 실행될 수 있는 악성 스크립트를 주입합니다.

스크립트가 실행되면 사용자의 세션 쿠키 탈취, 피싱 페이지 유도, 페이지 변조 등이 가능해지며, 사용자가 웹사이트를 신뢰하는 점을 이용해 정상적인 기능을 공격자의 의도대로 조작할 수 있습니다.

2. XSS의 3가지 주요 유형

Stored(저장형) XSS: 악성 스크립트가 서버의 DB에 영구적으로 저장되어, 해당 글을 읽는 모든 사용자가 공격 대상이 됩니다. (예: 게시판 댓글)

Reflected(반사형) XSS: URL 파라미터 등에 포함된 스크립트가 서버를 거쳐 즉시 사용자에게 '반사'되어 실행됩니다. (예: 검색어 노출)

DOM-based XSS: 서버와 상관없이 브라우저 측 자바스크립트가 데이터를 안전하지 않게 처리할 때 발생합니다.

3. 실무적 대응: 출력 필터링과 보안 정책

가장 핵심은 **"외부에서 온 모든 데이터는 신뢰하지 않는 것"**입니다.

입력값 검증: 서버 단에서 허용된 문자(White-list)만 들어오도록 강력하게 필터링합니다.

출력값 인코딩(HTML Encoding): < → &lt;, > → &gt; 와 같이 특수문자를 안전한 문자로 변환하여 브라우저가 스크립트로 인식하지 못하게 합니다.

보안 헤더 설정: Content-Security-Policy(CSP) 헤더를 설정하여 실행 가능한 스크립트의 출처를 제한합니다.

쿠키 보안 속성: 세션 쿠키에 HttpOnly 옵션을 적용하여 자바스크립트가 쿠키를 읽지 못하게 차단합니다.

4. CWE-79 대응 및 안전한 출력 자바 코드 예시

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.util.HtmlUtils;
 
public class XssPreventionService {
    private static final Logger logger = LoggerFactory.getLogger(XssPreventionService.class);
 
    // [CWE-79 조치] 사용자 입력값을 웹 페이지에 출력하기 전 HTML 인코딩 수행
    public String safeOutput(String userInput) {
        if (userInput == null) return "";
 
        // 1. Spring Framework 제공 유틸리티 사용 (또는 OWASP Java Encoder 등 활용)
        // <script>alert(1)</script> -> &lt;script&gt;alert(1)&lt;/script&gt;
        String encodedOutput = HtmlUtils.htmlEscape(userInput);
 
        logger.debug("Original input: {}", userInput);
        logger.debug("Safe encoded output: {}", encodedOutput);
 
        return encodedOutput;
    }
}

코멘트: XSS 방어의 골든 룰은 **"입력할 때 막고, 출력할 때 변환하는 것"**입니다. 특히 데이터가 JSON 형태로 전달되거나 자바스크립트 내부에 변수로 삽입될 때 인코딩 방식이 달라져야 함을 주의하십시오. logger.debug()를 통해 위험한 태그가 포함된 입력 시도를 모니터링하되, 서버 단에서 Lucy-XSS-Filter와 같은 검증된 라이브러리를 적용하여 전방위적인 방어막을 구축하는 것이 시큐어 코딩의 정석입니다.

 
    • 글자 크기
시스템의 숨통을 조이는 자원 누수: CWE-404 부적절한 자원 해제 (by suritam9) 신뢰할 수 없는 이름표: CWE-247 DNS Lookup 의존 보안 결정 (by suritam9)

댓글 달기

첨부 (0)
위로