Skip to content

9.3. 보안

9.3.1. 확장자 위조 검증

클라이언트가 전송한 확장자와 실제 파일 내용의 MIME 타입을 비교 검증합니다.

java
public class FileValidator {

  private final StorageProperties properties;

  public void validate(MultipartFile file) {
    String extension = extractExtension(file.getOriginalFilename());

    // 1. 허용 확장자 검증
    if (!properties.allowedExtensions().contains(extension)) {
      throw new InvalidFileException("허용되지 않는 파일 확장자입니다: " + extension);
    }

    // 2. MIME 타입 검증
    String contentType = file.getContentType();
    if (contentType == null || !properties.allowedMimeTypes().contains(contentType)) {
      throw new InvalidFileException("허용되지 않는 파일 형식입니다: " + contentType);
    }

    // 3. 파일 크기 검증
    if (file.getSize() > properties.maxFileSize()) {
      throw new InvalidFileException("파일 크기가 제한을 초과합니다.");
    }
  }
}

9.3.2. Path Traversal 방지

파일 경로에 .. 또는 절대 경로가 포함되지 않도록 검증합니다.

java
public static void validatePath(String filename) {
  if (filename.contains("..") || filename.contains("/") || filename.contains("\\")) {
    throw new InvalidFileException("잘못된 파일명입니다.");
  }
}

9.3.3. 접근 제어

  • 파일 다운로드 API는 인증된 사용자만 접근할 수 있어야 합니다.
  • 필요한 경우 파일 소유자만 다운로드할 수 있도록 권한 검증을 추가합니다.
  • 업로드 디렉토리에 웹 서버가 직접 접근하지 않도록 설정합니다. 반드시 API를 통해 파일을 제공합니다.

9.3.4. 금지 사항

금지 항목사유
업로드 디렉토리의 정적 파일 서빙Path Traversal, 실행 파일 접근 위험
클라이언트 제공 파일명 그대로 저장특수문자, 중복, 보안 위험
확장자만으로 파일 타입 검증확장자 위조 가능
파일 크기 무제한 허용DoS 공격 위험

TIENIPIA QUALIFIED STANDARD