SpringBoot 를 배워보자/7. 보안

CSRF 보호

_Blue_Sky_ 2024. 9. 29. 16:07
728x90

스프링 부트 CSRF 보호: 상세 설명 및 실제 예시

서론

웹 애플리케이션의 보안은 날이 갈수록 중요해지고 있으며, 그 중에서도 CSRF(Cross-Site Request Forgery, 사이트 간 요청 위조) 공격은 꾸준히 발생하는 위협 중 하나입니다. CSRF 공격은 악의적인 사용자가 사용자를 대신하여 특정 행위를 수행하도록 유도하는 공격으로, 은행 계좌 이체, 게시글 삭제 등 민감한 작업에 악용될 수 있습니다. 스프링 부트는 CSRF 공격으로부터 애플리케이션을 보호하기 위한 강력한 기능을 제공하며, 이 글에서는 스프링 부트의 CSRF 보호 기능에 대해 자세히 알아보고 실제 예시를 통해 이해를 돕도록 하겠습니다.

CSRF란 무엇인가?

CSRF 공격은 사용자가 이미 신뢰할 수 있는 웹 사이트에 로그인되어 있는 상태에서, 악의적인 웹 사이트의 이미지, 링크 등을 클릭하거나 악성 스크립트가 삽입된 페이지를 방문하게 되면 발생할 수 있습니다. 이때, 악의적인 웹 사이트는 사용자의 브라우저를 통해 해당 사용자의 세션 쿠키를 포함한 HTTP 요청을 공격 대상 웹 사이트로 전송하게 됩니다. 공격 대상 웹 사이트는 이 요청이 실제 사용자에 의해 발생한 것으로 인식하고, 요청을 처리하게 됩니다.

728x90

스프링 부트의 CSRF 보호 기능

스프링 부트는 Spring Security를 기반으로 CSRF 공격을 방어하기 위한 강력한 기능을 제공합니다. 핵심적인 기능은 다음과 같습니다.

  • CSRF 토큰 생성 및 검증: 스프링 부트는 HTTP 요청마다 고유한 CSRF 토큰을 생성하고, 이 토큰을 HTTP 응답의 쿠키에 포함하여 클라이언트에 전달합니다. 클라이언트는 이 토큰을 다시 HTTP 요청에 포함하여 서버로 전송해야 합니다. 서버는 클라이언트로부터 받은 토큰과 자체적으로 생성한 토큰을 비교하여 일치하는지 확인합니다. 만약 일치하지 않으면 CSRF 공격으로 간주하고 요청을 거부합니다.
  • HTTP 메서드 제한: 스프림 부트는 기본적으로 GET, HEAD, TRACE, OPTIONS 메서드를 제외한 모든 HTTP 메서드에 대해 CSRF 보호를 적용합니다. 이는 POST, PUT, DELETE 등의 메서드를 통해 데이터를 수정하거나 삭제하는 요청에 대해서만 CSRF 토큰을 검증하도록 하여 보안을 강화합니다.
  • 커스텀 설정: 스프링 부트는 CSRF 보호 기능을 커스터마이징할 수 있는 다양한 설정 옵션을 제공합니다. 예를 들어, 특정 URL에 대해 CSRF 보호를 비활성화하거나, 커스텀 토큰 생성 로직을 구현할 수 있습니다.

실제 예시

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/", "/home").permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .and()
            .csrf();
    }
}
 

위 코드는 스프링 부트 애플리케이션에서 CSRF 보호를 위한 기본적인 설정 예시입니다. csrf() 메서드를 호출하여 CSRF 보호 기능을 활성화하면 스프링 시큐리티는 자동으로 CSRF 토큰을 생성하고 검증합니다.

CSRF 보호 시 주의사항

  • CSRF 토큰 노출 방지: CSRF 토큰은 절대 클라이언트 측에서 직접적으로 노출해서는 안 됩니다. 반드시 서버에서 생성하여 HTTP 응답의 쿠키에 포함하여 클라이언트에 전달해야 합니다.
  • AJAX 요청: AJAX 요청 시에도 CSRF 토큰을 포함해야 합니다. 스프링 시큐리티는 @ModelAttribute 어노테이션을 사용하여 폼 데이터와 함께 CSRF 토큰을 자동으로 바인딩해줍니다.
  • CSRF 보호 비활성화: 특정 URL에 대해 CSRF 보호를 비활성화해야 하는 경우에는 csrf().disable() 메서드를 사용할 수 있습니다. 하지만 이는 보안에 대한 위험을 초래할 수 있으므로 신중하게 판단해야 합니다.
  • iframe: iframe을 사용하여 다른 도메인의 콘텐츠를 포함하는 경우 CSRF 공격에 취약할 수 있습니다. iframe을 사용할 때는 X-Frame-Options 헤더를 설정하여 클릭재킹 공격을 방지해야 합니다.

결론

스프링 부트는 CSRF 공격으로부터 웹 애플리케이션을 보호하기 위한 강력한 기능을 제공합니다. 개발자는 스프링 시큐리티의 CSRF 보호 기능을 올바르게 이해하고 적용하여 애플리케이션의 보안을 강화해야 합니다.

 

728x90

'SpringBoot 를 배워보자 > 7. 보안' 카테고리의 다른 글

XSS 방지  (0) 2024.09.29
사용자 인증 및 권한 부여  (0) 2024.09.29
스프링 시큐리티 기본 설정  (0) 2024.09.29