크로스 사이트 요청 위조 (CSRF)

브라우저가 자동으로 보내는 인증 정보를 악용한 원치 않는 요청을 차단하세요.

설명

CSRF는 브라우저가 쿠키 같은 인증 정보를 자동 전송하는 상황에서 공격자가 피해자의 의도와 다른 요청을 보내게 하는 공격입니다. 서버가 요청의 정당성을 확인하지 않으면 피해자의 권한으로 작업이 수행될 수 있습니다.

잠재적 영향

  • 피해자의 권한으로 계정 설정이나 데이터를 변경할 수 있습니다.
  • 중요한 기능이 노출되어 있으면 서비스 중단이나 권한 남용으로 이어질 수 있습니다.
  • 정보 공개·전송 설정을 변경해 데이터가 노출될 수 있습니다. CSRF 자체가 응답 본문을 공격자에게 읽게 해 주는 것은 아닙니다.

해결 방법

  • 프레임워크의 CSRF 방어를 사용하거나, 세션에 연결된 예측 불가능한 토큰을 발급하고 상태 변경 전에 검증하세요.
  • SameSite 쿠키 속성은 추가 방어로 적용하되 토큰 검증을 대신한다고 가정하지 마세요.
  • CORS 정책과 요청 출처 검증을 검토하고, 중요한 작업에는 재인증 같은 추가 확인을 적용하세요.

예시

컨트롤러 메서드의 일부입니다. 다른 필터에서 이미 CSRF를 검증하는지 확인하세요. 변경 후 예시는 서버가 예측 불가능한 csrf_token을 발급해 세션과 폼에 안전하게 전달했다고 가정합니다.

변경 전

java
@PostMapping("/update")
public String updateData(HttpServletRequest request) {
    String data = request.getParameter("data");
    // 데이터를 업데이트하는 로직

    return "updateSuccess";
}

변경 후

java
@PostMapping("/update")
public String updateData(@RequestParam("csrf_token") String csrfToken, HttpServletRequest request) {
    String sessionCsrfToken = (String) request.getSession().getAttribute("csrf_token");
    if (sessionCsrfToken == null || !sessionCsrfToken.equals(csrfToken)) {
        throw new SecurityException("CSRF Token mismatch");
    }

    String data = request.getParameter("data");
    // 데이터를 업데이트하는 로직

    return "updateSuccess";
}

설명:

  • 변경 전: 이 메서드에는 CSRF 검증이 없습니다. 다른 계층에서도 보호하지 않으면 쿠키 인증 요청이 악용될 수 있습니다.
  • 변경 후: 요청 토큰과 세션 토큰이 일치하는지 확인한 뒤 작업합니다. 사용자 인증과 작업별 권한 검사는 별도로 필요합니다.

관련 CVE

참조