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);
}
}
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();
}
- 다음과 같이 설정해주지 않는다면 계속해서 인증을 해야한다.

- 다음과 같이 쿠키에서 토큰을 확인할 수 있다.