From 64393e9740d0fafd13b49da241c9c7beaa252886 Mon Sep 17 00:00:00 2001 From: gahusb Date: Sat, 21 Mar 2026 23:29:26 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=EB=AF=B8=EB=93=A4=EC=9B=A8=EC=96=B4=20S?= =?UTF-8?q?upabase=20hang=EC=9C=BC=EB=A1=9C=20=EC=9D=B8=ED=95=9C=20?= =?UTF-8?q?=EB=AA=A8=EB=B0=94=EC=9D=BC=20=EC=A0=91=EC=86=8D=20=EB=B6=88?= =?UTF-8?q?=EA=B0=80=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - /api/ 경로 전체를 미들웨어 매처에서 제외 (각 API 라우트가 자체 인증 처리) - updateSession() 실패 시 try-catch로 페이지 접근 허용 (연결 hang 방지) - supabase.auth.getUser() 오류 시 세션 갱신 생략하고 통과 원인: 모든 요청에 실행되는 Edge Runtime 미들웨어에서 Supabase 외부 API 호출이 일시 지연/실패 시 Vercel이 연결을 강제 종료, Safari에서 "네트워크 서버를 찾을 수 없음"으로 표시됨 Co-Authored-By: Claude Sonnet 4.6 --- middleware.ts | 14 ++++++++++++-- utils/supabase/middleware.ts | 8 ++++++-- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/middleware.ts b/middleware.ts index 805d590..cdff693 100644 --- a/middleware.ts +++ b/middleware.ts @@ -44,11 +44,21 @@ export async function middleware(request: NextRequest) { } } - return await updateSession(request); + // API 라우트는 세션 갱신 불필요 — 각 API에서 독립적으로 인증 처리 + if (pathname.startsWith('/api/')) { + return NextResponse.next(); + } + + // Supabase 세션 갱신 — 실패해도 페이지 접근은 허용 + try { + return await updateSession(request); + } catch { + return NextResponse.next({ request }); + } } export const config = { matcher: [ - '/((?!_next/static|_next/image|favicon.ico|api/telegram/webhook|.*\\.(?:svg|png|jpg|jpeg|gif|webp)$).*)', + '/((?!_next/static|_next/image|favicon.ico|api/|.*\\.(?:svg|png|jpg|jpeg|gif|webp)$).*)', ], }; diff --git a/utils/supabase/middleware.ts b/utils/supabase/middleware.ts index b8b2d6e..0ec051b 100644 --- a/utils/supabase/middleware.ts +++ b/utils/supabase/middleware.ts @@ -28,8 +28,12 @@ export async function updateSession(request: NextRequest) { { cookies: cookieMethods } ); - // 세션 갱신 (IMPORTANT: getUser()는 반드시 호출해야 함) - await supabase.auth.getUser(); + // 세션 갱신 — 실패해도 응답 반환 (외부 네트워크 오류로 hang 방지) + try { + await supabase.auth.getUser(); + } catch { + // Supabase 일시 오류 시 세션 갱신 생략하고 통과 + } return supabaseResponse; }