diff --git a/src/lib/serverKy.ts b/src/lib/serverKy.ts index 5a307ac5..37818754 100644 --- a/src/lib/serverKy.ts +++ b/src/lib/serverKy.ts @@ -1,6 +1,7 @@ import ky from "ky"; import { cookies } from "next/headers"; +import { NextResponse } from "next/server"; const REFRESH_ENDPOINT = "/v1/auth/token/refresh"; const UNAUTHORIZED_CODE = 401; @@ -34,40 +35,59 @@ export const serverApi = ky.create({ const refreshToken = cookieStore.get("refreshToken")?.value; if (response.status === UNAUTHORIZED_CODE || !currentAccessToken) { - const refreshResponse = await fetch( - `${process.env.NEXT_PUBLIC_API_URL}${REFRESH_ENDPOINT}`, - { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ - refreshToken: refreshToken, - }), - }, - ); + try { + const refreshResponse = await fetch( + `${process.env.NEXT_PUBLIC_API_URL}${REFRESH_ENDPOINT}`, + { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + refreshToken: refreshToken, + }), + }, + ); - const { accessToken: newAccessToken, refreshToken: newRefreshToken } = - (await refreshResponse.json()) as { + if (!refreshResponse.ok) { + const errText = await refreshResponse.text(); + + console.error("Refresh API 실패:", errText); + + cookieStore.delete("accessToken"); + cookieStore.delete("refreshToken"); + + return NextResponse.redirect(new URL("/login", request.url)); + } + + const { + accessToken: newAccessToken, + refreshToken: newRefreshToken, + } = (await refreshResponse.json()) as { accessToken: string; refreshToken: string; }; - cookieStore.set("accessToken", newAccessToken, { - httpOnly: true, - secure: true, - sameSite: "none", - path: "/", - maxAge: 60 * 60, - }); + cookieStore.set("accessToken", newAccessToken, { + httpOnly: true, + secure: true, + sameSite: "none", + path: "/", + maxAge: 60 * 60, + }); + + cookieStore.set("refreshToken", newRefreshToken, { + httpOnly: true, + secure: true, + sameSite: "none", + path: "/", + maxAge: 60 * 60 * 24 * 7, + }); - cookieStore.set("refreshToken", newRefreshToken, { - httpOnly: true, - secure: true, - sameSite: "none", - path: "/", - maxAge: 60 * 60 * 24 * 7, - }); + return serverApi(request, options); + } catch (error) { + console.error("refresh 요청 중 에러 발생:", error); - return serverApi(request, options); + return NextResponse.redirect(new URL("/login", request.url)); + } } return response;