[Start Spring Boot] Spring Security CSRF

·2024년 4월 16일
0

Start Spring Boot!

목록 보기
42/53
post-thumbnail

CSRF

기존 code

  • SpringSecurityConfiguration.java
http.csrf().disable();
  • 다음과 같은 방식으로 CSRF를 비활성화 해서 사용하였었다.

CSRF 맛보기

  • 위의 코드를 제거하고 POST 작업을 수행해보자!
  • 다음과 같은 오류를 볼 수 있다.

What is?

  • Cross-site request forgery
  • 인증된 사용자가 웹 애플리케이션에 특정 요청을 보내도록 유도하는 공격
  • 제품 구매, 비밀번호 변경등의 요청을 위조해서 보냄

CSRF 무시하기

  • SpringSecurityConfiguration.java
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.csrf().ignoringRequestMatchers("/api/v1/team");
        return http.build();
    }
    
  • 주로 API의 엔드 포인트를 포함
  • 회원가입 등의 엔드 포인트를 추가
  • 정상적으로 post가 실행된다.

CSRF 토큰 처리하기

  • 서버에 들어온 요청이 허용된 요청인지 확인하기 위한 토큰
  • 사용자 로그인시 토큰을 발급
  • CsrfTokenRepository를 통해서 관리한다.

CSRF 토큰 사용 설정하기

  • SpringSecurityConfiguration.java
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {

        CsrfTokenRequestAttributeHandler requestHandler = new CsrfTokenRequestAttributeHandler();
        requestHandler.setCsrfRequestAttributeName("_csrf");
        http.csrf((csrf)-> csrf.csrfTokenRequestHandler(requestHandler).ignoringRequestMatchers("/user/**", "/h2-console/**")
                .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()));

        return http.build();
    }
    
  • CsrfTokenRequestAttributeHandler: CSRF 토큰을 요청에 추가
  • setCsrfRequestAttributeName(): 토큰의 속성이름을 설정
  • ignoringRequestMatchers(): CSRF 보호를 해제
  • csrfTokenRepository(): 토큰 저장소를 설정
  • CookieCsrfTokenRepository.withHttpOnlyFalse(): 쿠키를 사용하여 CSRF 토큰을 저장

Filter 만들기

  • 필터는 인증 후 정보를 보내주기 위해서 사용한다.
  • rest 방식등에서 필요
  • CsrfCookieFilter.java
public class CsrfCookieFilter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
            throws ServletException, IOException {
        CsrfToken csrfToken = (CsrfToken) request.getAttribute(CsrfToken.class.getName());
        if(null != csrfToken.getHeaderName()){
            response.setHeader(csrfToken.getHeaderName(), csrfToken.getToken());
        }
        filterChain.doFilter(request, response);
    }

}
  • 요청에 CSRF 토큰을 추가한다.

Filter 적용하기

  • SpringSecurityConfiguration.java
        http.csrf((csrf)-> csrf.csrfTokenRequestHandler(requestHandler).ignoringRequestMatchers("/user/**", "/h2-console/**")
                .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()))
                .addFilterAfter(new CsrfCookieFilter(), BasicAuthenticationFilter.class);
                
  • addFilterAfter(One, Two): 두 번째 인자를 실행 후 첫 번째 필터를 실행한다.

섹션 유지하기

  • SpringSecurityConfiguration.java
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.securityContext((context) -> context.requireExplicitSave(false))
                .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.ALWAYS));

        return http.build();
    }
  • 다음과 같이 설정해주지 않는다면 계속해서 인증을 해야한다.

  • 다음과 같이 쿠키에서 토큰을 확인할 수 있다.
profile
백엔드 개발자가 꿈인 컴공과

0개의 댓글

관련 채용 정보