1. 프론트에서 입력한 데이터를 fetch Api 를 이용해서 서버에 보내주려고 하는 과정에서 문제가 발생했다.. 분명히 Spring security를 설정하지 않았을 때는 서버로 데이터 전달이 잘만 됐었는데.. 뭐지..??
잘안됨... 그래서 Spring Security 에 대해서 더 공부해봤다 그래서 데이터 전송이 안된 이유는
CSRF설정 때문이었다
CSRF는 사용자가 신뢰하는 웹사이트에서 의도치 않은 요청을 전송하게 만드는 공격 방식이다. Spring security 에서는 CSRF가 기본적으로 설정이 되어있기 때문에 따로 비활성화 설정을 해주지 않으면 서버는 POST, PUT, DELETE와 같은 상태 변경 요청에서 CSRF 토큰을 요구하게 된다. 이 때문에 회원가입 페이지에서 서버에게 POST방식으로 전달하려고 했을 때 데이터가 서버에 전달되지 않은 것이었다.
이렇게 글로만 보면 어떤 방식으로 돌아가는지 모호한것 같아서 예시 시나리오를 하나 찾아봤다 이걸 보고 어떤 방식으로 돌아가는지 알아봤다.
1. 사용자 상황:
- 사용자는 A은행 웹사이트에 로그인하여 자신의 계좌를 관리 중입니다. 이때 사용자는 브라우저에서 A은행의 세션이 유지된 상태입니다.
2. 공격자가 만든 악성 사이트:
- 공격자는 사용자가 자주 방문하는 뉴스 웹사이트에 악성 스크립트를 심어둡니다. 공격자는 A은행이 사용자의 계좌에서 다른 계좌로 송금할 수 있는 URL을 알고 있으며, 이를 악용하기 위해 공격 코드를 삽입합니다. 예를 들어, A은행에서 송금을 요청하는 URL이 다음과 같다고 가정합니다:
https://a-bank.com/transfer?toAccount=12345&amount=1000
이 URL을 실행하면 사용자의 계좌에서 '12345' 계좌로 1000원을 송금하는 요청이 실행됩니다.
3. 사용자가 악성 사이트 방문
- 사용자가 뉴스 웹사이트에 접속하면, 공격자가 심어둔 악성 코드가 다음과 같이 실행됩니다
<img src="https://a-bank.com/transfer?toAccount=12345&amount=1000" />
- 이 코드는 이미지 태그를 통해 A은행의 송금 요청을 서버로 전송합니다. 이때 사용자는 A은행에 로그인한 상태이므로 브라우저는 자동으로 A은행의 쿠키를 사용하여 요청을 처리합니다
4. 결과
- A은행 서버는 요청이 적법한지 확인하기 위해 세션을 확인하고, 사용자가 이미 로그인한 상태이기 때문에 이 요청을 정상적인 요청으로 간주합니다. 결과적으로 사용자의 계좌에서 1000원이 공격자의 계좌로 송금됩니다.
마무리
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.csrf(csrf -> csrf.disable())
.authorizeHttpRequests((requests) -> requests
// 권한 없이 접근 가능한 URL 경로 설정
.requestMatchers("/accounts", "/", "/sign-up").permitAll()
// 그 외의 모든 요청은 인증 필요
)
// 로그인 폼 설정 (기본 제공 로그인 페이지 사용)
.formLogin((form) -> form
.loginPage("/login") // 커스텀 로그인 페이지 설정 가능
.permitAll()
)
// 로그아웃 설정
.logout((logout) -> logout
.permitAll()
);
return http.build();
}
그렇게 위 처럼 FilterChain에 CSRF를 비활성화 해줬더니 데이터가 다시 이동이 잘된다!
'Back-End > Spring' 카테고리의 다른 글
[Spring security] 중복 로그인 방지 기능 만들다가 마주친 Maximum sessions of 1 for this principal exceeded 오류 + 리스너 개념 (0) | 2024.09.11 |
---|---|
[Spring] RestAPI와 @ResponseEntity (0) | 2024.09.10 |
[Spring] @Autowired 와 @RequiredArgsConstructor (1) | 2024.09.06 |
[Spring] 의존성 주입이란? (1) | 2024.09.06 |