CSRF (Cross-site Request Forgery)

최준호·2022년 5월 18일
0

Spring

목록 보기
27/47
post-thumbnail

💬CSRF가 궁금해진 이유

@Configuration
@EnableWebSecurity
public class WebSecurity extends WebSecurityConfigurerAdapter {
    /*
     * security setting
     */
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable();  //csrf 
    }
}

개인 프로젝트를 할때마다 로그인 api를 작성할 때 가장 먼저 적용시켰던 코드는

http.csrf().disable();  //csrf 

해당 코드였다. 도대체 csrf가 뭐길래 disable 처리를 해주고 시작하는걸까? 라는 궁금증이 생겼다.

✍CSRF란?

CSRF란 Cross-Site Request Forgery로 번역하면 사이트 사이 위조 요청이다. 사이트에서 위조 요청이란 예를들어 내가 user의 비밀번호를 변경하는 post 요청을 만들었다 가정해보자.

url은 https://host/user/{userIdx}/{변경될 password}라는 url을 만들었을 경우 어떠한 사용자가 홈페이지에서 자신의 계정으로 로그인 한 뒤 해당 url로 자신의 userIdx가 아닌 다른 랜덤한 Idx를 넣고 비밀번호는 1234로 요청했다. https://host/user/10/1234 이렇게 된다면 10번 user는 누구인지 모르겠지만 비밀번호가 1234로 초기화가 되어버리는 것이다.

그래서 security에서는 해당 현상을 방지하기 위해 GET을 제외한 POST, PUT, DELETE 등의 요청으로부터 CSRF 토큰 값을 함께 요청하도록 하므로써 특정 사용자가 자신의 권한 이외의 요청을 방지하도록 방어하기 위한 수단으로 사용된 것이다.

✍근데 왜 API에서는 CSRF를 disabled?

기존의 웹은 session의 로그인 정보를 담아두고 서버에서 계속해서 인증정보를 저장하고 있었다. 하지만 api는 stateless(무상태)로써 로그인했을 경우 토큰을 발급하는 동작으로 더 이상 관여하지 않게 되고 그 이후에는 토큰에 저장된 값으로 매 요청마다 인증을 먼저 진행하고 반환이 되기 때문이다. 그래서 API에서는 굳이 CSRF를 사용할 필요가 없어서 disabled 처리를 한다.

profile
코딩을 깔끔하게 하고 싶어하는 초보 개발자 (편하게 글을 쓰기위해 반말체를 사용하고 있습니다! 양해 부탁드려요!) 현재 KakaoVX 근무중입니다!

0개의 댓글