sm 기술 블로그

[스프링 시큐리티] CSRF(cross site request forgery) 본문

스프링부트

[스프링 시큐리티] CSRF(cross site request forgery)

sm_hope 2022. 7. 23. 10:37

인증구조

기본적으로 인증은 다음과 같이 진행된다.


상세하게 설명해보면 한번 인증 후 다시 인증할 때는 토큰을 이용한다.

CSRF공격이 이루어지면


다음과 같이 해커가 인증된 토큰을 훔쳐 인증에 사용한다.
최악에 상황에서는 금융 정보를 훔쳐 인터넷으로 계좌이체를 자유롭게 하게 된다.

package com.mysite.sbb;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
@EnableWebSecurity
public class SecurityConfig {
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.authorizeRequests().antMatchers("/**").permitAll()
            .and()
                .csrf().ignoringAntMatchers("/h2-console/**")
            ;
        return http.build();
    }
}
  • and() 는 http 객체의 설정을 이어서 할 수 있는 메서드
  • antMatchers는 특정한 경로를 지정한다.
  • antMatchers는 특정한 경로를 무시한다.
  • 따라서 .csrf().ignoringAntMatchers("/h2-console/**")은 h2로 시작하는 URL은 CSRF검증을 하지 않는다.
  • 무시해주는 이유는 h2로 로그인시 403오류가 발생하기 때문이다(CSRF 기능이 동작하기 때문으로 발생하는 문제)

X-Frame-Options

해결을 한다 해도


다음과 같은 오류가 발생할 수 있다.

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.header.writers.frameoptions.XFrameOptionsHeaderWriter;

@Configuration
@EnableWebSecurity
public class SecurityConfig {
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.authorizeRequests().antMatchers("/**").permitAll()
            .and()
                .csrf().ignoringAntMatchers("/h2-console/**")
            .and()
                .headers()
                .addHeaderWriter(new XFrameOptionsHeaderWriter(
                        XFrameOptionsHeaderWriter.XFrameOptionsMode.SAMEORIGIN))
            ;
        return http.build();      
    }
}
Comments