반응형
jsp는 <sec:csrfMetaTags /> 이거만 붙이면 됨..
freemarker는 <@sec.scrfMetaTags /> 이걸로 되야되는데... 안된다. tld파일에도 분명히 들어있는데.
freemarker를 참 싫어하는 듯
이럴 땐 아래처럼, 그냥 명시해준다.
어차피 View들어올때 csrf관련 객체가 같이 들어오기 때문에, 값 활용이 가능하다.
<meta name="_csrf_parameter" content="${_csrf.parameterName}" />
<meta name="_csrf_header" content="${_csrf.headerName}" />
<meta name="_csrf" content="${_csrf.token}" />
이제 form형식이 아닌, jquery로 ajax통신을 하여 데이터를 땡겨오는 경우에 한 번 더 문제가 발생한다.
http://docs.spring.io/spring-security/site/docs/current/reference/htmlsingle/ 아래 링크를 참조해보면,
jquery 초기화 구문에, 아래 구문을 넣어서 이용하라고 한다.
$(function () {
var token = $("meta[name='_csrf']").attr("content");
var header = $("meta[name='_csrf_header']").attr("content");
$(document).ajaxSend(function(e, xhr, options) {
xhr.setRequestHeader(header, token);
});
});
다 맞는 말이긴한데, jquery 1.4버전 이하에서나 사용이 가능하고,
이후버전을 사용하면 뜬금없이 jquery가 toLowerCase()를 찾지 못했다고 나온다.
이런 경우! 아래와 같이 토큰과 헤더가 모두 있을 경우에만 처리하도록, 예외처리 구문을 넣으면 해결이 된다.
$(function () {
var token = $("meta[name='_csrf']").attr("content");
var header = $("meta[name='_csrf_header']").attr("content");
$(document).ajaxSend(function(e, xhr, options) {
if(token && header) {
xhr.setRequestHeader(header, token);
}
});
});
이후, 모든 $.ajax요청들에는 beforeSend구문에 csrf헤더 정보가 들어가게 되어,
ajax api 처리 시 csrf 토큰을 정상적으로 이용할 수 있게 된다.
반응형
'개발 > Spring Framework' 카테고리의 다른 글
| [Spring Boot] jar로 패키징 시 daemon화 시키기 (0) | 2016.06.10 |
|---|---|
| [Spring Boot] freemarker에서 Spring Security taglib 인식이 안되는 경우 (0) | 2016.06.10 |
| [Spring Fox] Swagger-SpringMvc에서 Migration하기 (0) | 2016.06.10 |
| [Spring Loaded] Spring Boot Hot Swapping (0) | 2016.06.10 |
| [Spring Security] csrf token handling (0) | 2016.06.10 |