on my way

XSS (Cross Site Scripting) 공격 대비하기 본문

Computer Science/Spring

XSS (Cross Site Scripting) 공격 대비하기

wingbeat 2024. 8. 30. 16:55
반응형

XSS (Cross-Site Scripting) 공격 대비하기: Lucy-XSS 사용 사례

XSS (Cross-Site Scripting)는 웹 애플리케이션에서 자주 발생하는 취약점 중 하나로, 공격자가 악의적인 스크립트를 다른 사용자의 브라우저에서 실행하도록 만들 수 있습니다.

 

이를 방지하기 위해 여러 가지 방법이 존재하며, Lucy-XSS 라이브러리를 활용한 XSS 방어 방법을 소개하고, 실제 코드 예시를 통해 구현 방법을 설명하겠습니다.


Lucy-XSS란?

Lucy-XSS는 네이버에서 제공하는 XSS 필터링 라이브러리로, 웹 애플리케이션에서 입력된 데이터를 필터링하여 XSS 공격을 방지합니다.

이 라이브러리는 XSS 공격에 사용될 수 있는 다양한 HTML 태그와 속성들을 자동으로 제거하거나 무력화하는 역할을 합니다.


1. Maven 설정

먼저, 프로젝트의 pom.xml 파일에 Lucy-XSS 라이브러리를 추가합니다.

<dependency>
    <groupId>com.navercorp.lucy-xss</groupId>
    <artifactId>lucy-xss-servlet</artifactId>
    <version>1.0.0</version>
</dependency>

 

이 라이브러리는 다양한 방식으로 XSS 필터링을 지원하며, 설정 파일을 통해 세부적인 동작을 정의할 수 있습니다.


2. Lucy-XSS 필터 설정

Lucy-XSS 필터를 설정하려면 웹 애플리케이션의 web.xml에 다음과 같은 필터를 추가합니다.

<filter>
    <filter-name>xssEscapeServletFilter</filter-name>
    <filter-class>com.navercorp.lucy.security.xss.servletfilter.XssEscapeServletFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>xssEscapeServletFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

이 필터는 모든 URL에 대해 적용되며, XSS 공격을 방지하기 위해 사용자 입력을 필터링합니다.


3. Lucy-XSS 필터 설정 파일

Lucy-XSS의 필터링 규칙은 설정 파일을 통해 관리됩니다. 아래는 예시로 사용된 lucy-xss-superset-sax.xml 설정 파일의 내용입니다.

<?xml version="1.0" encoding="UTF-8"?>
<config xmlns="http://www.navercorp.com/lucy-xss-servlet">
    <defenders>
        <defender>
            <name>xssPreventerDefender</name>
            <class>com.navercorp.lucy.security.xss.servletfilter.defender.XssPreventerDefender</class>
        </defender>
        <defender>
            <name>xssSaxFilterDefender</name>
            <class>com.navercorp.lucy.security.xss.servletfilter.defender.XssSaxFilterDefender</class>
            <init-param>
                <param-value>lucy-xss-sax.xml</param-value>
                <param-value>false</param-value>
            </init-param>
        </defender>
        <defender>
            <name>xssFilterDefender</name>
            <class>com.navercorp.lucy.security.xss.servletfilter.defender.XssFilterDefender</class>
            <init-param>
                <param-value>lucy-xss.xml</param-value>
                <param-value>false</param-value>
            </init-param>
        </defender>
    </defenders>
    <default>
        <defender>xssSaxFilterDefender</defender>
    </default>
</config>

이 설정 파일은 다양한 필터링 규칙을 정의하며, 특정 태그와 속성을 필터링하거나 허용하지 않을 수 있습니다.


4. 코드 예시: XSS 방지 적용

EditService 클래스에서 XSS 필터를 사용하는 예제를 살펴보겠습니다.

@Service
public class EditService {
    @Autowired
    private CardMapper cardMapper;

