본문 바로가기

기록/Web

[Spring Security] CSRF 취약점

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