on my way
XSS (Cross Site Scripting) 공격 대비하기 본문
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 공격을 방지하기 위해 다음과 같은 전략을 사용하는 것이 좋습니다:
- 입력 검증 및 필터링: 사용자가 입력한 모든 데이터를 검증하고, 잠재적으로 위험한 HTML 태그나 속성을 필터링합니다.
- 출력 인코딩: 사용자 입력을 웹 페이지에 출력할 때는 반드시 인코딩을 통해 악의적인 스크립트가 실행되지 않도록 합니다.
- 쿠키 보안 설정: 쿠키에
HttpOnly
,Secure
속성을 설정하여 클라이언트 측 스크립트가 쿠키에 접근하지 못하게 하고, HTTPS를 통해서만 전송되도록 합니다. - 사용자 권한 관리: 민감한 데이터에 접근할 수 있는 사용자의 권한을 엄격하게 관리합니다.
결론
XSS 공격은 웹 애플리케이션의 보안을 위협하는 주요 요소 중 하나입니다.
Lucy-XSS와 같은 강력한 필터링 도구를 사용하여, 애플리케이션을 안전하게 보호할 수 있습니다.
이번 포스팅에서는 Lucy-XSS를 적용하여 XSS 공격을 방지하는 방법을 살펴보았으며, 이를 통해 웹 애플리케이션의 보안을 더욱 강화할 수 있습니다.
적용된 코드를 통해 개발자는 간단하고 효과적으로 XSS 공격을 방지할 수 있으며, 쿠키 보안 설정과 같은 추가적인 보안 조치와 함께 사용하면 더욱 강력한 웹 애플리케이션 보안을 구현할 수 있습니다.
'Computer Science > Spring' 카테고리의 다른 글
코드로 배우는 스프링 부트 웹 프로젝트 03 : 스프링 MVC와 Thymeleaf (0) | 2024.07.31 |
---|---|
코드로 배우는 스프링 부트 웹 프로젝트 02 : Maria DB와 Spring Data JPA (0) | 2024.07.29 |
코드로 배우는 스프링 부트 웹 프로젝트 01 : 개발 도구의 준비 (0) | 2024.07.29 |
네이버 API로 도서 조회 프로그램 만들기 (0) | 2024.06.20 |
게시판 만들기 프로젝트 시작하기 (ERD 생성, 게시판 구조, 스프링 프로젝트) (0) | 2024.06.11 |