본문 바로가기
웹 개발/error

[error/spring] 스프링 시큐리티 POST요청 시 403에러

by dani0312 2024. 2. 2.

◾에러 파악하기

✔️Background

spring boot 를 이용하여 토이 프로젝트로를 진행중이었고, 로그인 관련된 인증 부분은 spring security를 이용하였다. 

프로젝트를 진행하던 중, 인증을 모두 잘 마쳤는데 요청을 보낼  403 forbidden에러가 발생하였다. 

 

 

혼란을 주었던 것이, GET요청은 잘 요청이 가는데 POST요청을 보내면 403 에러가 발생하였다.

심지어 혹시 몰라 모든 url에 대해서도 `permitAll()`로 허용을 해두어도 에러가 계속 발생했다. 

 

 

 

◾에러 해결하기

우선 403에러는 주로 권한이 없을 때 발생하는 오류이다.  그럼 왜 권한이 없다고 뜨는 것인가?? url설정을 모두 허용하였는데도.

 

원인은 CSRF 였다. 

 

 

 CSRF란?

Cross-Site Request Forgery의 약자이다. 공격자가 사용자의 권한을 사용하여 웹 애플리케이션에서 의도하지 않은 요청을 만들도록 속이는 공격 방법이다. 공격자는 사용자가 이미 인증된 상태인 경우에 이를 악용하여 악성 요청을 전송한다. 

CSRF 공격은 주로 사용자가 특정 웹 사이트에 로그인한 상태에서 공격이 발생하며, 사용자가 악의적인 웹 사이트에 방문하거나 악성 이메일을 통해 이뤄질 수 있다.

 

Spring Security에서는 CSRF공격을 방어하기 위해 기본적으로 CSRF 토큰을 사용한다. 이 토큰은 웹 페이지의 폼에 포함되어 사용자의 브라우저가 이를 서버에 전송하도록 한다. 서버는 이 토큰을 검증하여 요청의 유효성을 확인한다.

 

Spring Security에서 CSRF토큰을 활성화하면, 기본적으로 모든 POST,PUT,DELETE 등의 변경을 가하는 요청에 대해 해당 토큰이 필요하게 된다. 만약 프론트엔드와 백엔드가 분리되어 있을 경우, 프론트엔드에서는 이 토큰을 요청 헤더에 포함하여 전송해야 한다. 

 

 

 

✔️해결 방안

`http.csrf().disable();` 또는 아래와 같이 csrf 토큰을 비활성화 시키는 코드를 추가해주면 된다. 위의 단락과 같은 이유로 스프링 시큐리티는 기본적으로 csrf을 체크하므로 변경을 요하는 요청들 POST등은 정상적으로 수행되지 않는 것이었다.

http
                .csrf().disable()

 

 

 

 


참고

https://iseunghan.tistory.com/302

chat.openai.com

 


/* 내가 추가한 코드 */ /* 내가 추가한 코드 끝끝 */