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 공격 위험 |