[설계단계] 1-6. 웹 기반 중요 기능 수행 요청 유효성 검증

김경민·2022년 6월 21일
1

security

목록 보기
4/15
post-thumbnail

[설계단계] 1-6. 웹 기반 중요 기능 수행 요청 유효성 검증

요구사항 내용

시스템으로 전송되는 모든 요청에 대해 정상적인 사용자의 유효한 요청인지, 아닌지 여부를 판별할 수 있도록 해야 한다.

구현방안

1. 정상적인 절차에 따른 요청인지 여부를 확인할 수 있도록 CSRF 토큰을 운영한다.

  • 세션별로 CSRF 토큰을 생성하여 세션에 저장
  • 사용자가 작업(입력) 페이지를 요청하면 토큰을 함께 전달
  • 해당 클라이언트에서 데이터 처리를 요청하면 함께 전달된 토큰과 세션의 토큰을 비교
  • 일치하는 경우 처리, 일치하지 않는 경우 오류 처리

2. CSRF 토큰 검증은 Spring 프레임워크의 인터셉터(interceptor) 컴포넌트로 구현한다.

3. XSS 취약점을 이용한 자동화된 공격을 방어할 수 있도록 CAPTCHA를 이용하여 사용자와 상호 처리 가능하도록 한다.

4. 중요한 기능의 경우 재인증을 요구한다.

  • 중요한 기능은 데이터가 생성, 수정, 삭제, 변경되는 경우
  • 개인정보, 금융정보, 인증정보 등이 변경되는 경우
  • 비밀번호 변경, 회원 정보 수정, 계좌 이체, ... 등

샘플코드

// 게시판 글쓰기 페이지 요청을 처리 
@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 { 
 // 토큰 불일치 = 비정상적인 절차에 따른 요청 -> 오류 처리 
} 

CSRF 방어를 위한 프레임워크 및 라이브러리

Java

• Spring Security
• Apache Struts
• OWASP CSRFGuard

Python

• Django

PHP

• CSRF Protecto

출처: 행정안전부 인터넷진흥원 소프트웨어 보안약점 진단 가이드

소프트웨어 보안약점 진단가이드

0개의 댓글