임동욱 임동욱 08-20
merge: 업로드 413 사유 노출
@2d4943ae16c3fbecb5255b3a9e82b753db52a70a
app/(protected)/(basic)/contents/upload/route.ts
--- app/(protected)/(basic)/contents/upload/route.ts
+++ app/(protected)/(basic)/contents/upload/route.ts
@@ -57,7 +57,8 @@
   );
 
   if (!result.ok) {
-    return fail(502, result.message);
+    // 프록시가 자른 413은 크기 문제라 사용자에게 그대로 보인다. 나머지는 중계 실패다.
+    return fail(result.code === 413 ? 413 : 502, result.message);
   }
 
   if (typeof result.data !== 'string' || result.data === '') {
lib/domain/file-module.ts
--- lib/domain/file-module.ts
+++ lib/domain/file-module.ts
@@ -50,7 +50,9 @@
   vodContent: {
     id: 'MODULE_VOD_CONTENT',
     description: '동영상 콘텐츠 저장소',
-    extensions: ['mp4', 'mov', 'avi', 'mkv', 'webm', 'wmv'],
+    // 이슈: 백엔드 전역 화이트리스트(Globals.fileUpload.Extensions)에 영상은 mp4뿐이다.
+    // mov·avi 등은 목록에 추가되면 여기도 되돌린다.
+    extensions: ['mp4'],
   },
   /** 꾸미기 아이템 썸네일. */
   userItem: {
lib/http/backend-fetch.ts
--- lib/http/backend-fetch.ts
+++ lib/http/backend-fetch.ts
@@ -298,6 +298,15 @@
       };
     }
 
+    // 이슈: dev API 프록시(client_max_body_size 미설정, 기본 1MiB)가 앱보다 먼저 큰 본문을
+    // 봉투 없이 413으로 거절한다(2026-08-20 실측). 인프라 상향 전까지 사유를 살려 내보낸다.
+    if (response.status === 413) {
+      return {
+        ok: false,
+        code: 413,
+        message: '파일이 서버가 받을 수 있는 크기를 넘었습니다.',
+      };
+    }
     return communicationError(`예상치 못한 HTTP 상태: ${response.status}`);
   }
 
@@ -392,6 +401,13 @@
             : COMMUNICATION_ERROR_MESSAGE,
       };
     }
+    if (response.status === 413) {
+      return {
+        ok: false,
+        code: 413,
+        message: '파일이 서버가 받을 수 있는 크기를 넘었습니다.',
+      };
+    }
     return communicationError(
       `업로드 응답의 예상치 못한 HTTP 상태: ${response.status}`
     );
Add a comment
List