hrming
[에러] Spring security - AJAX Post 호출 시 403 Forbidden 에러 본문
추천 버튼을 클릭하면, AJAX를 통해서 Post 호출을 하려고 하는데 계속 403 Forbidden에러가 났다.
처음에는 권한 문제인가 싶었는데, Spring security에서 AJAX Post 호출 시, CSRF 토큰이 없을 경우에 해당 호출을 차단하면서 발생하는 에러라고 한다.
CSRF ( Cross-Site Request Forgery )
- 사이트간 요청 위조
- 공격자가 사용자가 로그인한 웹사이트를 통해 사용자가 모르는 상황에서 원치 않는 동작을 수행하게 하는 보안 취약점.
( CSRF 사례는 하단에 참고한 블로그들 중에, 2번째 블로그에 잘 성명되어 있다. 😎👍)
CSRF Filster
- 웹 어플리케이션에서 CSRF(Cross-Site Request Forgery) 공격을 방지하기 위한 필터
- Spring Security에서 제공하는 CsrfFilter는, HTTP 요청에 대해 CSRF 토큰을 생성하고, 이 토큰을 쿠키에 저장한다. 그리고 나서, 모든 POST, PUT, DELETE 요청에 대해 CSRF 토큰이 함께 전송되어야 하는지를 검증한다. 만약 요청에 CSRF 토큰이 없다면, 해당 요청을 차단한다. ✨✨✨
- Spring Security를 사용하는 웹 어플리케이션에서는, CsrfFilter를 설정하여 CSRF 공격으로부터 보호할 수 있다. http.csrf() 로 설정하면 활성화되지만 기본 활성화되어 있으므로 따로 설정할 필요는 없다. 기능이 활성화되면 아래와 같은 역활을 수행한다.
- 모든 요청에 랜덤하게 생성된 토큰을 HTTP 파라미터로 요구
- 요청 시 전달되는 토큰 값과 서버에 저장된 실제 값과 비교한 후 만약 일치하지 않으면 요청은 실패한다
✔️ 해결 방법 1 - CSRF 비활성화
: 아래와 같이 Config에서 CSRF를 비활성화하면, 403 에러는 발생하지 않지만 보안 취약성이 있음.
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
// .csrf(csrf -> csrf.disable()) // CSRF 비활성화
.authorizeHttpRequests((requests) -> requests
.requestMatchers("/", "/user/signUp", "/css/**", "/img/**").permitAll()
.anyRequest().authenticated()
)
.formLogin((form) -> form
.loginPage("/user/login")
.permitAll()
)
.logout((logout) -> logout.permitAll());
return http.build();
}
✔️ 해결 방법 2 - AJAX 호출 header에 CSRF token 추가하여 전송
// header 에 추가
<meta id="_csrf" name="_csrf" th:content="${_csrf.token}" />
<meta id="_csrf_header" name="_csrf_header" th:content="${_csrf.headerName}" />
var header = $("meta[name='_csrf_header']").attr('content'); ---- 추가
var token = $("meta[name='_csrf']").attr('content'); ---- 추가
var btnRecommend = document.getElementById("btnRecommend");
btnRecommend.addEventListener("click", function () {
if([[${review.user.username == username}]]) {
alert('본인이 작성한 리뷰는 추천할 수 없습니다.')
} else{
$.ajax({
type : 'post',
url : '/review/recommend',
beforeSend: function(xhr){ ---- 추가
xhr.setRequestHeader(header, token);
},
data : JSON.stringify({
"reviewId" : [[${review.id}]],
"loginId" : [[${loginId}]],
}),
contentType : 'application/json; charset=utf-8',
success : function(result) {
console.log(result);
},
error : function(request, status, error) {
console.log(error)
}
})
}
});
참고 및 출처:
https://whitewise95.tistory.com/276#2.1.%20CsrfFilter%EB%9E%80?
Spring Boot 기반으로 개발하는 Spring Security : CSRF, CsrfFilter
CSRF CSRF란? CSRF는 Cross-Site Request Forgery의 약어로, "사이트간 요청 위조"를 의미한다. 공격자가 사용자가 로그인한 웹사이트를 통해 사용자가 모르는 상황에서 원치 않는 동작을 수행하게 하는 보
whitewise95.tistory.com
https://tlatmsrud.tistory.com/77
[SpringSecurity] CSRF란? / CSRF Filter 처리 방식
1. 개요 CSRF의 정의 Spring Boot에서의 CSRF Filter 처리 방식 2. CSRF란? 사이트 간 요청 위조(Cross-site request forgery, CSRF)는 웹사이트 취약점 공격의 하나로, 사용자가 자신의 의지와는 무관하게 공격자가
tlatmsrud.tistory.com
[Spring] Security CSRF 비활성화 (6.1 버전 이상)
0. 먼저 CSRF란? CSRF(Cross-Site Request Forgery, 사이트 간 요청 위조)는 웹 보안 취약점 중 하나로, 사용자가 자신의 의지와는 무관하게 공격자가 조작한 요청을, 신뢰할 수 있는 사이트에 대해 보내도록
shoney.tistory.com
https://velog.io/@jyleedev/514-ajax-post-%ED%86%B5%EC%8B%A0-403-error
[Ajax 에러] - 스프링 시큐리티 ajax post 통신 403 forbidden error
ajax 통신 시 403 forbidden 에러 발생 임시 비밀번호를 전송하는 컨트롤러(/sendPwd) 를 호출하기 위해 생성한 javascript 함수 sendEmail 호출 시 SecurityConfig에서 permit 해줬음에도 불구하고 계속 403 에러가
velog.io
'기타' 카테고리의 다른 글
[IntelliJ] 브레이크포인트 관리 (0) | 2024.05.09 |
---|---|
[IntelliJ] JS 디버깅 (0) | 2024.05.08 |
[기타] Code Refactoring (1) | 2024.03.06 |
[기타] CSR & SSR (0) | 2024.03.06 |
[기타] Commit Message (0) | 2024.03.05 |