본문 바로가기
시큐어코딩/JAVA

(시큐어코딩)Java에서 크로스사이트 스크립트(XSS) 보안취약점 공격 방어 전략

by ICT 인사이트 2025. 3. 17.
728x90

웹 애플리케이션 보안에서 크로스사이트 스크립트(XSS, Cross-Site Scripting)는 가장 널리 알려진 공격 중 하나로, 공격자가 악성 스크립트를 삽입하여 사용자 브라우저에서 실행하게 만듭니다. 이는 쿠키 탈취, 세션 하이재킹, 악성 코드 실행 등의 문제를 초래할 수 있습니다.

 

이 글에서는 자바 11 환경에서 XSS 공격을 방어하는 전략을 상세히 설명하며, 취약한 코드와 안전한 코드 예제를 비교하여 보안성을 높이는 방법을 소개합니다.


2. 크로스사이트 스크립트(XSS)란?

XSS 공격은 악의적인 JavaScript 코드를 삽입하여 사용자의 브라우저에서 실행되도록 유도하는 공격 기법입니다.
이를 통해 공격자는 사용자의 세션을 가로채거나, 개인 정보를 유출하거나, 악성 코드 실행 등의 피해를 초래할 수 있습니다.

XSS의 주요 유형

유형 설명 예제
반사형(Reflected XSS) 공격자가 조작한 URL을 사용자가 클릭하면, 스크립트가 브라우저에서 실행됨 검색어 입력 후 결과 페이지에 악성 코드 포함
저장형(Stored XSS) 공격자가 악성 스크립트를 데이터베이스에 저장한 후, 사용자가 해당 데이터를 조회할 때 실행됨 게시판, 댓글, 사용자 프로필 페이지에서 악성 코드 실행
DOM 기반 XSS 클라이언트 측에서 JavaScript 코드가 직접 HTML 문서를 변경하여 발생 innerHTML, document.write() 등을 사용한 취약한 코드

3. 취약한 코드 예제

다음은 사용자가 입력한 데이터를 필터링 없이 HTML 페이지에 삽입하는 경우 발생하는 XSS 취약점 코드입니다.

(1) 취약한 코드: 직접 HTML에 삽입

@WebServlet("/xss")
public class XSSVulnerableServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        String userInput = request.getParameter("input"); // 사용자 입력값
        response.setContentType("text/html;charset=UTF-8");
        
        PrintWriter out = response.getWriter();
        out.println("<html><body>");
        out.println("<h1>입력한 값: " + userInput + "</h1>"); // XSS 취약점 발생
        out.println("</body></html>");
    }
}

문제점:

  • 사용자가 입력한 값을 그대로 HTML에 삽입하기 때문에 <script>alert("XSS!")</script> 같은 악성 코드가 실행될 수 있음

4. 안전한 코드 예제 (XSS 방어 전략)

(1) HTML 이스케이프 처리

XSS 공격을 방어하려면 HTML 태그 및 특수문자를 인코딩(이스케이프)하여 브라우저에서 실행되지 않도록 해야 합니다.

public static String escapeHtml(String input) {
    return StringEscapeUtils.escapeHtml4(input); // Apache Commons Lang 라이브러리 사용
}

적용 예시

String userInput = request.getParameter("input");
String safeInput = escapeHtml(userInput);
out.println("<h1>입력한 값: " + safeInput + "</h1>");

방어 효과:

  • <script>alert('XSS')</script> 입력 시, 브라우저에서 &lt;script&gt;alert('XSS')&lt;/script&gt;로 변환되어 실행되지 않음

(2) 보안 라이브러리 사용

Java에서는 OWASP에서 제공하는 **ESAPI(Security API for Java)**를 사용하여 안전한 인코딩을 수행할 수 있습니다.

import org.owasp.esapi.ESAPI;

String safeInput = ESAPI.encoder().encodeForHTML(userInput);

OWASP ESAPI의 장점:

  • 다양한 공격 차단 (XSS, SQL Injection, CSRF 등)
  • HTML, JavaScript, URL 등 여러 포맷에 대한 인코딩 지원

(3) Content Security Policy(CSP) 적용

CSP는 브라우저에서 특정 스크립트 실행을 차단하는 HTTP 보안 정책입니다.
이를 활용하면 공격자가 악성 스크립트를 주입해도 실행되지 않습니다.

HTTP 응답 헤더에 CSP 추가

response.setHeader("Content-Security-Policy", "default-src 'self'; script-src 'self'");

효과:

  • 외부에서 주입된 JavaScript 코드 실행 방지
  • XSS 공격을 원천 차단

5. 추가적인 XSS 방어 전략

최고 수준의 보안 강화를 위해 다음 추가 전략을 적용하세요.

전략 설명
입력값 검증(Validation) 사용자가 입력할 수 있는 값의 유형을 제한 (예: 숫자, 영문만 허용)
JavaScript 이스케이프 처리 JavaScript 내에서 encodeForJavaScript() 활용하여 변조 방지
HTTPOnly & Secure 쿠키 설정 JavaScript에서 쿠키 접근 차단 (세션 탈취 방지)
프레임워크 내장 보안 기능 활용 Spring Security, JSP의 <c:out> 태그 등을 활용

6. 결론

크로스사이트 스크립트(XSS) 공격은 입력값 검증, HTML 이스케이프 처리, 보안 라이브러리 활용, CSP 적용 등의 방법을 사용하여 방어할 수 있습니다.
Java 11을 기반으로 개발할 때, 위와 같은 보안 기법을 적용하면 보다 안전한 애플리케이션을 구축할 수 있습니다.

 

✅ 다음 포스팅:

다음 글에서는 CSRF(크로스 사이트 요청 위조) 보안 약점과 Java 11 환경에서 이를 방어하는 방법을 심층적으로 분석합니다.

 

728x90