반응형
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 |