MIME 주장과 실제 파일 바이트를 분리하는 업로드 경계
브라우저가 보내는 MIME과 확장자는 신뢰할 수 있는 파일 형식 증명이 아닙니다. 특히 공개 bind mount에 저장하는 CMS 이미지는 저장 전에 최소한의 실제 바이트 검사와 원자성 보장이 필요합니다.
0회 조회약 1분 읽기
MIME 주장과 실제 파일 바이트를 분리하는 업로드 경계
브라우저가 보내는 MIME과 확장자는 신뢰할 수 있는 파일 형식 증명이 아닙니다. 특히 공개 bind mount에 저장하는 CMS 이미지는 저장 전에 최소한의 실제 바이트 검사와 원자성 보장이 필요합니다.
공개 콘텐츠 cover 계약
콘솔 route는 허용 MIME·파일 크기·PNG/JPEG/WebP/GIF/AVIF signature를 확인합니다. 같은 디렉터리의 랜덤 임시 파일을 wx로 만든 뒤 rename하므로 공개 컨테이너가 쓰이는 중간 파일을 읽지 않습니다. 저장 결과의 SHA-256은 감사 세부정보에 남기되 원본 이름·내용을 로그에 쓰지 않습니다.
이것은 사용자 업로드의 sharp 변환·private storage 계약과 다릅니다. 공개 CMS 자산, 사용자 비공개 파일, quarantine 파일은 저장 위치·캐시·삭제 주인이 각각 달라야 합니다.
실패 UX와 다음 단계
signature가 맞지 않거나 크기를 넘으면 서버는 파일을 공개하지 않고 지원 형식·제한·재선택 방법을 알려 줍니다. 이미지 디코드·리사이즈가 필요한 제품 요구가 생기면 이 경계 뒤에 별도 processor와 quarantine/review 상태를 추가합니다.
관련 강좌: 업로드 파일을 검증하고 원자적으로 공개하기