Spring Security 메모 - CORS & CORF

timothy jeong·2022년 7월 17일
0

Spring Security

목록 보기
5/8

Spring Security CORS & CSRF

CORS : cross origin resource share

서로 다른 오리진에 있는 웹 어플리케이션들이 자원을 공유하려고 함
Cors 는 시큐리티가 제공하는 조치가 아니라 브라우저가 기본적으로 제공하는 기능이다.

Origin 은 도메인이나 port 가 다르면 다르게 인식된다.


@Override
protected void configure(HttpSecurity http) throws Exception {
    http.cors().configurationSource(new CorsConfigurationSource() {
        @Override
        public CorsConfiguration getCorsConfiguration(HttpServletRequest request) {
            CorsConfiguration config = new CorsConfiguration();
            config.setAllowedOrigins(Collections.singletonList("http://localhost:4200"));
            config.setAllowedMethods(Collections.singletonList("*"));
            config.setAllowedHeaders(Collections.singletonList("*"));
            config.setMaxAge(3600L);
            config.setAllowCredentials(true);
            return config;
        }
    }).and()
            .authorizeRequests()
            .antMatchers("/myAccount", "/myBalance", "/myLoans" ,"/myCards" ).authenticated()
            .antMatchers("/notices", "/contact").permitAll()
            .and().httpBasic();
}

CSRF

Cross site request forgery
이게 뭐냐면!
넷플릭스에 로그인을 해서 내 브라우저에 쿠키가 남아있는 상황에서, 다른 해커가 만든 사이트에 이동했는데, 이때 해커가 만든 사이트에 요청을 보낼때 나의 쿠키 정보가 모두 넘어가서 해커가 넷플릭스 웹 서버로 나의 개인정보를 얻어내는 요청을 보낼 수 있게 되는 것이다.

이를 막을 수 있는게 CSRF 토큰이다.
이 토큰은 처음으로 웹 브라우저와 나의 백엔드가 통신을 했을때 발행되고 백엔드와 통신할떄 유지가 되는데, 이 토큰은 브라우저의 공용부분에 쿠키로서 저장되지 않는다.

백엔드 서버는 이러한 CSRF 토큰이 없다면 통신을 막아버림으로써 해커의 공격을 방지한다.

이슈 해결

(1) disable csrf
굳이 csrf 토큰을 관리하지 않아도 될 정도로 웹 프론트와 서버의 보안이 철저하다.
그러면 disable 해도 된다.

http.csrf().disable()

(2) CSRF 토큰 발행하기

기본적으로 제공하는 CookieCsrfTokenRepository 객체를 이용해서 XSRF-TOKEN
라는 토큰을 발행하고 모든 통신에서 이를 확인한다.


@Override
protected void configure(HttpSecurity http) throws Exception {
    http.cors().configurationSource(...).and()
            .csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()).and()...
}

그러면 이제, 프론트엔드에서는 로그인을 하게 되면 window.sessionStorage 에 XSRF-TOKEN 을 저장하고, 모든 http request header 에 X-XSRF-TOKEN 를 붙여서 보낼 수 있도록 해야한다.

(3) CSRF 를 특정 url 에 대해서만 disable 하기
몇몇 request 에 대해서는 CSRF 토큰이 불필요한 경우가 있다. 이럴때에서 CSRF 토큰을 유지하면 유저에게 불필요한 제약을 가하게 된다.

ignoringAntMatchers 를 사용하면 된다.

.csrf().ignoringAntMatchers("/contact").csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()).and()
profile
개발자

0개의 댓글