SMALL
Spring Security를 사용하는 경우 간혹 Ajax에서 POST 메소드 호출을 할 때 403 Forbidden 에러가 발생한다.
확인해봤지만 mapping된 url의 문제도 아니고, 데이터의 문제도 아니었다.
이 경우 CSRF의 토큰을 넘겨주지 않아 발생한 오류일 확률이 매우 높다.
CSRF (Cross Site Request Forgery)
: 사용자의 의지와 관계없이 공격자의 의도로 서버에 특정 요청을 하는 것
예를 들어, 사용자가 서버에 요청을 보낼 때, 공격자가 페이지를 인터셉트하여 위조 후 다른 요청을 서버에 보내는 경우이다. 유사한 공격으로 XSS (Cross Site Scripting)이 있는데, XSS는 클라이언트를, CSRF는 서버를 공격한다는 차이가 있다.
이러한 공격을 예방하기 위해서 다양한 조치를 취할 수 있다.
먼저, Form의 요청 방식은 당연히 POST 방식이어야 한다.
그 외에도
Referrer 검증, CSRF 토큰 사용, CAPCHA 사용 등이 있다.
나는 CSRF 토큰을 넘겨주어 문제를 해결했다.
html
<head>
<meta name="_csrf" th:content="${_csrf.token}"/>
<meta name="_csrf_header" th:content="${_csrf.headerName}"/>
</head>
ajax
var token = $("meta[name='_csrf']").attr("content");
var header = $("meta[name='_csrf_header']").attr("content");
$.ajax( {
url:"/book/user/login",
type:'POST',
dataType: "json",
data: {
id : id,
pw : pw
},
beforeSend:function(xhr) {
xhr.setRequestHeader(header, token);
}
});
goMain(data.username);
403 Forbidden
원인에는 다양한 문제가 있다.
1) 인증 문제
: 보안상 이슈 처리를 해주어야 한다.
2) Client측 문제
: 요청된 URL 확인 / Cookie 삭제 / Cache 삭제 / 로그아웃을 통한 토큰 유실을 통해 해결이 가능하다.
3) Server측 문제
: DB 사용자 인증 확인 / 서버 연결 확인 / 웹서버 구성 확인을 통해 해결이 가능하다.
SMALL
'기록 > Web' 카테고리의 다른 글
[Spring][Ajax] Javascript를 통해 checkBox값 넘기기 (0) | 2021.05.06 |
---|---|
[Spring] @RequestBody와 @ResponseBody (0) | 2021.05.06 |
[Spring] [xX][mM][lL]"과 일치하는 처리 명령 대상은 허용되지 않습니다. (0) | 2021.04.06 |
[IntelliJ] Github 연동 (0) | 2021.03.24 |
[AWS] Lambda와 API Gateway를 연결하여 쿼리 실행 (0) | 2020.12.27 |