✏️ Java 코드 에디터
취약한 코드
public void doPrivilegedAction(HttpServletRequest request) {
// [취약한 코드] 세션만 확인하고 요청 출처(Referer)를 확인하지 않음
// 공격자가 피싱 사이트에서 요청을 보내도 세션이 유효하면 실행됨
HttpSession session = request.getSession(false);
if (session != null) {
// ... 중요 기능 실행 (예: 회원정보 수정) ...
}
}
💡 수정 가이드 (KISA 가이드)
1. CSRF 토큰 검증 (근본 대책)
폼 출력 시 세션에 예측 불가능한 토큰을 저장하고, 요청 처리 시 세션 토큰과 요청 토큰이 일치하는지 확인합니다.
String sessionToken = (String) request.getSession().getAttribute("csrfToken");
String formToken = request.getParameter("csrfToken");
if (sessionToken != null && sessionToken.equals(formToken)) {
// 정상 실행
} else {
// 차단 (403)
}
2. Referer/Origin 검증 (보조 · 심층 방어)
요청 헤더의 Referer 값이 허용된 도메인으로 시작하는지 확인합니다. 단, Referer는 비어 있을 수 있어 단독 방어로는 부족합니다.
String referer = request.getHeader("Referer");
if (referer != null && referer.startsWith("https://my-secure-site.com")) {
// 정상 실행
} else {
// 차단
}
📊 분석 결과 및 설명
🎯 목표
중요한 상태 변경 요청(수정, 삭제, 등록 등) 시, 요청이 정당한 경로(자사 도메인)에서 시작되었는지 검증해야 합니다.
⚠️ 현재 취약점
CSRF
로그인된 사용자가 공격자가 심어놓은 링크를 클릭하면 사용자의 의지와 무관하게 공격자가 의도한 행위가 실행될 수 있습니다.