반응형
jsp는 <sec:csrfMetaTags /> 이거만 붙이면 됨..
freemarker는 <@sec.scrfMetaTags /> 이걸로 되야되는데... 안된다. tld파일에도 분명히 들어있는데.
freemarker를 참 싫어하는 듯
이럴 땐 아래처럼, 그냥 명시해준다.
어차피 View들어올때 csrf관련 객체가 같이 들어오기 때문에, 값 활용이 가능하다.
1 2 3 | < 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 초기화 구문에, 아래 구문을 넣어서 이용하라고 한다.
1 2 3 4 5 6 7 | $( 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()를 찾지 못했다고 나온다.
이런 경우! 아래와 같이 토큰과 헤더가 모두 있을 경우에만 처리하도록, 예외처리 구문을 넣으면 해결이 된다.
1 2 3 4 5 6 7 8 9 | $( 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 |