From 98d53fb4bdbe7fd12aff7ca5a6072f34c2f0305f Mon Sep 17 00:00:00 2001 From: bicochan Date: Thu, 26 Feb 2026 14:04:20 +0900 Subject: [PATCH] =?UTF-8?q?[=5Ftemplate,=20as]=20chore:=20middleware.ts=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/_template/middleware.ts | 50 ++++++++++++++++++++++ apps/as/middleware.ts | 50 ++++++++++++++++++++++ pnpm-lock.yaml | 82 ++++++++++++++++++++++++++++++------ 3 files changed, 168 insertions(+), 14 deletions(-) create mode 100644 apps/_template/middleware.ts create mode 100644 apps/as/middleware.ts diff --git a/apps/_template/middleware.ts b/apps/_template/middleware.ts new file mode 100644 index 000000000..da09c5840 --- /dev/null +++ b/apps/_template/middleware.ts @@ -0,0 +1,50 @@ +import { NextRequest, NextResponse } from "next/server"; +import { PORT, PROXY_HOST, SERVER_API_URL, SITE_ID } from "@/shared/config"; + +const serverApiUrl = process.env.NEXT_PUBLIC_SERVER_API_URL ?? "http://localhost:3000"; + +// CSP 헤더 설정 함수 (img-src만) +function addSecurityHeaders(response: NextResponse): NextResponse { + response.headers.set("Content-Security-Policy", "img-src 'self' data: https: blob:;"); + return response; +} + +export function middleware(req: NextRequest) { + const pathname = req.nextUrl.pathname; + const searchParams = req.nextUrl.searchParams; + + const logMessages: string[] = [ + `[Middleware Request] ${new Date().toISOString()}`, + `[Environment]\n Mode: ${process.env.NODE_ENV}\n Port: ${PORT}\n Proxy Host: ${PROXY_HOST}\n Server API URL: ${SERVER_API_URL}\n Site ID: ${SITE_ID}`, + `[Request]\n Original Pathname: ${pathname}`, + ]; + + if (pathname.startsWith("/server")) { + const queryParams = searchParams.toString(); + const newUrl = `${serverApiUrl}${pathname.replace("/server", "")}${ + queryParams ? `?${queryParams}` : "" + }`; + + logMessages.push(` Rewritten URL: ${newUrl}`); + logMessages.push("\n--------------------------------\n"); + console.log(logMessages.join("\n")); + + const response = NextResponse.rewrite(new URL(newUrl)); + return addSecurityHeaders(response); + } + + // if (pathname === "/") { + // const response = NextResponse.redirect(new URL("/dashboard", req.url)); + // return addSecurityHeaders(response); + // } + + logMessages.push("\n--------------------------------\n"); + console.log(logMessages.join("\n")); + + const response = NextResponse.next(); + return addSecurityHeaders(response); +} + +export const config = { + matcher: ["/server/:path*", "/"], +}; diff --git a/apps/as/middleware.ts b/apps/as/middleware.ts new file mode 100644 index 000000000..da09c5840 --- /dev/null +++ b/apps/as/middleware.ts @@ -0,0 +1,50 @@ +import { NextRequest, NextResponse } from "next/server"; +import { PORT, PROXY_HOST, SERVER_API_URL, SITE_ID } from "@/shared/config"; + +const serverApiUrl = process.env.NEXT_PUBLIC_SERVER_API_URL ?? "http://localhost:3000"; + +// CSP 헤더 설정 함수 (img-src만) +function addSecurityHeaders(response: NextResponse): NextResponse { + response.headers.set("Content-Security-Policy", "img-src 'self' data: https: blob:;"); + return response; +} + +export function middleware(req: NextRequest) { + const pathname = req.nextUrl.pathname; + const searchParams = req.nextUrl.searchParams; + + const logMessages: string[] = [ + `[Middleware Request] ${new Date().toISOString()}`, + `[Environment]\n Mode: ${process.env.NODE_ENV}\n Port: ${PORT}\n Proxy Host: ${PROXY_HOST}\n Server API URL: ${SERVER_API_URL}\n Site ID: ${SITE_ID}`, + `[Request]\n Original Pathname: ${pathname}`, + ]; + + if (pathname.startsWith("/server")) { + const queryParams = searchParams.toString(); + const newUrl = `${serverApiUrl}${pathname.replace("/server", "")}${ + queryParams ? `?${queryParams}` : "" + }`; + + logMessages.push(` Rewritten URL: ${newUrl}`); + logMessages.push("\n--------------------------------\n"); + console.log(logMessages.join("\n")); + + const response = NextResponse.rewrite(new URL(newUrl)); + return addSecurityHeaders(response); + } + + // if (pathname === "/") { + // const response = NextResponse.redirect(new URL("/dashboard", req.url)); + // return addSecurityHeaders(response); + // } + + logMessages.push("\n--------------------------------\n"); + console.log(logMessages.join("\n")); + + const response = NextResponse.next(); + return addSecurityHeaders(response); +} + +export const config = { + matcher: ["/server/:path*", "/"], +}; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 03c2fb60c..d7b788c19 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -51,11 +51,7 @@ importers: specifier: 2.4.2 version: 2.4.2 -<<<<<<< HEAD - apps/as: -======= - apps/(template): ->>>>>>> f0dcccaee9deebb48069ce1e382ca146be4ddcf9 + apps/_template: dependencies: '@common/assets': specifier: workspace:* @@ -84,12 +80,6 @@ importers: dayjs: specifier: ^1.11.13 version: 1.11.19 -<<<<<<< HEAD - js-cookie: - specifier: ^3.0.5 - version: 3.0.5 -======= ->>>>>>> f0dcccaee9deebb48069ce1e382ca146be4ddcf9 next: specifier: 15.3.8 version: 15.3.8(react-dom@19.2.3(react@19.2.3))(react@19.2.3) @@ -100,12 +90,76 @@ importers: specifier: ^3.24.2 version: 3.25.76 devDependencies: -<<<<<<< HEAD + eslint: + specifier: ^9.0.0 + version: 9.39.2(jiti@2.6.1) + eslint-config-next: + specifier: 15.4.0 + version: 15.4.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + postcss: + specifier: ^8.4.49 + version: 8.5.6 + prettier: + specifier: ^3.4.2 + version: 3.7.4 + prettier-plugin-tailwindcss: + specifier: ^0.6.11 + version: 0.6.14(prettier@3.7.4) + steiger: + specifier: ^0.5.11 + version: 0.5.11(typescript@5.9.3) + tailwindcss: + specifier: ^3.4.14 + version: 3.4.19(yaml@2.8.2) + typescript: + specifier: ^5.7.2 + version: 5.9.3 + + apps/as: + dependencies: + '@common/assets': + specifier: workspace:* + version: link:../../packages/common/assets + '@common/components': + specifier: workspace:* + version: link:../../packages/common/components + '@common/network': + specifier: workspace:* + version: link:../../packages/common/network + '@hookform/resolvers': + specifier: ^4.1.3 + version: 4.1.3(react-hook-form@7.68.0(react@19.2.3)) + '@tanstack/react-query': + specifier: ^5.75.5 + version: 5.90.12(react@19.2.3) + '@tanstack/react-query-devtools': + specifier: ^5.75.5 + version: 5.91.1(@tanstack/react-query@5.90.12(react@19.2.3))(react@19.2.3) + '@tanstack/react-table': + specifier: ^8.21.2 + version: 8.21.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + axios: + specifier: ^1.8.1 + version: 1.8.1 + dayjs: + specifier: ^1.11.13 + version: 1.11.19 + js-cookie: + specifier: ^3.0.5 + version: 3.0.5 + next: + specifier: 15.3.8 + version: 15.3.8(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + react-hook-form: + specifier: ^7.54.2 + version: 7.68.0(react@19.2.3) + zod: + specifier: ^3.24.2 + version: 3.25.76 + devDependencies: '@types/js-cookie': specifier: ^3.0.6 version: 3.0.6 -======= ->>>>>>> f0dcccaee9deebb48069ce1e382ca146be4ddcf9 eslint: specifier: ^9.0.0 version: 9.39.2(jiti@1.21.7)