CSRF

Cross Site Request Forgery 로,

정상적인 사용자가 의도치 않은 위조 요청을 보내는 것을 의미합니다.

 

그래서 CSRF protection 은 Spring Security 에서 디폴트로 설정됩니다.

protection 을 통해 GET 요청을 제외한 상태를 변화시킬 수 있는 POST,PUT,DELETE 요청으로부터 보호하게 됩니다.

 

CSRF 취약점

사용자가 의도하지 않은 요청을 수행하게 하는 취약점을 가지고 있습니다.

예를 들어, 로그인한 사용자 권한을 사용하여 다른 페이지에서 패스워드를 변경하게 되는 경우입니다.

 

 

 

CSRF 를 왜 disable 하기 시작하였는가?

Spring Security Documentation 에 non-broswer clients 만을 위한 서비스라면 disalbe 해도 좋다고 합니다.

 

그 이유는 REST API 를 이용한 서버라면 세션 기반 인증과는 다르게 stateless 하기 때문에

사용자의 정보를 세션에 저장하지 않아, 서버에 인증정보가 따로 보관되어 있지 않습니다.

일반적으로 JWT 같은 토큰을 사용해 인증하기 때문에, 토큰을 쿠키에 저장하지 않는다면 CSRF 취약점에 대해서

어느정도 안전하다고 말할 수 있습니다.

 

 

 

결론

Spring Security 는 디폴트로 헤더에 Cache-Control 을 추가하고 no-cache, no-store 등의 옵션을 추가합니다.

이는 브라우저에게 쿠키를 못쓴다고 알려주는 역할을 합니다.

그래서 쿠키를 사용하려면 Cache-Control 이라는 헤더를 없애줘야합니다.

 

그리고 쿠키를 쓰는 방식은 보안에 취약하여 크롬에서 쿠키없이 보안 설정을 하려고 노력하고 있다고 합니다.

따라서 Spring Security도 이에 발맞추고 있으므로 csrf 공격에 대비하기 위하여 csrf 토큰을 만들 필요가 없습니다.

 

 

 

사용예시

http
                .formLogin()
                .loginPage("/member/login")
                .loginProcessingUrl("/member/login-do")
                .defaultSuccessUrl("/main")

위의 코드로 로그인을 구현한다면 /login-do 로 POST 를 사용하여 로그인 기능을 처리하고 싶지만, POST는 되지 않습니다.

그래서 다음 코드를 추가해줘야 합니다.

.and()
                .csrf().disable();

CSRF 기능을 끈다면 POST 를 통해 사용자 정보를 사용할 수 있게 됩니다.

'스터디' 카테고리의 다른 글

Swagger Annotation  (0) 2023.09.13
서블릿과 스프링MVC  (0) 2023.01.01
세션과 쿠키, JWT  (0) 2022.12.31
로그인 페이지는 GET ? POST ? (2)  (0) 2022.12.04
로그인 페이지는 GET ? POST ? (1)  (0) 2022.12.01

+ Recent posts