    @Autowired
    private TemplateMapper templateMapper;

    public void insertCardInDatabase(CardVO cardVO, HttpSession session) {
        if (cardVO.getPayID() == 0) {
            cardVO.setPayID(null);
        }
        cardVO.setMemberID((Integer) session.getAttribute("memberID"));

        // XSS filter 적용해서 html 문법 필터링하기
        XssFilter filter = XssFilter.getInstance("lucy-xss-superset-sax.xml", true);
        cardVO.setCardDesign(filter.doFilter(cardVO.getCardDesign()));
        cardMapper.insertCardInDatabase(cardVO);
    }
}

 

위 코드에서는 cardVO 객체에 포함된 CardDesign 데이터를 필터링하여, XSS 공격을 방지합니다.

Lucy-XSS 필터가 적용되어 HTML 코드에서 잠재적인 XSS 공격 요소를 제거합니다.


5. 쿠키 보안 설정

CookieInterceptor 클래스에서 XSS 공격을 방지하기 위해 쿠키의 HttpOnly 속성을 설정하는 예제를 확인해 보겠습니다.

@Component
public class CookieInterceptor implements HandlerInterceptor {
    @Autowired
    private VisitorService visitorService;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return checkCookie(request, response);
    }

    private boolean checkCookie(HttpServletRequest request, HttpServletResponse response) {
        if (request.getCookies() == null) {
            createCookie(response);
        }
        return true;
    }

    private void createCookie(HttpServletResponse response) {
        UUID uuid = UUID.randomUUID();
        String token = uuid.toString();
        Cookie visitorCookie = new Cookie("visitor", token);
        visitorCookie.setPath("/");
        visitorCookie.setHttpOnly(true); // HTTP ONLY 로 설정해서 XSS 방지
        visitorCookie.setMaxAge(60 * 60 * 3); // 3시간 단위로 쿠키 삭제
        response.addCookie(visitorCookie);
        visitorService.insertCookie(new VisitorVO(), token);
    }
}

위 코드에서는 HttpOnly 속성을 통해 클라이언트 측 스크립트에서 쿠키에 접근할 수 없도록 하여, XSS 공격의 위험을 줄입니다.


6. XSS 공격에 대한 방어 전략

XSS 공격을 방지하기 위해 다음과 같은 전략을 사용하는 것이 좋습니다:

  1. 입력 검증 및 필터링: 사용자가 입력한 모든 데이터를 검증하고, 잠재적으로 위험한 HTML 태그나 속성을 필터링합니다.
  2. 출력 인코딩: 사용자 입력을 웹 페이지에 출력할 때는 반드시 인코딩을 통해 악의적인 스크립트가 실행되지 않도록 합니다.
  3. 쿠키 보안 설정: 쿠키에 HttpOnly, Secure 속성을 설정하여 클라이언트 측 스크립트가 쿠키에 접근하지 못하게 하고, HTTPS를 통해서만 전송되도록 합니다.
  4. 사용자 권한 관리: 민감한 데이터에 접근할 수 있는 사용자의 권한을 엄격하게 관리합니다.

결론

XSS 공격은 웹 애플리케이션의 보안을 위협하는 주요 요소 중 하나입니다.

Lucy-XSS와 같은 강력한 필터링 도구를 사용하여, 애플리케이션을 안전하게 보호할 수 있습니다.

 

이번 포스팅에서는 Lucy-XSS를 적용하여 XSS 공격을 방지하는 방법을 살펴보았으며, 이를 통해 웹 애플리케이션의 보안을 더욱 강화할 수 있습니다.

 

적용된 코드를 통해 개발자는 간단하고 효과적으로 XSS 공격을 방지할 수 있으며, 쿠키 보안 설정과 같은 추가적인 보안 조치와 함께 사용하면 더욱 강력한 웹 애플리케이션 보안을 구현할 수 있습니다.

반응형