2022.12.12 TIL

SUADI·2022년 12월 12일
0

오늘의 커밋

  • XSS 방어 설정

[1] XSS

{1} XSS란?

XSS란 Cross-Site scripting의 약자로, 악의적인 사용자가 공격하려는 사이트에 스크립트를 넣는 기법을 뜻한다. 공격에 성공하면 사이트에 접속한 사용자는 삽입된 코드를 실행하게 되며, 보통 의도치 않은 행동을 수행시키거나 쿠키나 세션 토큰 등의 민감한 정보를 탈취한다.

XSS를 방어하는 방법으로는

  1. 서버 내에 Filter를 설정해서 XSS 공격 방어
  2. 스프링 시큐리티가 제공하는 XSS 방어 설정

{2} XSS 공격

방어 설정을 하기 이전에 의도적으로 XSS 공격을 하여 어떤 현상이 발생하는지 확인해 보았다. 포스트맨으로 게시물을 작성할 때 내용 인풋값에 <script>alert('XSS 공격')</alert> 을 작성하고 게시물 상세조회를 해 보았다. 정상적으로 XSS 공격이 먹히면 'XSS 공격'문구의 alert 창이 떠야하는데 문자열 그대로 출력이 되고 있었다. XSS 방어 설정을 해주지도 않았는데 XSS 공격이 먹히지 않은 것이다.

{3} XSS 공격 안먹힌 이유

XSS 공격이 먹히지 않은 이유에 대해 찾아보니 아래와 같이 헤더에 이미 XSS 방어 설정이 되어있었다.

  • X-XSS-Protection : 1; mode=block

이미 방어 설정이 되어있었던 이유는 현재 대부분의 브라우저에서는 X-XSS-Protection이 자동으로 설정되어 브라우저 자체에서 스크립트를 필터링 해준다고 한다. 포스트맨은 크롬의 확장 프로그램이기 때문에 포스트맨으로 XSS 공격을 했을 때, 스크립트가 실행되지 않고 문자열로 출력되었던 것이다.

브라우저 상에서 X-XSS-Protection 설정이 자동적으로 되었던 것과는 별개로 더 확실히 하기 위해서 서버 내에서도 스프링 시큐리티가 제공하는 XSS 방어 설정을 해줌으로써 XSS 공격에 대한 방어를 견고히 헀다.

    @Bean
    @Order(SecurityProperties.BASIC_AUTH_ORDER)
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.cors();

        // xss
        http
                .headers()
                .xssProtection()
                .and()
                .contentSecurityPolicy("script-src 'self'");
                ....

0개의 댓글

관련 채용 정보