CSRF란?

이연희·2022년 10월 5일
0

Spring

목록 보기
104/105
post-custom-banner

CSRF(Cross Site Request Forgery)

정상적인 사용자가 의도치 않은 위조요청을 보내는 것을 의미한다.
A 도메인에서 인정된 사용자 user1이 위조된 request를 포함한 link, email을 사용했을 경우 A 도메인에서는 이 사용자가 일반 유저인지 악용된 공격인지 구분할 수 없다.

CSRF protection은 spring security에서 default로 설정된다. protection을 통해서 GET 요청을 제외한 상태를 변화시킬 수 있는 POST, PUT, DELETE 요청으로부터 보호한다.

@EnableWebSecurity
@RequiredArgsConstructor
public class SecurityConfig {

    private final AuthTokenProvider authTokenProvider;

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .csrf().disable()
        ...
        return http.build();
    }

CSRF protection을 적용하면 html에서 아래와 같은 csrf 토큰이 포함되어야 요청을 받아들이게 되어 위조 요청을 방지한다.

<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>

REST API에서 CSRF

CSRF을 disable한 이유

공식문서에서 non-browser clients만을 위한 서비스라면 csrf를 disable 해도 좋다고 명시되어 있다. 이유는 rest api를 이용하는 서버라면 세션 기반 인증과는 다르게 stateless하기 때문에 서버에 인증정보를 보관하지 않는다. rest api에서 client는 권한이 필요한 요청을 하기 위해서 요청에 필요한 인증정보(OAuth2, jwt 토큰)을 포함시켜야 한다.

그래서 서버에 인증정보를 저장하지 않기 때문에 불필요한 csrf 코드를 작성하지 않아도 된다.

참고
https://velog.io/@woohobi/Spring-security-csrf%EB%9E%80

profile
공부기록
post-custom-banner

0개의 댓글