시스템으로 전송되는 모든 요청에 대해 정상적인 사용자의 유효한 요청인지, 아닌지 여부를 판별할 수 있도록 해야 한다.
// 게시판 글쓰기 페이지 요청을 처리
@RequestMapping(“/write.do”)
public String boardWrite(@ModelAttribute(“BoardModel”)
BoardModel
boardModel, HttpSession session) {
// 난수 형태의 토큰을 생성하여 세션에 저장
session.setAttribute(“SESSION_CSRF_TOKEN”, UUID.randomUUID().toString()); return “/board/write”;
}
<input type=”hidden” name=”PARAM_CSRF_TOKEN” value=”${SESSION_CSRF_TOKEN}”/>
String sessionToken = (String)session.getAttribute(“SESSION_CSRF_TOKEN”);
String paramToken = request.getParameter(“PARAM_CSRF_TOKEN”);
if (paramToken != null && paramToken.equals(sessionToken)) {
// 토큰 일치 = 정상적인 절차에 따른 요청 -> 요청 처리
} else {
// 토큰 불일치 = 비정상적인 절차에 따른 요청 -> 오류 처리
}
• Spring Security
• Apache Struts
• OWASP CSRFGuard
• Django
• CSRF Protecto
출처: 행정안전부 인터넷진흥원 소프트웨어 보안약점 진단 가이드