[Spring] Security에서 보안 관련 속성을 추가

코딩하는범이·2020년 12월 11일
0
post-thumbnail

오늘은 Spring Security를 통한 Http에 여러가지 설정을 해서 보안을 강화시켜 보겠다. 일단 설정한 부분들은 구글에 검색하면 나오는 웹 보안 체크 홈페이지를 통해서 검사했고 미흡한 부분을 Spring Security를 통해서 보완했다.

Gradle 기준으로 일단 아래처럼 Spring security 종속성을 추가 해준다.
implementation 'org.springframework.boot:spring-boot-starter-security'

그리고 나서 SecurityConfig.class 파일을 작성한다.

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {



    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .headers()
                .cacheControl()
                .and()
                .frameOptions()
                .and()
                .contentTypeOptions()
                .and()
                .httpStrictTransportSecurity() 
                .maxAgeInSeconds(31536000)
                .includeSubDomains(true);
        http
                .headers()
                .contentSecurityPolicy("default-src 'self';")
                .and()
                .contentSecurityPolicy("font-src 'self' https://use.typekit.net;")
                .and()
                .contentSecurityPolicy(" img-src 'self' https://p.typekit.net https://media.vlpt.us;");
        http
                .requiresChannel()      
                .anyRequest()           
                .requiresSecure();      
        http
                .csrf()
                .ignoringAntMatchers("/project","/mail");
    }

}

맨 위에서의 Http Header 에 적용하는 부분을 살펴보자면

cacheControl()는 여러 캐싱 정책을 설정할 수 있는 부분이다.
나처럼 코드를 짜게된다면 디폴트 값이 들어가게 되는데, 디폴드 값은 no-cache, no-store, max-age=0, must-revalidate 로 되어있다.

이러한 속성들의 value는 [여기]를 통해서 확인 할 수있다.(https://developer.mozilla.org/ko/docs/Web/HTTP/Headers/Cache-Control)
찾아서 읽어보면 디폴트 값에는 보안이 잘 되어있다.

frameOptions()은 http 헤더에서 X-Frame-Options 속성을 가르키는데 frame 부분을 컨트롤 해준다. 디폴트 값은 deny이며 어떠한 사이트에도 frame 상에서 보여질수 없게 된다.

contentTypeOptions()은 X-Content-Type-Options 속성을 가르키며 MIME 형식 이외의 형식으로 해석을 확장하는 것을 제한하는 크로스사이트스크립트 방어법이라고 한다. 다만 이 방어법은 브라우저 의존적이여서 지원하지 않으면 효력이 없다. 찾아본결과 파이어폭스와 사파리는 지원하지 않는다고 한다.

httpStrictTransportSecurity()(HSTS)는 간단히 얘기하자면 HTTP로 액세스하려는 모든 시도를 HTTPS 요청으로 자동 변환해야 한다고 브라우저에게 알려주는 기능을 한다. 그래서 위에 설정한 maxAgeInSeconds(31536000) 만큼 등록이 된다.
그러나 얼핏 듣기로는 google, twitter 등의 웹사이트는 구글 크롬 브라우저에 하드코딩 되어 HSTS가 Preload되어 강제화 되도록 되어있다고 한다. 그리고 includeSubdomains은 HSTS가 적용될 도메인의 subdomain 까지 HSTS를 확장 적용함을 의미한다.

그 아래의 contentSecurityPolicy()(csp)는 특정 리소스가 어디서 왔는지 검사를 하고 허용된 범위에 포함됐는지 검토를 한다. 작성되지 않은 부분에 요청이 들어오면 거절한다. 그래서 제대로 작성하지 않을시 console창에 에러가 잔뜩 나올 것이다
사용할 수 있는 문법은 여기를 보고 작성하면 된다.

requiresChannel().anyRequest().requiresSecure() 부분은 http를 https로 redirect 하게끔 강제 해준다. 필자는 Spring Security에 이런 기능이 있는 줄 모르고 AWS 로드 밸런서로 설정을 어렵게 했는데... 굳이 이럴필요가 없었다. 번외로 AWS 로드 밸런서로도 설정하고 Spring Security로도 설정하면 요청이 많다고 브라우저에서 오류를 뱉으면서 접속되지 않는다...

csrf()는 Cross site request forgery, 사이트간 요청 위조를 얘기하는데 Spring Security에서 간단하게 말하면 불필요한 요청을 막는다고 생각하면된다. 아래에 적은 ignoringAntMatchers은 저 url로 들어오는 요청은 무시한다는 뜻이다.

여기서 깜짝 놀랄만한 일을 말하자면... 웬만한건 Spring Security의 디폴트 값이다..
여기에서 확인해 볼수있다.

이렇게 보안 관련된 부분을 Spring Security를 통해 내 포트폴리오 사이트에 설정 해봤는데 사실.. 처음에는 내 포트폴리오 홈페이지는 인증과 인가 관련된 부분이 없기 때문에 Spring Security의 큰 필요성은 못느꼈었는데, 있는게 많이 안전해 지는것 같다.

끗!!

profile
기록 그리고 기억

0개의 댓글