원본 본문으로 이동하기

CSRF : 2. 스프링 시큐리티를 이용한 적용 (확장 태그 미지원 템플릿을 위한)

박용서 - CSRF 시리즈 1. 공격법과 방어법 (XSS 설명 추가) - https://gs.saro.me/#!m=elec&jn=822 2. 스프링 시큐리티를 이용한 적용 (확장 태그 미지원 템플릿을 위한) - https://gs.saro.me/#!m=elec&jn=823 스프링 시큐리티 설치 - 스프링 시큐리티 시리즈 https://gs.saro.me/#!m=elec&p=1&jn=790 스프링 시큐리티 설치시 기본으로 csrf 가 작동합니다. Mustache 예제 또 여러가지 지원을 해주지 않는 머스터치를 위해 인터셉터를 추가해보겠습니다. <html> <body> <form method="POST" enctype="multipart/form-data" action="/넘길페이지"> <div> <input type="submit" value="Upload" /> </div> </form> </body> </html> 보통 위와 같이 넘기게 될경우 403 (서비스 거부) 오류가 날 것입니다. 머스터치에선 바로 시큐리티를 빼올 수 없기 때문에 HandlerInterceptor 를 써보겠습니다. <html> <body> <form method="POST" enctype="multipart/form-data" action="/넘길페이지"> <div> <input type="hidden" name="_csrf" value="{{#_csrf}}token{{/_csrf}}" /> <input type="submit" value="Upload" /> </div> </form> </body> </html> _csrf.token 으로 값을 주었습니다. HandlerInterceptorAdapter - 참고 : https://gs.saro.me/#!m=elec&jn=810 @Component public class CsrfInterceptor extends HandlerInterceptorAdapter { @Override public void postHandle ( HttpServletRequest req, HttpServletResponse res, Object handler, ModelAndView modelAndView ) throws Exception { if (modelAndView != null) { // _csrf 를 찾아. modelAndView.addObject("_csrf", new Mustache.Lambda() { public void execute(Template.Fragment frag, Writer out) throws IOException { // token 에 해당할 경우 if ("token".equals(frag.execute())) { // 토큰으로 치환 out.write( ((CsrfToken) req.getAttribute(CsrfToken.class.getName())).getToken() ); } } }); } super.postHandle(req, res, handler, modelAndView); } } 인터셉터 추가 @Configuration public class WebMvcConfig extends WebMvcConfigurerAdapter { @Autowired CsrfInterceptor csrfInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(csrfInterceptor); } } 실행 소스보기를 누르면 아래와같이 추가되어있을겁니다. 물론 저 벨류는 랜덤한 값으로 보냅니다. (강의 1장 참고) <html> <body> <form method="POST" enctype="multipart/form-data" action="/넘길페이지"> <div> <input type="hidden" name="_csrf" value="a60159ae-9b7f-45dc-9c97-3a5f14a39cbd" /> <input type="submit" value="Upload" /> </div> </form> </body> </html> 그리고 넘겼을 경우 403없이 정상 작동할 경우 성공!! - 보안 HTTP 스프링