본문 바로가기

웹프로그래밍/spring~~

Spring Security에서 Ajax post 방식 사용할 때

Spring Security 적용 이후에는 post 방식을 이용할 때 

csrf프로텍션이 적용되서 그렇다고 합니다.

CSRF(Cross Request Forgery: 사이트 간 요청 위조)인데 보안 대책으로 필수적으로 요구 된다고 합니다. 

 

ajax post방식 사용시 해결 방법은

https://docs.spring.io/spring-security/site/docs/4.2.2.RELEASE/reference/htmlsingle/#the-csrfmetatags-tag 여기 나와있는데 코드가 깔끔하지 못한 것 같아 다른 방법을 찾아서 정리를 해보았습니다.

 

 

befornSend에서 토큰 값을 보내는 것이 중요합니다. 

 

 <meta id="_csrf" name="_csrf" th:content="${_csrf.token}"/>
 <meta id="_csrf_header" name="_csrf_header" th:content="${_csrf.headerName}"/>
 
 <script>
 var token = $("meta[name='_csrf']").attr("content");
 var header = $("meta[name='_csrf_header']").attr("content");

$.ajax({
	data : data
	,url : "url"
	,type : "POST"
	/*데이터를 전송하기 전에 헤더에 csrf값을 설정한다*/
	,beforeSend : function(xhr){
		xhr.setRequestHeader(header, token);
	}
	,success : function(data) {
		if(data == true)
			alert("성공");
	}
});
</script> 

 

 

 

위에 처럼 meta 태그 를 안쓰고 직접 값을 써서 사용할 수 도 있습니다.

 

<script th:inline="javascript">
var header = /*[[${_csrf.headerName}]]*/;
var token = /*[[${_csrf.token}]]*/;

$.ajax({
	data : data
	,url : "url"
	,type : "POST"
	/*데이터를 전송하기 전에 헤더에 csrf값을 설정한다*/
	,beforeSend : function(xhr){
		xhr.setRequestHeader(header, token);
	}
	,success : function(data) {
		if(data == true)
			alert("성공");
	}
});
</script>
반응형