sales-frontend-server-side-helper 0.0.42 → 0.0.43

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var server = require('next/server');
4
+ var middleware = require('sales-frontend-api/middleware');
4
5
  var salesFrontendUtils = require('sales-frontend-utils');
5
6
 
6
7
  // src/api-route/refresh-token.ts
@@ -8,7 +9,6 @@ var salesFrontendUtils = require('sales-frontend-utils');
8
9
  // src/config/cookie-config.ts
9
10
  var COOKIE_DEFAULT_CONFIG = {
10
11
  httpOnly: true,
11
- maxAge: 60 * 60 * 24,
12
12
  sameSite: "strict",
13
13
  secure: true
14
14
  };
@@ -16,9 +16,6 @@ var COOKIE_DEFAULT_CONFIG = {
16
16
  // src/utils/cookie-utils.ts
17
17
  var createResponseWithCookies = (response, request, cookieData) => {
18
18
  const { hostname } = new URL(request.url);
19
- console.log("[createResponseWithCookies] \uCFE0\uD0A4 \uC124\uC815 \uC2DC\uC791");
20
- console.log("cookieData::", cookieData);
21
- console.log("hostname::", hostname);
22
19
  if (cookieData?.tokens?.tokenType) {
23
20
  response.cookies.set({
24
21
  name: "tokenType",
@@ -37,7 +34,9 @@ var createResponseWithCookies = (response, request, cookieData) => {
37
34
  response.cookies.set({
38
35
  name: "accessToken",
39
36
  value: cookieData.tokens.accessToken,
40
- ...getDefaultCookieConfig(hostname)
37
+ ...getDefaultCookieConfig(hostname),
38
+ //! middleware 커스텀헤더 세팅 불가로 일단 풀어 넣음
39
+ httpOnly: false
41
40
  });
42
41
  }
43
42
  if (cookieData?.tokens?.refreshToken) {
@@ -51,8 +50,7 @@ var createResponseWithCookies = (response, request, cookieData) => {
51
50
  response.cookies.set({
52
51
  name: "formFactor",
53
52
  value: cookieData.formFactor,
54
- ...getDefaultCookieConfig(hostname),
55
- maxAge: 0
53
+ ...getDefaultCookieConfig(hostname)
56
54
  });
57
55
  }
58
56
  return response;
@@ -85,24 +83,17 @@ var refreshTokens = async (request, refreshTokensOptions) => {
85
83
  );
86
84
  }
87
85
  try {
88
- const tokenResponse = await fetch(
89
- `${salesFrontendUtils.getApiHostNameFromEnvironment(new URL(request.url).hostname, refreshTokensOptions?.forceApiHostName)}/api/dat/v1/post/token/refresh`,
86
+ const tokenData = await middleware.requestRefreshToken(
87
+ { refreshToken },
90
88
  {
91
- method: "POST",
92
- headers: {
93
- "Content-Type": "application/json",
94
- ...Object.fromEntries(
95
- Array.from(request.headers.entries()).filter(([key]) => key.toLowerCase().startsWith("x-channel"))
96
- )
97
- },
98
- body: JSON.stringify({
99
- refreshToken
100
- })
89
+ baseURL: salesFrontendUtils.getApiHostNameFromEnvironment(new URL(request.url).hostname, refreshTokensOptions?.forceApiHostName),
90
+ ...Object.fromEntries(
91
+ Array.from(request.headers.entries()).filter(([key]) => key.toLowerCase().startsWith("x-channel"))
92
+ )
101
93
  }
102
94
  );
103
- const tokenData = await tokenResponse.json();
104
95
  console.log("[ServerSideHelper-Api-Route] tokenData", tokenData);
105
- if (!tokenResponse.ok || !tokenData.isSuccess === false) {
96
+ if (tokenData.isSuccess === false) {
106
97
  return server.NextResponse.json(
107
98
  {
108
99
  isSuccess: false,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/config/cookie-config.ts","../../src/utils/cookie-utils.ts","../../src/api-route/refresh-token.ts","../../src/api-route/server-time.ts"],"names":["getEnvironmentFromHostname","NextResponse","getApiHostNameFromEnvironment"],"mappings":"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","file":"index.cjs","sourcesContent":["export const COOKIE_DEFAULT_CONFIG = {\n httpOnly: true,\n maxAge: 60 * 60 * 24,\n sameSite: 'strict' as const,\n secure: true\n};\n","import { NextRequest, NextResponse } from 'next/server';\n\nimport { getEnvironmentFromHostname } from 'sales-frontend-utils';\n\nimport { COOKIE_DEFAULT_CONFIG } from '../config/cookie-config';\nimport { CookieData } from '../server-side-helper.types';\n\n/**\n * 쿠키 생성\n * @param response\n * @param cookieData\n * @returns\n */\nexport const createResponseWithCookies = (\n response: NextResponse,\n request: NextRequest,\n cookieData?: CookieData\n): NextResponse => {\n const { hostname } = new URL(request.url);\n\n console.log('[createResponseWithCookies] 쿠키 설정 시작');\n console.log('cookieData::', cookieData);\n console.log('hostname::', hostname);\n\n // 토큰타입\n if (cookieData?.tokens?.tokenType) {\n response.cookies.set({\n name: 'tokenType',\n value: cookieData.tokens.tokenType,\n ...getDefaultCookieConfig(hostname)\n });\n }\n\n // expiresIn\n if (cookieData?.tokens?.expiresIn) {\n response.cookies.set({\n name: 'expiresIn',\n value: String(cookieData.tokens.expiresIn),\n ...getDefaultCookieConfig(hostname)\n });\n }\n\n // 액세스 토큰 쿠키\n if (cookieData?.tokens?.accessToken) {\n response.cookies.set({\n name: 'accessToken',\n value: cookieData.tokens.accessToken,\n ...getDefaultCookieConfig(hostname)\n });\n }\n\n // 리프레시 토큰 쿠키\n if (cookieData?.tokens?.refreshToken) {\n response.cookies.set({\n name: 'refreshToken',\n value: cookieData.tokens.refreshToken,\n ...getDefaultCookieConfig(hostname)\n });\n }\n\n // FormFactor 쿠키\n if (cookieData?.formFactor) {\n response.cookies.set({\n name: 'formFactor',\n value: cookieData.formFactor,\n ...getDefaultCookieConfig(hostname),\n maxAge: 0\n });\n }\n\n return response;\n};\n\n/**\n * 환경에 따른 기본 쿠키 설정값 반환\n * @param hostname\n * @returns\n */\nconst getDefaultCookieConfig = (hostname: string) => {\n const environment = getEnvironmentFromHostname(hostname);\n\n if (environment !== 'prd') {\n return {\n ...COOKIE_DEFAULT_CONFIG,\n httpOnly: false,\n secure: false,\n sameSite: 'lax' as const\n };\n }\n\n return COOKIE_DEFAULT_CONFIG;\n};\n","import { NextRequest, NextResponse } from 'next/server';\n\nimport { getApiHostNameFromEnvironment } from 'sales-frontend-utils';\n\nimport { DspResponseDspTokenResponseDto, ApiErrorResponse, RefreshTokensOptions } from '../server-side-helper.types';\nimport { createResponseWithCookies } from '../utils/cookie-utils';\n\n/**\n * 리프레시 토큰을 사용하여 새로운 액세스 토큰과 리프레시 토큰을 쿠키로 발급 받습니다.\n * API Route에서 사용될 수 있습니다.\n * 권장경로: /app/internal/api/auth/refresh/route.ts\n * Method: POST\n * @returns 새로운 AT, RT 발급 후 새 AT 반환\n */\nexport const refreshTokens = async (request: NextRequest, refreshTokensOptions?: RefreshTokensOptions) => {\n const refreshToken = request.cookies.get('refreshToken')?.value;\n\n // 기본 밸리데이션\n if (!refreshToken) {\n return NextResponse.json(\n {\n isSuccess: false,\n code: 'REFRESH_TOKEN_MISSING',\n message: '[ServerSideHelper-Api-Route] Refresh Token이 존재하지 않습니다.)',\n data: null\n } as ApiErrorResponse,\n { status: 401 }\n );\n }\n\n try {\n // TODO: 실제 토큰 재발급 API 주소로 변경 필요\n const tokenResponse = await fetch(\n `${getApiHostNameFromEnvironment(new URL(request.url).hostname, refreshTokensOptions?.forceApiHostName)}/api/dat/v1/post/token/refresh`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...Object.fromEntries(\n Array.from(request.headers.entries()).filter(([key]) => key.toLowerCase().startsWith('x-channel'))\n )\n },\n body: JSON.stringify({\n refreshToken\n })\n }\n );\n\n const tokenData: DspResponseDspTokenResponseDto = await tokenResponse.json();\n console.log('[ServerSideHelper-Api-Route] tokenData', tokenData);\n\n if (!tokenResponse.ok || !tokenData.isSuccess === false) {\n return NextResponse.json(\n {\n isSuccess: false,\n code: tokenData.code || 'TOKEN_REFRESH_FAILED',\n message: `[ServerSideHelper-Api-Route] ${tokenData.message || '토큰 갱신에 실패했습니다.'}`,\n data: null\n } as ApiErrorResponse,\n { status: 401 }\n );\n }\n\n // 응답 유효성 체크\n if (!tokenData.data?.accessToken || !tokenData.data?.refreshToken) {\n throw new Error('[ServerSideHelper-Api-Route] Invalid token data structure');\n }\n\n const { accessToken: newAccessToken, refreshToken: newRefreshToken, expiresIn, tokenType } = tokenData.data;\n\n // 응답 생성\n const response = NextResponse.json(\n {\n isSuccess: true,\n code: '',\n message: '[ServerSideHelper-Api-Route] Token 갱신 성공',\n data: { accessToken: newAccessToken, refreshToken: newRefreshToken, expiresIn, tokenType }\n },\n { status: 200 }\n );\n\n // 새 토큰들을 쿠키에 저장\n createResponseWithCookies(response, request, {\n tokens: { accessToken: newAccessToken, refreshToken: newRefreshToken, expiresIn, tokenType }\n });\n\n return response;\n } catch (error) {\n console.error('Token refresh error:', error);\n\n return NextResponse.json(\n {\n isSuccess: false,\n code: 'REFRESH_TOKEN_MISSING',\n message: '[ServerSideHelper-Api-Route] 토큰 재발급 중 오류가 발생했습니다.',\n data: null\n } as ApiErrorResponse,\n { status: 401 }\n );\n }\n};\n","import { NextResponse } from 'next/server';\n\n/**\n * 서버의 현재 시간을 밀리초 단위로 반환합니다.\n * API Route에서 사용될 수 있습니다.\n * 권장경로: /app/internal/api/time/route.ts\n * Method: GET\n * @returns\n */\nexport const getServerTime = () => {\n const now = new Date();\n const serverTime = now.getTime();\n\n return NextResponse.json({\n isSuccess: true,\n code: '',\n message: 'Current server time fetched successfully',\n data: { serverTime }\n });\n};\n"]}
1
+ {"version":3,"sources":["../../src/config/cookie-config.ts","../../src/utils/cookie-utils.ts","../../src/api-route/refresh-token.ts","../../src/api-route/server-time.ts"],"names":["getEnvironmentFromHostname","NextResponse","requestRefreshToken","getApiHostNameFromEnvironment"],"mappings":"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","file":"index.cjs","sourcesContent":["export const COOKIE_DEFAULT_CONFIG = {\n httpOnly: true,\n sameSite: 'strict' as const,\n secure: true\n};\n","import { NextRequest, NextResponse } from 'next/server';\n\nimport { getEnvironmentFromHostname } from 'sales-frontend-utils';\n\nimport { COOKIE_DEFAULT_CONFIG } from '../config/cookie-config';\nimport { CookieData } from '../server-side-helper.types';\n\n/**\n * 쿠키 생성\n * @param response\n * @param cookieData\n * @returns\n */\nexport const createResponseWithCookies = (\n response: NextResponse,\n request: NextRequest,\n cookieData?: CookieData\n): NextResponse => {\n const { hostname } = new URL(request.url);\n\n // 토큰타입\n if (cookieData?.tokens?.tokenType) {\n response.cookies.set({\n name: 'tokenType',\n value: cookieData.tokens.tokenType,\n ...getDefaultCookieConfig(hostname)\n });\n }\n\n // expiresIn\n if (cookieData?.tokens?.expiresIn) {\n response.cookies.set({\n name: 'expiresIn',\n value: String(cookieData.tokens.expiresIn),\n ...getDefaultCookieConfig(hostname)\n });\n }\n\n // 액세스 토큰 쿠키\n if (cookieData?.tokens?.accessToken) {\n response.cookies.set({\n name: 'accessToken',\n value: cookieData.tokens.accessToken,\n ...getDefaultCookieConfig(hostname),\n //! middleware 커스텀헤더 세팅 불가로 일단 풀어 넣음\n httpOnly: false\n });\n }\n\n // 리프레시 토큰 쿠키\n if (cookieData?.tokens?.refreshToken) {\n response.cookies.set({\n name: 'refreshToken',\n value: cookieData.tokens.refreshToken,\n ...getDefaultCookieConfig(hostname)\n });\n }\n\n // FormFactor 쿠키\n if (cookieData?.formFactor) {\n response.cookies.set({\n name: 'formFactor',\n value: cookieData.formFactor,\n ...getDefaultCookieConfig(hostname)\n });\n }\n\n return response;\n};\n\n/**\n * 환경에 따른 기본 쿠키 설정값 반환\n * @param hostname\n * @returns\n */\nconst getDefaultCookieConfig = (hostname: string) => {\n const environment = getEnvironmentFromHostname(hostname);\n\n if (environment !== 'prd') {\n return {\n ...COOKIE_DEFAULT_CONFIG,\n httpOnly: false,\n secure: false,\n sameSite: 'lax' as const\n };\n }\n\n return COOKIE_DEFAULT_CONFIG;\n};\n","import { NextRequest, NextResponse } from 'next/server';\n\nimport { requestRefreshToken } from 'sales-frontend-api/middleware';\nimport { getApiHostNameFromEnvironment } from 'sales-frontend-utils';\n\nimport { ApiErrorResponse, RefreshTokensOptions } from '../server-side-helper.types';\nimport { createResponseWithCookies } from '../utils/cookie-utils';\n\n/**\n * 리프레시 토큰을 사용하여 새로운 액세스 토큰과 리프레시 토큰을 쿠키로 발급 받습니다.\n * API Route에서 사용될 수 있습니다.\n * 각 프로젝트 API Route 생성 경로: /app/internal/api/auth/refresh/route.ts\n * Method: POST\n * @returns 새로운 AT, RT 발급 후 새 AT 반환\n */\nexport const refreshTokens = async (request: NextRequest, refreshTokensOptions?: RefreshTokensOptions) => {\n const refreshToken = request.cookies.get('refreshToken')?.value;\n\n // 기본 밸리데이션\n if (!refreshToken) {\n return NextResponse.json(\n {\n isSuccess: false,\n code: 'REFRESH_TOKEN_MISSING',\n message: '[ServerSideHelper-Api-Route] Refresh Token이 존재하지 않습니다.)',\n data: null\n } as ApiErrorResponse,\n { status: 401 }\n );\n }\n\n try {\n const tokenData = await requestRefreshToken(\n { refreshToken },\n {\n baseURL: getApiHostNameFromEnvironment(new URL(request.url).hostname, refreshTokensOptions?.forceApiHostName),\n ...Object.fromEntries(\n Array.from(request.headers.entries()).filter(([key]) => key.toLowerCase().startsWith('x-channel'))\n )\n }\n );\n\n console.log('[ServerSideHelper-Api-Route] tokenData', tokenData);\n\n if (tokenData.isSuccess === false) {\n return NextResponse.json(\n {\n isSuccess: false,\n code: tokenData.code || 'TOKEN_REFRESH_FAILED',\n message: `[ServerSideHelper-Api-Route] ${tokenData.message || '토큰 갱신에 실패했습니다.'}`,\n data: null\n } as ApiErrorResponse,\n { status: 401 }\n );\n }\n\n // 응답 유효성 체크\n if (!tokenData.data?.accessToken || !tokenData.data?.refreshToken) {\n throw new Error('[ServerSideHelper-Api-Route] Invalid token data structure');\n }\n\n const { accessToken: newAccessToken, refreshToken: newRefreshToken, expiresIn, tokenType } = tokenData.data;\n\n // 응답 생성\n const response = NextResponse.json(\n {\n isSuccess: true,\n code: '',\n message: '[ServerSideHelper-Api-Route] Token 갱신 성공',\n data: { accessToken: newAccessToken, refreshToken: newRefreshToken, expiresIn, tokenType }\n },\n { status: 200 }\n );\n\n // 새 토큰들을 쿠키에 저장\n createResponseWithCookies(response, request, {\n tokens: { accessToken: newAccessToken, refreshToken: newRefreshToken, expiresIn, tokenType }\n });\n\n return response;\n } catch (error) {\n console.error('Token refresh error:', error);\n\n return NextResponse.json(\n {\n isSuccess: false,\n code: 'REFRESH_TOKEN_MISSING',\n message: '[ServerSideHelper-Api-Route] 토큰 재발급 중 오류가 발생했습니다.',\n data: null\n } as ApiErrorResponse,\n { status: 401 }\n );\n }\n};\n","import { NextResponse } from 'next/server';\n\n/**\n * 서버의 현재 시간을 밀리초 단위로 반환합니다.\n * API Route에서 사용될 수 있습니다.\n * 권장경로: /app/internal/api/time/route.ts\n * Method: GET\n * @returns\n */\nexport const getServerTime = () => {\n const now = new Date();\n const serverTime = now.getTime();\n\n return NextResponse.json({\n isSuccess: true,\n code: '',\n message: 'Current server time fetched successfully',\n data: { serverTime }\n });\n};\n"]}
@@ -1,10 +1,11 @@
1
1
  import { NextRequest, NextResponse } from 'next/server';
2
- import { R as RefreshTokensOptions, A as ApiErrorResponse } from '../server-side-helper.types-Cp3VfyqT.cjs';
2
+ import { R as RefreshTokensOptions, A as ApiErrorResponse } from '../server-side-helper.types-DBOErcVd.cjs';
3
+ import 'sales-frontend-api/middleware';
3
4
 
4
5
  /**
5
6
  * 리프레시 토큰을 사용하여 새로운 액세스 토큰과 리프레시 토큰을 쿠키로 발급 받습니다.
6
7
  * API Route에서 사용될 수 있습니다.
7
- * 권장경로: /app/internal/api/auth/refresh/route.ts
8
+ * 프로젝트 API Route 생성 경로: /app/internal/api/auth/refresh/route.ts
8
9
  * Method: POST
9
10
  * @returns 새로운 AT, RT 발급 후 새 AT 반환
10
11
  */
@@ -1,10 +1,11 @@
1
1
  import { NextRequest, NextResponse } from 'next/server';
2
- import { R as RefreshTokensOptions, A as ApiErrorResponse } from '../server-side-helper.types-Cp3VfyqT.js';
2
+ import { R as RefreshTokensOptions, A as ApiErrorResponse } from '../server-side-helper.types-DBOErcVd.js';
3
+ import 'sales-frontend-api/middleware';
3
4
 
4
5
  /**
5
6
  * 리프레시 토큰을 사용하여 새로운 액세스 토큰과 리프레시 토큰을 쿠키로 발급 받습니다.
6
7
  * API Route에서 사용될 수 있습니다.
7
- * 권장경로: /app/internal/api/auth/refresh/route.ts
8
+ * 프로젝트 API Route 생성 경로: /app/internal/api/auth/refresh/route.ts
8
9
  * Method: POST
9
10
  * @returns 새로운 AT, RT 발급 후 새 AT 반환
10
11
  */
@@ -1,4 +1,5 @@
1
1
  import { NextResponse } from 'next/server';
2
+ import { requestRefreshToken } from 'sales-frontend-api/middleware';
2
3
  import { getApiHostNameFromEnvironment, getEnvironmentFromHostname } from 'sales-frontend-utils';
3
4
 
4
5
  // src/api-route/refresh-token.ts
@@ -6,7 +7,6 @@ import { getApiHostNameFromEnvironment, getEnvironmentFromHostname } from 'sales
6
7
  // src/config/cookie-config.ts
7
8
  var COOKIE_DEFAULT_CONFIG = {
8
9
  httpOnly: true,
9
- maxAge: 60 * 60 * 24,
10
10
  sameSite: "strict",
11
11
  secure: true
12
12
  };
@@ -14,9 +14,6 @@ var COOKIE_DEFAULT_CONFIG = {
14
14
  // src/utils/cookie-utils.ts
15
15
  var createResponseWithCookies = (response, request, cookieData) => {
16
16
  const { hostname } = new URL(request.url);
17
- console.log("[createResponseWithCookies] \uCFE0\uD0A4 \uC124\uC815 \uC2DC\uC791");
18
- console.log("cookieData::", cookieData);
19
- console.log("hostname::", hostname);
20
17
  if (cookieData?.tokens?.tokenType) {
21
18
  response.cookies.set({
22
19
  name: "tokenType",
@@ -35,7 +32,9 @@ var createResponseWithCookies = (response, request, cookieData) => {
35
32
  response.cookies.set({
36
33
  name: "accessToken",
37
34
  value: cookieData.tokens.accessToken,
38
- ...getDefaultCookieConfig(hostname)
35
+ ...getDefaultCookieConfig(hostname),
36
+ //! middleware 커스텀헤더 세팅 불가로 일단 풀어 넣음
37
+ httpOnly: false
39
38
  });
40
39
  }
41
40
  if (cookieData?.tokens?.refreshToken) {
@@ -49,8 +48,7 @@ var createResponseWithCookies = (response, request, cookieData) => {
49
48
  response.cookies.set({
50
49
  name: "formFactor",
51
50
  value: cookieData.formFactor,
52
- ...getDefaultCookieConfig(hostname),
53
- maxAge: 0
51
+ ...getDefaultCookieConfig(hostname)
54
52
  });
55
53
  }
56
54
  return response;
@@ -83,24 +81,17 @@ var refreshTokens = async (request, refreshTokensOptions) => {
83
81
  );
84
82
  }
85
83
  try {
86
- const tokenResponse = await fetch(
87
- `${getApiHostNameFromEnvironment(new URL(request.url).hostname, refreshTokensOptions?.forceApiHostName)}/api/dat/v1/post/token/refresh`,
84
+ const tokenData = await requestRefreshToken(
85
+ { refreshToken },
88
86
  {
89
- method: "POST",
90
- headers: {
91
- "Content-Type": "application/json",
92
- ...Object.fromEntries(
93
- Array.from(request.headers.entries()).filter(([key]) => key.toLowerCase().startsWith("x-channel"))
94
- )
95
- },
96
- body: JSON.stringify({
97
- refreshToken
98
- })
87
+ baseURL: getApiHostNameFromEnvironment(new URL(request.url).hostname, refreshTokensOptions?.forceApiHostName),
88
+ ...Object.fromEntries(
89
+ Array.from(request.headers.entries()).filter(([key]) => key.toLowerCase().startsWith("x-channel"))
90
+ )
99
91
  }
100
92
  );
101
- const tokenData = await tokenResponse.json();
102
93
  console.log("[ServerSideHelper-Api-Route] tokenData", tokenData);
103
- if (!tokenResponse.ok || !tokenData.isSuccess === false) {
94
+ if (tokenData.isSuccess === false) {
104
95
  return NextResponse.json(
105
96
  {
106
97
  isSuccess: false,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/config/cookie-config.ts","../../src/utils/cookie-utils.ts","../../src/api-route/refresh-token.ts","../../src/api-route/server-time.ts"],"names":["NextResponse"],"mappings":"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","file":"index.js","sourcesContent":["export const COOKIE_DEFAULT_CONFIG = {\n httpOnly: true,\n maxAge: 60 * 60 * 24,\n sameSite: 'strict' as const,\n secure: true\n};\n","import { NextRequest, NextResponse } from 'next/server';\n\nimport { getEnvironmentFromHostname } from 'sales-frontend-utils';\n\nimport { COOKIE_DEFAULT_CONFIG } from '../config/cookie-config';\nimport { CookieData } from '../server-side-helper.types';\n\n/**\n * 쿠키 생성\n * @param response\n * @param cookieData\n * @returns\n */\nexport const createResponseWithCookies = (\n response: NextResponse,\n request: NextRequest,\n cookieData?: CookieData\n): NextResponse => {\n const { hostname } = new URL(request.url);\n\n console.log('[createResponseWithCookies] 쿠키 설정 시작');\n console.log('cookieData::', cookieData);\n console.log('hostname::', hostname);\n\n // 토큰타입\n if (cookieData?.tokens?.tokenType) {\n response.cookies.set({\n name: 'tokenType',\n value: cookieData.tokens.tokenType,\n ...getDefaultCookieConfig(hostname)\n });\n }\n\n // expiresIn\n if (cookieData?.tokens?.expiresIn) {\n response.cookies.set({\n name: 'expiresIn',\n value: String(cookieData.tokens.expiresIn),\n ...getDefaultCookieConfig(hostname)\n });\n }\n\n // 액세스 토큰 쿠키\n if (cookieData?.tokens?.accessToken) {\n response.cookies.set({\n name: 'accessToken',\n value: cookieData.tokens.accessToken,\n ...getDefaultCookieConfig(hostname)\n });\n }\n\n // 리프레시 토큰 쿠키\n if (cookieData?.tokens?.refreshToken) {\n response.cookies.set({\n name: 'refreshToken',\n value: cookieData.tokens.refreshToken,\n ...getDefaultCookieConfig(hostname)\n });\n }\n\n // FormFactor 쿠키\n if (cookieData?.formFactor) {\n response.cookies.set({\n name: 'formFactor',\n value: cookieData.formFactor,\n ...getDefaultCookieConfig(hostname),\n maxAge: 0\n });\n }\n\n return response;\n};\n\n/**\n * 환경에 따른 기본 쿠키 설정값 반환\n * @param hostname\n * @returns\n */\nconst getDefaultCookieConfig = (hostname: string) => {\n const environment = getEnvironmentFromHostname(hostname);\n\n if (environment !== 'prd') {\n return {\n ...COOKIE_DEFAULT_CONFIG,\n httpOnly: false,\n secure: false,\n sameSite: 'lax' as const\n };\n }\n\n return COOKIE_DEFAULT_CONFIG;\n};\n","import { NextRequest, NextResponse } from 'next/server';\n\nimport { getApiHostNameFromEnvironment } from 'sales-frontend-utils';\n\nimport { DspResponseDspTokenResponseDto, ApiErrorResponse, RefreshTokensOptions } from '../server-side-helper.types';\nimport { createResponseWithCookies } from '../utils/cookie-utils';\n\n/**\n * 리프레시 토큰을 사용하여 새로운 액세스 토큰과 리프레시 토큰을 쿠키로 발급 받습니다.\n * API Route에서 사용될 수 있습니다.\n * 권장경로: /app/internal/api/auth/refresh/route.ts\n * Method: POST\n * @returns 새로운 AT, RT 발급 후 새 AT 반환\n */\nexport const refreshTokens = async (request: NextRequest, refreshTokensOptions?: RefreshTokensOptions) => {\n const refreshToken = request.cookies.get('refreshToken')?.value;\n\n // 기본 밸리데이션\n if (!refreshToken) {\n return NextResponse.json(\n {\n isSuccess: false,\n code: 'REFRESH_TOKEN_MISSING',\n message: '[ServerSideHelper-Api-Route] Refresh Token이 존재하지 않습니다.)',\n data: null\n } as ApiErrorResponse,\n { status: 401 }\n );\n }\n\n try {\n // TODO: 실제 토큰 재발급 API 주소로 변경 필요\n const tokenResponse = await fetch(\n `${getApiHostNameFromEnvironment(new URL(request.url).hostname, refreshTokensOptions?.forceApiHostName)}/api/dat/v1/post/token/refresh`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...Object.fromEntries(\n Array.from(request.headers.entries()).filter(([key]) => key.toLowerCase().startsWith('x-channel'))\n )\n },\n body: JSON.stringify({\n refreshToken\n })\n }\n );\n\n const tokenData: DspResponseDspTokenResponseDto = await tokenResponse.json();\n console.log('[ServerSideHelper-Api-Route] tokenData', tokenData);\n\n if (!tokenResponse.ok || !tokenData.isSuccess === false) {\n return NextResponse.json(\n {\n isSuccess: false,\n code: tokenData.code || 'TOKEN_REFRESH_FAILED',\n message: `[ServerSideHelper-Api-Route] ${tokenData.message || '토큰 갱신에 실패했습니다.'}`,\n data: null\n } as ApiErrorResponse,\n { status: 401 }\n );\n }\n\n // 응답 유효성 체크\n if (!tokenData.data?.accessToken || !tokenData.data?.refreshToken) {\n throw new Error('[ServerSideHelper-Api-Route] Invalid token data structure');\n }\n\n const { accessToken: newAccessToken, refreshToken: newRefreshToken, expiresIn, tokenType } = tokenData.data;\n\n // 응답 생성\n const response = NextResponse.json(\n {\n isSuccess: true,\n code: '',\n message: '[ServerSideHelper-Api-Route] Token 갱신 성공',\n data: { accessToken: newAccessToken, refreshToken: newRefreshToken, expiresIn, tokenType }\n },\n { status: 200 }\n );\n\n // 새 토큰들을 쿠키에 저장\n createResponseWithCookies(response, request, {\n tokens: { accessToken: newAccessToken, refreshToken: newRefreshToken, expiresIn, tokenType }\n });\n\n return response;\n } catch (error) {\n console.error('Token refresh error:', error);\n\n return NextResponse.json(\n {\n isSuccess: false,\n code: 'REFRESH_TOKEN_MISSING',\n message: '[ServerSideHelper-Api-Route] 토큰 재발급 중 오류가 발생했습니다.',\n data: null\n } as ApiErrorResponse,\n { status: 401 }\n );\n }\n};\n","import { NextResponse } from 'next/server';\n\n/**\n * 서버의 현재 시간을 밀리초 단위로 반환합니다.\n * API Route에서 사용될 수 있습니다.\n * 권장경로: /app/internal/api/time/route.ts\n * Method: GET\n * @returns\n */\nexport const getServerTime = () => {\n const now = new Date();\n const serverTime = now.getTime();\n\n return NextResponse.json({\n isSuccess: true,\n code: '',\n message: 'Current server time fetched successfully',\n data: { serverTime }\n });\n};\n"]}
1
+ {"version":3,"sources":["../../src/config/cookie-config.ts","../../src/utils/cookie-utils.ts","../../src/api-route/refresh-token.ts","../../src/api-route/server-time.ts"],"names":["NextResponse"],"mappings":"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","file":"index.js","sourcesContent":["export const COOKIE_DEFAULT_CONFIG = {\n httpOnly: true,\n sameSite: 'strict' as const,\n secure: true\n};\n","import { NextRequest, NextResponse } from 'next/server';\n\nimport { getEnvironmentFromHostname } from 'sales-frontend-utils';\n\nimport { COOKIE_DEFAULT_CONFIG } from '../config/cookie-config';\nimport { CookieData } from '../server-side-helper.types';\n\n/**\n * 쿠키 생성\n * @param response\n * @param cookieData\n * @returns\n */\nexport const createResponseWithCookies = (\n response: NextResponse,\n request: NextRequest,\n cookieData?: CookieData\n): NextResponse => {\n const { hostname } = new URL(request.url);\n\n // 토큰타입\n if (cookieData?.tokens?.tokenType) {\n response.cookies.set({\n name: 'tokenType',\n value: cookieData.tokens.tokenType,\n ...getDefaultCookieConfig(hostname)\n });\n }\n\n // expiresIn\n if (cookieData?.tokens?.expiresIn) {\n response.cookies.set({\n name: 'expiresIn',\n value: String(cookieData.tokens.expiresIn),\n ...getDefaultCookieConfig(hostname)\n });\n }\n\n // 액세스 토큰 쿠키\n if (cookieData?.tokens?.accessToken) {\n response.cookies.set({\n name: 'accessToken',\n value: cookieData.tokens.accessToken,\n ...getDefaultCookieConfig(hostname),\n //! middleware 커스텀헤더 세팅 불가로 일단 풀어 넣음\n httpOnly: false\n });\n }\n\n // 리프레시 토큰 쿠키\n if (cookieData?.tokens?.refreshToken) {\n response.cookies.set({\n name: 'refreshToken',\n value: cookieData.tokens.refreshToken,\n ...getDefaultCookieConfig(hostname)\n });\n }\n\n // FormFactor 쿠키\n if (cookieData?.formFactor) {\n response.cookies.set({\n name: 'formFactor',\n value: cookieData.formFactor,\n ...getDefaultCookieConfig(hostname)\n });\n }\n\n return response;\n};\n\n/**\n * 환경에 따른 기본 쿠키 설정값 반환\n * @param hostname\n * @returns\n */\nconst getDefaultCookieConfig = (hostname: string) => {\n const environment = getEnvironmentFromHostname(hostname);\n\n if (environment !== 'prd') {\n return {\n ...COOKIE_DEFAULT_CONFIG,\n httpOnly: false,\n secure: false,\n sameSite: 'lax' as const\n };\n }\n\n return COOKIE_DEFAULT_CONFIG;\n};\n","import { NextRequest, NextResponse } from 'next/server';\n\nimport { requestRefreshToken } from 'sales-frontend-api/middleware';\nimport { getApiHostNameFromEnvironment } from 'sales-frontend-utils';\n\nimport { ApiErrorResponse, RefreshTokensOptions } from '../server-side-helper.types';\nimport { createResponseWithCookies } from '../utils/cookie-utils';\n\n/**\n * 리프레시 토큰을 사용하여 새로운 액세스 토큰과 리프레시 토큰을 쿠키로 발급 받습니다.\n * API Route에서 사용될 수 있습니다.\n * 각 프로젝트 API Route 생성 경로: /app/internal/api/auth/refresh/route.ts\n * Method: POST\n * @returns 새로운 AT, RT 발급 후 새 AT 반환\n */\nexport const refreshTokens = async (request: NextRequest, refreshTokensOptions?: RefreshTokensOptions) => {\n const refreshToken = request.cookies.get('refreshToken')?.value;\n\n // 기본 밸리데이션\n if (!refreshToken) {\n return NextResponse.json(\n {\n isSuccess: false,\n code: 'REFRESH_TOKEN_MISSING',\n message: '[ServerSideHelper-Api-Route] Refresh Token이 존재하지 않습니다.)',\n data: null\n } as ApiErrorResponse,\n { status: 401 }\n );\n }\n\n try {\n const tokenData = await requestRefreshToken(\n { refreshToken },\n {\n baseURL: getApiHostNameFromEnvironment(new URL(request.url).hostname, refreshTokensOptions?.forceApiHostName),\n ...Object.fromEntries(\n Array.from(request.headers.entries()).filter(([key]) => key.toLowerCase().startsWith('x-channel'))\n )\n }\n );\n\n console.log('[ServerSideHelper-Api-Route] tokenData', tokenData);\n\n if (tokenData.isSuccess === false) {\n return NextResponse.json(\n {\n isSuccess: false,\n code: tokenData.code || 'TOKEN_REFRESH_FAILED',\n message: `[ServerSideHelper-Api-Route] ${tokenData.message || '토큰 갱신에 실패했습니다.'}`,\n data: null\n } as ApiErrorResponse,\n { status: 401 }\n );\n }\n\n // 응답 유효성 체크\n if (!tokenData.data?.accessToken || !tokenData.data?.refreshToken) {\n throw new Error('[ServerSideHelper-Api-Route] Invalid token data structure');\n }\n\n const { accessToken: newAccessToken, refreshToken: newRefreshToken, expiresIn, tokenType } = tokenData.data;\n\n // 응답 생성\n const response = NextResponse.json(\n {\n isSuccess: true,\n code: '',\n message: '[ServerSideHelper-Api-Route] Token 갱신 성공',\n data: { accessToken: newAccessToken, refreshToken: newRefreshToken, expiresIn, tokenType }\n },\n { status: 200 }\n );\n\n // 새 토큰들을 쿠키에 저장\n createResponseWithCookies(response, request, {\n tokens: { accessToken: newAccessToken, refreshToken: newRefreshToken, expiresIn, tokenType }\n });\n\n return response;\n } catch (error) {\n console.error('Token refresh error:', error);\n\n return NextResponse.json(\n {\n isSuccess: false,\n code: 'REFRESH_TOKEN_MISSING',\n message: '[ServerSideHelper-Api-Route] 토큰 재발급 중 오류가 발생했습니다.',\n data: null\n } as ApiErrorResponse,\n { status: 401 }\n );\n }\n};\n","import { NextResponse } from 'next/server';\n\n/**\n * 서버의 현재 시간을 밀리초 단위로 반환합니다.\n * API Route에서 사용될 수 있습니다.\n * 권장경로: /app/internal/api/time/route.ts\n * Method: GET\n * @returns\n */\nexport const getServerTime = () => {\n const now = new Date();\n const serverTime = now.getTime();\n\n return NextResponse.json({\n isSuccess: true,\n code: '',\n message: 'Current server time fetched successfully',\n data: { serverTime }\n });\n};\n"]}
@@ -1,12 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  // src/config/middleware-config.ts
4
- var middlewareDefaultMather = [
5
- "/",
6
- "/api/:path*",
7
- "/((?!_next|favicon|.*\\.js$|.*\\.css$|.*\\.svg$|.*\\.png$|.*\\.jpg$|.*\\.ico$|.*\\.woff$|.*\\.json$).*)"
8
- // 정적자원 파일 제외
9
- ];
4
+ var middlewareDefaultMather = ["/:path*"];
10
5
 
11
6
  exports.middlewareDefaultMather = middlewareDefaultMather;
12
7
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/config/middleware-config.ts"],"names":[],"mappings":";;;AAAO,IAAM,uBAA0B,GAAA;AAAA,EACrC,GAAA;AAAA,EACA,aAAA;AAAA,EACA;AAAA;AACF","file":"index.cjs","sourcesContent":["export const middlewareDefaultMather = [\n '/',\n '/api/:path*',\n '/((?!_next|favicon|.*\\\\.js$|.*\\\\.css$|.*\\\\.svg$|.*\\\\.png$|.*\\\\.jpg$|.*\\\\.ico$|.*\\\\.woff$|.*\\\\.json$).*)' // 정적자원 파일 제외\n];\n"]}
1
+ {"version":3,"sources":["../../src/config/middleware-config.ts"],"names":[],"mappings":";;;AAAa,IAAA,uBAAA,GAA0B,CAAC,SAAS","file":"index.cjs","sourcesContent":["export const middlewareDefaultMather = ['/:path*'];\n"]}
@@ -1,10 +1,5 @@
1
1
  // src/config/middleware-config.ts
2
- var middlewareDefaultMather = [
3
- "/",
4
- "/api/:path*",
5
- "/((?!_next|favicon|.*\\.js$|.*\\.css$|.*\\.svg$|.*\\.png$|.*\\.jpg$|.*\\.ico$|.*\\.woff$|.*\\.json$).*)"
6
- // 정적자원 파일 제외
7
- ];
2
+ var middlewareDefaultMather = ["/:path*"];
8
3
 
9
4
  export { middlewareDefaultMather };
10
5
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/config/middleware-config.ts"],"names":[],"mappings":";AAAO,IAAM,uBAA0B,GAAA;AAAA,EACrC,GAAA;AAAA,EACA,aAAA;AAAA,EACA;AAAA;AACF","file":"index.js","sourcesContent":["export const middlewareDefaultMather = [\n '/',\n '/api/:path*',\n '/((?!_next|favicon|.*\\\\.js$|.*\\\\.css$|.*\\\\.svg$|.*\\\\.png$|.*\\\\.jpg$|.*\\\\.ico$|.*\\\\.woff$|.*\\\\.json$).*)' // 정적자원 파일 제외\n];\n"]}
1
+ {"version":3,"sources":["../../src/config/middleware-config.ts"],"names":[],"mappings":";AAAa,IAAA,uBAAA,GAA0B,CAAC,SAAS","file":"index.js","sourcesContent":["export const middlewareDefaultMather = ['/:path*'];\n"]}
@@ -2,6 +2,7 @@
2
2
 
3
3
  var server = require('next/server');
4
4
  var salesFrontendUtils = require('sales-frontend-utils');
5
+ var middleware = require('sales-frontend-api/middleware');
5
6
 
6
7
  // src/middleware/dsp-middleware.ts
7
8
 
@@ -56,30 +57,18 @@ var isResponsivePath = (pathname, responsivePaths = []) => {
56
57
  return responsivePaths.some((path) => pathname.startsWith(path));
57
58
  };
58
59
  var isStaticAsset = (pathname) => {
60
+ if (pathname.startsWith("/api")) {
61
+ return false;
62
+ }
59
63
  if (pathname.startsWith("/_next") || pathname === "/favicon.ico") {
60
64
  return true;
61
65
  }
62
- const staticExtensions = /\.(js|jsx|ts|tsx|css|scss|sass|less|svg|png|jpg|jpeg|gif|webp|ico|bmp|woff|woff2|ttf|eot|otf|json|xml|txt|pdf|zip|rar|mp4|mp3|wav|ogg)$/i;
63
- return staticExtensions.test(pathname);
64
- };
65
- var getTokensFromServer = async (request, tempToken) => {
66
- const { accessToken } = parseCookies(request);
67
- if (accessToken || !tempToken) {
68
- return null;
69
- }
70
- console.log(`[DSP Middleware] \uC784\uC2DC \uD1A0\uD070 \uCC98\uB9AC:: ${tempToken ? "\uC788\uC74C" : "\uC5C6\uC74C"}`);
71
- const apiUrl = `https://nxl-dsp-stg.hanwhalife.com/api/dat/v1/post/exchange/${tempToken}`;
72
- console.log("\uC694\uCCAD URL::", apiUrl);
73
- const response = await fetch(apiUrl, { method: "POST" });
74
- const data = await response.json();
75
- console.log(`[DSP Middleware] \uD1A0\uD070 \uBC1C\uAE09 \uC131\uACF5`, data);
76
- return data;
66
+ return /\.[a-zA-Z0-9]+$/.test(pathname);
77
67
  };
78
68
 
79
69
  // src/config/cookie-config.ts
80
70
  var COOKIE_DEFAULT_CONFIG = {
81
71
  httpOnly: true,
82
- maxAge: 60 * 60 * 24,
83
72
  sameSite: "strict",
84
73
  secure: true
85
74
  };
@@ -87,9 +76,6 @@ var COOKIE_DEFAULT_CONFIG = {
87
76
  // src/utils/cookie-utils.ts
88
77
  var createResponseWithCookies = (response, request, cookieData) => {
89
78
  const { hostname } = new URL(request.url);
90
- console.log("[createResponseWithCookies] \uCFE0\uD0A4 \uC124\uC815 \uC2DC\uC791");
91
- console.log("cookieData::", cookieData);
92
- console.log("hostname::", hostname);
93
79
  if (cookieData?.tokens?.tokenType) {
94
80
  response.cookies.set({
95
81
  name: "tokenType",
@@ -108,7 +94,9 @@ var createResponseWithCookies = (response, request, cookieData) => {
108
94
  response.cookies.set({
109
95
  name: "accessToken",
110
96
  value: cookieData.tokens.accessToken,
111
- ...getDefaultCookieConfig(hostname)
97
+ ...getDefaultCookieConfig(hostname),
98
+ //! middleware 커스텀헤더 세팅 불가로 일단 풀어 넣음
99
+ httpOnly: false
112
100
  });
113
101
  }
114
102
  if (cookieData?.tokens?.refreshToken) {
@@ -122,8 +110,7 @@ var createResponseWithCookies = (response, request, cookieData) => {
122
110
  response.cookies.set({
123
111
  name: "formFactor",
124
112
  value: cookieData.formFactor,
125
- ...getDefaultCookieConfig(hostname),
126
- maxAge: 0
113
+ ...getDefaultCookieConfig(hostname)
127
114
  });
128
115
  }
129
116
  return response;
@@ -153,21 +140,12 @@ var handleAdaptiveProcessing = (request, config) => {
153
140
  tokens: config?.cookieData?.tokens ?? null
154
141
  });
155
142
  };
156
- var handleApiRequest = (request) => {
143
+ var handleApiRequest = async (request) => {
157
144
  const { pathname } = request.nextUrl;
158
145
  if (!pathname.startsWith("/api/")) {
159
146
  return null;
160
147
  }
161
- const { accessToken } = parseCookies(request);
162
- const requestHeaders = new Headers(request.headers);
163
- if (accessToken) {
164
- requestHeaders.set("Authorization", `Bearer ${accessToken}`);
165
- }
166
- return server.NextResponse.next({
167
- request: {
168
- headers: requestHeaders
169
- }
170
- });
148
+ return server.NextResponse.next();
171
149
  };
172
150
  var handleDirectUrlAccess = (request, config) => {
173
151
  const { pathname } = request.nextUrl;
@@ -200,6 +178,22 @@ var handleResponsivePaths = (request, config) => {
200
178
  tokens: config?.cookieData?.tokens ?? null
201
179
  });
202
180
  };
181
+ var getTokensFromServer = async (request, tempToken, forceApiHostName) => {
182
+ const { accessToken } = parseCookies(request);
183
+ if (accessToken || !tempToken) {
184
+ return null;
185
+ }
186
+ console.log(`[DSP Middleware] \uC784\uC2DC \uD1A0\uD070 \uCC98\uB9AC:: ${tempToken ? "\uC788\uC74C" : "\uC5C6\uC74C"}`);
187
+ const data = await middleware.requestAccessTokens(tempToken, {
188
+ baseURL: salesFrontendUtils.getApiHostNameFromEnvironment(new URL(request.url).hostname, forceApiHostName)
189
+ });
190
+ if (data.isSuccess === false) {
191
+ console.error("[DSP Middleware] \uD1A0\uD070 \uBC1C\uAE09 \uC2E4\uD328");
192
+ throw new Error("\uD1A0\uD070 \uBC1C\uAE09 \uC2E4\uD328");
193
+ }
194
+ console.log(`[DSP Middleware] \uD1A0\uD070 \uBC1C\uAE09 \uC131\uACF5`, data);
195
+ return data;
196
+ };
203
197
 
204
198
  // src/middleware/dsp-middleware.ts
205
199
  var processDspMiddleware = async (request, config) => {
@@ -207,6 +201,9 @@ var processDspMiddleware = async (request, config) => {
207
201
  if (isStaticAsset(pathname)) {
208
202
  return server.NextResponse.next();
209
203
  }
204
+ console.log(`[DSP Middleware] \uCC98\uB9AC \uC2DC\uC791:: ${request.url}`);
205
+ console.log(`[DSP Middleware] pathname:: ${pathname}`);
206
+ console.log("[DSP Middleware] hostname:: ", new URL(request.url).hostname);
210
207
  let tokens;
211
208
  try {
212
209
  const tokensResponse = await getTokensFromServer(request, parseQueryParameters(request).tempToken);
@@ -215,9 +212,9 @@ var processDspMiddleware = async (request, config) => {
215
212
  console.error(`[DSP Middleware] \uD1A0\uD070 \uD68D\uB4DD \uC2E4\uD328:: ${pathname}`, error);
216
213
  tokens = null;
217
214
  }
218
- const apiResponse = handleApiRequest(request);
215
+ const apiResponse = await handleApiRequest(request);
219
216
  if (apiResponse) {
220
- console.log(`[DSP Middleware] API \uC694\uCCAD:: ${pathname}`);
217
+ console.log(`[DSP Middleware] API \uC694\uCCAD pathname:: ${pathname}`);
221
218
  return apiResponse;
222
219
  }
223
220
  const externalInternalResponse = handleExternalInternalPaths(request, { cookieData: { tokens } });
@@ -255,7 +252,6 @@ var createMiddleware = (handlers, config) => {
255
252
  return server.NextResponse.next();
256
253
  };
257
254
  };
258
- //! test
259
255
 
260
256
  exports.createMiddleware = createMiddleware;
261
257
  exports.handleAdaptiveProcessing = handleAdaptiveProcessing;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/parse-utils.ts","../../src/utils/middleware-utils.ts","../../src/config/cookie-config.ts","../../src/utils/cookie-utils.ts","../../src/middleware/handlers/handleAdaptiveProcessing.ts","../../src/middleware/handlers/handleApiRequest.ts","../../src/middleware/handlers/handleDirectUrlAccess.ts","../../src/middleware/handlers/handleExternalInternalPaths.ts","../../src/middleware/handlers/handleResponsivePaths.ts","../../src/middleware/dsp-middleware.ts","../../src/middleware/handlers/createMiddleware.ts"],"names":["getFormFactorFromUserAgent","getEnvironmentFromHostname","NextResponse"],"mappings":"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","file":"index.cjs","sourcesContent":["import { NextRequest } from 'next/server';\n\n/**\n * 요청 헤더에 값 파싱\n * @param request\n * @returns\n */\nexport const parseRequestHeaders = (request: NextRequest) => {\n return {\n formFactor: request.headers.get('X-Channel-FormFactor')\n };\n};\n\n/**\n * 쿼리 스트링 값 파싱\n * @param request\n * @returns\n */\nexport const parseQueryParameters = (request: NextRequest) => {\n const { searchParams } = request.nextUrl;\n\n return {\n tempToken: searchParams.get('tempToken')\n };\n};\n\n/**\n * 요청 쿠키에 값 파싱\n * @param request\n * @returns\n */\nexport const parseCookies = (request: NextRequest) => {\n return {\n formFactor: request.cookies.get('formFactor')?.value,\n accessToken: request.cookies.get('accessToken')?.value\n };\n};\n","import { NextRequest } from 'next/server';\n\nimport { getFormFactorFromUserAgent } from 'sales-frontend-utils';\n\nimport { DspResponseDspTokenResponseDto } from '../server-side-helper.types';\n\nimport { parseCookies, parseRequestHeaders } from './parse-utils';\n\n/**\n * FormFactor에 따른 적응형 경로 변환\n * @param pathname\n * @param formFactor\n * @returns\n */\nexport const convertAdaptiveTargetPath = (pathname: string, formFactor: string) => {\n if (pathname === '/') {\n return pathname;\n }\n\n switch (formFactor) {\n case 'tablet':\n return `/tablet${pathname}`;\n case 'phone':\n case 'smartphone':\n return `/mobile${pathname}`;\n case 'desktop':\n default:\n return `/pc${pathname}`;\n }\n};\n\n/**\n * FormFactor 구하기\n * @param request\n * @returns\n */\nexport const getFormFactor = (request: NextRequest) => {\n const userAgent = request.headers.get('user-agent') || '';\n\n // 1순위: Custom Header\n const headerValue = parseRequestHeaders(request).formFactor;\n if (headerValue) {\n return headerValue;\n }\n\n // 2순위: Cookie\n const cookieValue = parseCookies(request).formFactor;\n if (cookieValue) {\n return cookieValue;\n }\n\n // 3순위: User-Agent 판단\n return getFormFactorFromUserAgent(userAgent);\n};\n\n/**\n * 반응형 전용 pathname 판단\n * @param pathname\n * @param responsivePaths\n * @returns\n */\nexport const isResponsivePath = (pathname: string, responsivePaths: string[] = []): boolean => {\n return responsivePaths.some((path) => pathname.startsWith(path));\n};\n\n/**\n * 정적 자원 체크 함수\n * @param pathname\n * @returns\n */\nexport const isStaticAsset = (pathname: string): boolean => {\n // _next 관련 파일들\n if (pathname.startsWith('/_next') || pathname === '/favicon.ico') {\n return true;\n }\n\n // 확장자로 정적 파일 체크\n const staticExtensions =\n /\\.(js|jsx|ts|tsx|css|scss|sass|less|svg|png|jpg|jpeg|gif|webp|ico|bmp|woff|woff2|ttf|eot|otf|json|xml|txt|pdf|zip|rar|mp4|mp3|wav|ogg)$/i;\n\n return staticExtensions.test(pathname);\n};\n\n////////////\n//! test\n////////////\nexport const getTokensFromServer = async (\n request: NextRequest,\n tempToken: string | null\n): Promise<DspResponseDspTokenResponseDto | null> => {\n const { accessToken } = parseCookies(request);\n\n if (accessToken || !tempToken) {\n return null;\n }\n\n console.log(`[DSP Middleware] 임시 토큰 처리:: ${tempToken ? '있음' : '없음'}`);\n\n //const apiUrl = `${request.nextUrl.origin}/v1/post/exchange/${tempToken}`;\n const apiUrl = `https://nxl-dsp-stg.hanwhalife.com/api/dat/v1/post/exchange/${tempToken}`;\n\n console.log('요청 URL::', apiUrl);\n\n const response = await fetch(apiUrl, { method: 'POST' });\n\n const data: DspResponseDspTokenResponseDto = await response.json();\n\n console.log(`[DSP Middleware] 토큰 발급 성공`, data);\n\n return data;\n};\n","export const COOKIE_DEFAULT_CONFIG = {\n httpOnly: true,\n maxAge: 60 * 60 * 24,\n sameSite: 'strict' as const,\n secure: true\n};\n","import { NextRequest, NextResponse } from 'next/server';\n\nimport { getEnvironmentFromHostname } from 'sales-frontend-utils';\n\nimport { COOKIE_DEFAULT_CONFIG } from '../config/cookie-config';\nimport { CookieData } from '../server-side-helper.types';\n\n/**\n * 쿠키 생성\n * @param response\n * @param cookieData\n * @returns\n */\nexport const createResponseWithCookies = (\n response: NextResponse,\n request: NextRequest,\n cookieData?: CookieData\n): NextResponse => {\n const { hostname } = new URL(request.url);\n\n console.log('[createResponseWithCookies] 쿠키 설정 시작');\n console.log('cookieData::', cookieData);\n console.log('hostname::', hostname);\n\n // 토큰타입\n if (cookieData?.tokens?.tokenType) {\n response.cookies.set({\n name: 'tokenType',\n value: cookieData.tokens.tokenType,\n ...getDefaultCookieConfig(hostname)\n });\n }\n\n // expiresIn\n if (cookieData?.tokens?.expiresIn) {\n response.cookies.set({\n name: 'expiresIn',\n value: String(cookieData.tokens.expiresIn),\n ...getDefaultCookieConfig(hostname)\n });\n }\n\n // 액세스 토큰 쿠키\n if (cookieData?.tokens?.accessToken) {\n response.cookies.set({\n name: 'accessToken',\n value: cookieData.tokens.accessToken,\n ...getDefaultCookieConfig(hostname)\n });\n }\n\n // 리프레시 토큰 쿠키\n if (cookieData?.tokens?.refreshToken) {\n response.cookies.set({\n name: 'refreshToken',\n value: cookieData.tokens.refreshToken,\n ...getDefaultCookieConfig(hostname)\n });\n }\n\n // FormFactor 쿠키\n if (cookieData?.formFactor) {\n response.cookies.set({\n name: 'formFactor',\n value: cookieData.formFactor,\n ...getDefaultCookieConfig(hostname),\n maxAge: 0\n });\n }\n\n return response;\n};\n\n/**\n * 환경에 따른 기본 쿠키 설정값 반환\n * @param hostname\n * @returns\n */\nconst getDefaultCookieConfig = (hostname: string) => {\n const environment = getEnvironmentFromHostname(hostname);\n\n if (environment !== 'prd') {\n return {\n ...COOKIE_DEFAULT_CONFIG,\n httpOnly: false,\n secure: false,\n sameSite: 'lax' as const\n };\n }\n\n return COOKIE_DEFAULT_CONFIG;\n};\n","import { NextRequest, NextResponse } from 'next/server';\n\nimport { MiddlewareHandler, MiddlewareConfig } from '../../server-side-helper.types';\nimport { createResponseWithCookies } from '../../utils/cookie-utils';\nimport { getFormFactor, convertAdaptiveTargetPath } from '../../utils/middleware-utils';\n\n/**\n * 적응형 경로 처리(rewrite 처리)\n * 단, 쿠키를 넘겨주면 쿠키 생성을 해줌\n * @param request\n * @param config\n * @returns\n */\nexport const handleAdaptiveProcessing: MiddlewareHandler = (request: NextRequest, config?: MiddlewareConfig) => {\n const { nextUrl } = request;\n const formFactor = getFormFactor(request);\n\n const rewrittenUrl = nextUrl.clone();\n rewrittenUrl.pathname = convertAdaptiveTargetPath(nextUrl.pathname, formFactor);\n\n console.log(`[DSP Middleware] ReWrite 처리:: ${rewrittenUrl.pathname}`);\n\n return createResponseWithCookies(NextResponse.rewrite(rewrittenUrl), request, {\n formFactor,\n tokens: config?.cookieData?.tokens ?? null\n });\n};\n","import { NextRequest, NextResponse } from 'next/server';\n\nimport { MiddlewareHandler } from '../../server-side-helper.types';\nimport { parseCookies } from '../../utils/parse-utils';\n\n/**\n * API 요청 처리\n * Cookie에 AccessToken이 있으면 Authorization 헤더에 셋팅을 담당하는 함수\n * Only api 요청만 처리\n * @param request\n * @returns\n */\nexport const handleApiRequest: MiddlewareHandler = (request: NextRequest) => {\n const { pathname } = request.nextUrl;\n\n if (!pathname.startsWith('/api/')) {\n // 처리하지 않음 (온니 api 요청만 처리)\n return null;\n }\n\n const { accessToken } = parseCookies(request);\n const requestHeaders = new Headers(request.headers);\n\n if (accessToken) {\n requestHeaders.set('Authorization', `Bearer ${accessToken}`);\n }\n\n return NextResponse.next({\n request: {\n headers: requestHeaders\n }\n });\n};\n","import { NextRequest, NextResponse } from 'next/server';\n\nimport { MiddlewareHandler, MiddlewareConfig } from '../../server-side-helper.types';\nimport { createResponseWithCookies } from '../../utils/cookie-utils';\n\n/**\n * 직접 URL 접근 처리\n * 직접 URL 입력한 경우 그대로 통과\n * 쿠키를 넘겨주면 쿠키 생성을 해줌\n * @param request\n * @param config\n * @returns\n */\nexport const handleDirectUrlAccess: MiddlewareHandler = (request: NextRequest, config?: MiddlewareConfig) => {\n const { pathname } = request.nextUrl;\n\n const directPaths = ['/tablet/', '/mobile/', '/pc/', '/responsive/'];\n\n if (directPaths.some((path) => pathname.startsWith(path))) {\n return createResponseWithCookies(NextResponse.next(), request, {\n tokens: config?.cookieData?.tokens ?? null\n });\n }\n\n return null;\n};\n","import { NextRequest, NextResponse } from 'next/server';\n\nimport { MiddlewareHandler, MiddlewareConfig } from '../../server-side-helper.types';\nimport { createResponseWithCookies } from '../../utils/cookie-utils';\n\n/**\n * External/Internal 경로 처리\n * 컨텍스트를 벗어난 페이지 처리(아무런 간섭을 받지 않음)\n * 단, 쿠키를 넘겨주면 쿠키 생성을 해줌\n * @param request\n * @param config\n * @returns\n */\nexport const handleExternalInternalPaths: MiddlewareHandler = (request: NextRequest, config?: MiddlewareConfig) => {\n const { pathname } = request.nextUrl;\n\n if (pathname.startsWith('/external') || pathname.startsWith('/internal')) {\n return createResponseWithCookies(NextResponse.next(), request, {\n tokens: config?.cookieData?.tokens ?? null\n });\n }\n\n return null;\n};\n","import { NextRequest, NextResponse } from 'next/server';\n\nimport { MiddlewareHandler, MiddlewareConfig } from '../../server-side-helper.types';\nimport { createResponseWithCookies } from '../../utils/cookie-utils';\nimport { isResponsivePath } from '../../utils/middleware-utils';\n\n/**\n * 반응형 경로 처리(rewrite 처리)\n * 단, 쿠키를 넘겨주면 쿠키 생성을 해줌\n * @param request\n * @param config\n * @returns\n */\nexport const handleResponsivePaths: MiddlewareHandler = (request: NextRequest, config?: MiddlewareConfig) => {\n const { nextUrl } = request;\n const { pathname } = nextUrl;\n\n if (!isResponsivePath(pathname, config?.responsivePaths)) {\n return null;\n }\n\n const rewrittenUrl = nextUrl.clone();\n rewrittenUrl.pathname = `/responsive${pathname}`;\n\n return createResponseWithCookies(NextResponse.rewrite(rewrittenUrl), request, {\n tokens: config?.cookieData?.tokens ?? null\n });\n};\n","import { NextRequest, NextResponse } from 'next/server';\n\nimport { MiddlewareConfig } from '../server-side-helper.types';\nimport { getTokensFromServer, isStaticAsset } from '../utils/middleware-utils';\nimport { parseQueryParameters } from '../utils/parse-utils';\n\nimport { handleAdaptiveProcessing } from './handlers/handleAdaptiveProcessing';\nimport { handleApiRequest } from './handlers/handleApiRequest';\nimport { handleDirectUrlAccess } from './handlers/handleDirectUrlAccess';\nimport { handleExternalInternalPaths } from './handlers/handleExternalInternalPaths';\nimport { handleResponsivePaths } from './handlers/handleResponsivePaths';\n\nexport const processDspMiddleware = async (request: NextRequest, config?: MiddlewareConfig): Promise<NextResponse> => {\n const { pathname } = request.nextUrl;\n //console.log(`[DSP Middleware] 처리 시작:: ${pathname}`);\n\n // 0. 정적 자원 체크(Skip)\n if (isStaticAsset(pathname)) {\n //console.log(`[DSP Middleware] 정적 자원 패스:: ${pathname}`);\n\n return NextResponse.next();\n }\n\n // 1. 토큰 받기 (임시토큰만 있으면)\n let tokens;\n try {\n const tokensResponse = await getTokensFromServer(request, parseQueryParameters(request).tempToken);\n tokens = tokensResponse?.data;\n } catch (error) {\n // 토큰 없이 계속 진행\n console.error(`[DSP Middleware] 토큰 획득 실패:: ${pathname}`, error);\n tokens = null;\n }\n\n // 2. API 요청 처리\n const apiResponse = handleApiRequest(request);\n if (apiResponse) {\n console.log(`[DSP Middleware] API 요청:: ${pathname}`);\n\n return apiResponse;\n }\n\n // 3. 외부/내부 경로 처리\n const externalInternalResponse = handleExternalInternalPaths(request, { cookieData: { tokens } });\n if (externalInternalResponse) {\n console.log(`[DSP Middleware] External/Internal 경로로 처리:: ${pathname}`);\n\n return externalInternalResponse;\n }\n\n // 4. 직접 적응형 URL 접근 처리\n const directUrlResponse = handleDirectUrlAccess(request, { cookieData: { tokens } });\n if (directUrlResponse) {\n console.log(`[DSP Middleware] 직접 URL 접근으로 처리:: ${pathname}`);\n\n return directUrlResponse;\n }\n\n // 5. 반응형 전용 경로 처리\n const responsivePathResponse = handleResponsivePaths(request, {\n cookieData: { tokens },\n responsivePaths: config?.responsivePaths\n });\n if (responsivePathResponse) {\n console.log(`[DSP Middleware] 반응형 경로로 처리:: ${pathname}`);\n\n return responsivePathResponse;\n }\n\n // 6. 적응형 경로 처리\n const adaptiveResponse = handleAdaptiveProcessing(request, { cookieData: { tokens } });\n if (adaptiveResponse) {\n return adaptiveResponse;\n }\n\n // 모든 핸들러가 null을 반환하면 기본 처리\n return NextResponse.next();\n};\n","import { NextRequest, NextResponse } from 'next/server';\n\nimport { MiddlewareHandler, MiddlewareConfig } from '../../server-side-helper.types';\n\n/**\n * 미들웨어 조립 함수\n * @param handlers\n * @param config\n * @returns\n */\nexport const createMiddleware = (handlers: MiddlewareHandler[], config?: MiddlewareConfig) => {\n return (request: NextRequest): NextResponse => {\n // 핸들러들을 순서대로 실행\n for (const handler of handlers) {\n const result = handler(request, config);\n if (result) {\n return result; // 첫 번째로 처리된 결과 반환\n }\n }\n\n // 모든 핸들러가 null을 반환하면 기본 처리\n return NextResponse.next();\n };\n};\n"]}
1
+ {"version":3,"sources":["../../src/utils/parse-utils.ts","../../src/utils/middleware-utils.ts","../../src/config/cookie-config.ts","../../src/utils/cookie-utils.ts","../../src/middleware/handlers/handleAdaptiveProcessing.ts","../../src/middleware/handlers/handleApiRequest.ts","../../src/middleware/handlers/handleDirectUrlAccess.ts","../../src/middleware/handlers/handleExternalInternalPaths.ts","../../src/middleware/handlers/handleResponsivePaths.ts","../../src/middleware/handlers/handleTokensFromServer.ts","../../src/middleware/dsp-middleware.ts","../../src/middleware/handlers/createMiddleware.ts"],"names":["getFormFactorFromUserAgent","getEnvironmentFromHostname","NextResponse","requestAccessTokens","getApiHostNameFromEnvironment"],"mappings":"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","file":"index.cjs","sourcesContent":["import { NextRequest } from 'next/server';\n\n/**\n * 요청 헤더에 값 파싱\n * @param request\n * @returns\n */\nexport const parseRequestHeaders = (request: NextRequest) => {\n return {\n formFactor: request.headers.get('X-Channel-FormFactor')\n };\n};\n\n/**\n * 쿼리 스트링 값 파싱\n * @param request\n * @returns\n */\nexport const parseQueryParameters = (request: NextRequest) => {\n const { searchParams } = request.nextUrl;\n\n return {\n tempToken: searchParams.get('tempToken')\n };\n};\n\n/**\n * 요청 쿠키에 값 파싱\n * @param request\n * @returns\n */\nexport const parseCookies = (request: NextRequest) => {\n return {\n formFactor: request.cookies.get('formFactor')?.value,\n accessToken: request.cookies.get('accessToken')?.value\n };\n};\n","import { NextRequest } from 'next/server';\n\nimport { getFormFactorFromUserAgent } from 'sales-frontend-utils';\n\nimport { parseCookies, parseRequestHeaders } from './parse-utils';\n\n/**\n * FormFactor에 따른 적응형 경로 변환\n * @param pathname\n * @param formFactor\n * @returns\n */\nexport const convertAdaptiveTargetPath = (pathname: string, formFactor: string) => {\n if (pathname === '/') {\n return pathname;\n }\n\n switch (formFactor) {\n case 'tablet':\n return `/tablet${pathname}`;\n case 'phone':\n case 'smartphone':\n return `/mobile${pathname}`;\n case 'desktop':\n default:\n return `/pc${pathname}`;\n }\n};\n\n/**\n * FormFactor 구하기\n * @param request\n * @returns\n */\nexport const getFormFactor = (request: NextRequest) => {\n const userAgent = request.headers.get('user-agent') || '';\n\n // 1순위: Custom Header\n const headerValue = parseRequestHeaders(request).formFactor;\n if (headerValue) {\n return headerValue;\n }\n\n // 2순위: Cookie\n const cookieValue = parseCookies(request).formFactor;\n if (cookieValue) {\n return cookieValue;\n }\n\n // 3순위: User-Agent 판단\n return getFormFactorFromUserAgent(userAgent);\n};\n\n/**\n * 반응형 전용 pathname 판단\n * @param pathname\n * @param responsivePaths\n * @returns\n */\nexport const isResponsivePath = (pathname: string, responsivePaths: string[] = []): boolean => {\n return responsivePaths.some((path) => pathname.startsWith(path));\n};\n\n/**\n * 정적 자원 체크 함수\n * @param pathname\n * @returns\n */\nexport const isStaticAsset = (pathname: string): boolean => {\n // API 라우트는 제외\n if (pathname.startsWith('/api')) {\n return false;\n }\n\n // _next 관련 파일들\n if (pathname.startsWith('/_next') || pathname === '/favicon.ico') {\n return true;\n }\n\n // 확장자가 있으면 정적 자원\n return /\\.[a-zA-Z0-9]+$/.test(pathname);\n};\n","export const COOKIE_DEFAULT_CONFIG = {\n httpOnly: true,\n sameSite: 'strict' as const,\n secure: true\n};\n","import { NextRequest, NextResponse } from 'next/server';\n\nimport { getEnvironmentFromHostname } from 'sales-frontend-utils';\n\nimport { COOKIE_DEFAULT_CONFIG } from '../config/cookie-config';\nimport { CookieData } from '../server-side-helper.types';\n\n/**\n * 쿠키 생성\n * @param response\n * @param cookieData\n * @returns\n */\nexport const createResponseWithCookies = (\n response: NextResponse,\n request: NextRequest,\n cookieData?: CookieData\n): NextResponse => {\n const { hostname } = new URL(request.url);\n\n // 토큰타입\n if (cookieData?.tokens?.tokenType) {\n response.cookies.set({\n name: 'tokenType',\n value: cookieData.tokens.tokenType,\n ...getDefaultCookieConfig(hostname)\n });\n }\n\n // expiresIn\n if (cookieData?.tokens?.expiresIn) {\n response.cookies.set({\n name: 'expiresIn',\n value: String(cookieData.tokens.expiresIn),\n ...getDefaultCookieConfig(hostname)\n });\n }\n\n // 액세스 토큰 쿠키\n if (cookieData?.tokens?.accessToken) {\n response.cookies.set({\n name: 'accessToken',\n value: cookieData.tokens.accessToken,\n ...getDefaultCookieConfig(hostname),\n //! middleware 커스텀헤더 세팅 불가로 일단 풀어 넣음\n httpOnly: false\n });\n }\n\n // 리프레시 토큰 쿠키\n if (cookieData?.tokens?.refreshToken) {\n response.cookies.set({\n name: 'refreshToken',\n value: cookieData.tokens.refreshToken,\n ...getDefaultCookieConfig(hostname)\n });\n }\n\n // FormFactor 쿠키\n if (cookieData?.formFactor) {\n response.cookies.set({\n name: 'formFactor',\n value: cookieData.formFactor,\n ...getDefaultCookieConfig(hostname)\n });\n }\n\n return response;\n};\n\n/**\n * 환경에 따른 기본 쿠키 설정값 반환\n * @param hostname\n * @returns\n */\nconst getDefaultCookieConfig = (hostname: string) => {\n const environment = getEnvironmentFromHostname(hostname);\n\n if (environment !== 'prd') {\n return {\n ...COOKIE_DEFAULT_CONFIG,\n httpOnly: false,\n secure: false,\n sameSite: 'lax' as const\n };\n }\n\n return COOKIE_DEFAULT_CONFIG;\n};\n","import { NextRequest, NextResponse } from 'next/server';\n\nimport { MiddlewareHandler, MiddlewareConfig } from '../../server-side-helper.types';\nimport { createResponseWithCookies } from '../../utils/cookie-utils';\nimport { getFormFactor, convertAdaptiveTargetPath } from '../../utils/middleware-utils';\n\n/**\n * 적응형 경로 처리(rewrite 처리)\n * 단, 쿠키를 넘겨주면 쿠키 생성을 해줌\n * @param request\n * @param config\n * @returns\n */\nexport const handleAdaptiveProcessing: MiddlewareHandler = (request: NextRequest, config?: MiddlewareConfig) => {\n const { nextUrl } = request;\n const formFactor = getFormFactor(request);\n\n const rewrittenUrl = nextUrl.clone();\n rewrittenUrl.pathname = convertAdaptiveTargetPath(nextUrl.pathname, formFactor);\n\n console.log(`[DSP Middleware] ReWrite 처리:: ${rewrittenUrl.pathname}`);\n\n return createResponseWithCookies(NextResponse.rewrite(rewrittenUrl), request, {\n formFactor,\n tokens: config?.cookieData?.tokens ?? null\n });\n};\n","import { NextRequest, NextResponse } from 'next/server';\n\n/**\n * API 요청 처리\n * Cookie에 AccessToken이 있으면 Authorization 헤더에 셋팅을 담당하는 함수\n * Only api 요청만 처리\n * @param request\n * @returns\n */\nexport const handleApiRequest = async (request: NextRequest): Promise<NextResponse | null> => {\n const { pathname } = request.nextUrl;\n\n if (!pathname.startsWith('/api/')) {\n // 처리하지 않음 (온니 api 요청만 처리)\n return null;\n }\n\n return NextResponse.next();\n};\n","import { NextRequest, NextResponse } from 'next/server';\n\nimport { MiddlewareHandler, MiddlewareConfig } from '../../server-side-helper.types';\nimport { createResponseWithCookies } from '../../utils/cookie-utils';\n\n/**\n * 직접 URL 접근 처리\n * 직접 URL 입력한 경우 그대로 통과\n * 쿠키를 넘겨주면 쿠키 생성을 해줌\n * @param request\n * @param config\n * @returns\n */\nexport const handleDirectUrlAccess: MiddlewareHandler = (request: NextRequest, config?: MiddlewareConfig) => {\n const { pathname } = request.nextUrl;\n\n const directPaths = ['/tablet/', '/mobile/', '/pc/', '/responsive/'];\n\n if (directPaths.some((path) => pathname.startsWith(path))) {\n return createResponseWithCookies(NextResponse.next(), request, {\n tokens: config?.cookieData?.tokens ?? null\n });\n }\n\n return null;\n};\n","import { NextRequest, NextResponse } from 'next/server';\n\nimport { MiddlewareHandler, MiddlewareConfig } from '../../server-side-helper.types';\nimport { createResponseWithCookies } from '../../utils/cookie-utils';\n\n/**\n * External/Internal 경로 처리\n * 컨텍스트를 벗어난 페이지 처리(아무런 간섭을 받지 않음)\n * 단, 쿠키를 넘겨주면 쿠키 생성을 해줌\n * @param request\n * @param config\n * @returns\n */\nexport const handleExternalInternalPaths: MiddlewareHandler = (request: NextRequest, config?: MiddlewareConfig) => {\n const { pathname } = request.nextUrl;\n\n if (pathname.startsWith('/external') || pathname.startsWith('/internal')) {\n return createResponseWithCookies(NextResponse.next(), request, {\n tokens: config?.cookieData?.tokens ?? null\n });\n }\n\n return null;\n};\n","import { NextRequest, NextResponse } from 'next/server';\n\nimport { MiddlewareHandler, MiddlewareConfig } from '../../server-side-helper.types';\nimport { createResponseWithCookies } from '../../utils/cookie-utils';\nimport { isResponsivePath } from '../../utils/middleware-utils';\n\n/**\n * 반응형 경로 처리(rewrite 처리)\n * 단, 쿠키를 넘겨주면 쿠키 생성을 해줌\n * @param request\n * @param config\n * @returns\n */\nexport const handleResponsivePaths: MiddlewareHandler = (request: NextRequest, config?: MiddlewareConfig) => {\n const { nextUrl } = request;\n const { pathname } = nextUrl;\n\n if (!isResponsivePath(pathname, config?.responsivePaths)) {\n return null;\n }\n\n const rewrittenUrl = nextUrl.clone();\n rewrittenUrl.pathname = `/responsive${pathname}`;\n\n return createResponseWithCookies(NextResponse.rewrite(rewrittenUrl), request, {\n tokens: config?.cookieData?.tokens ?? null\n });\n};\n","import { NextRequest } from 'next/server';\n\nimport { requestAccessTokens, DspResponseDspTokenResponseDto } from 'sales-frontend-api/middleware';\nimport { getApiHostNameFromEnvironment } from 'sales-frontend-utils';\n\nimport { parseCookies } from '../../utils';\n\n/**\n * 임시토큰만 있을 경우 AT, RT를 발급받는다.\n * @param request\n * @param tempToken\n * @returns\n */\nexport const getTokensFromServer = async (\n request: NextRequest,\n tempToken: string | null,\n forceApiHostName?: string\n): Promise<DspResponseDspTokenResponseDto | null> => {\n const { accessToken } = parseCookies(request);\n\n if (accessToken || !tempToken) {\n return null;\n }\n\n console.log(`[DSP Middleware] 임시 토큰 처리:: ${tempToken ? '있음' : '없음'}`);\n\n const data = await requestAccessTokens(tempToken, {\n baseURL: getApiHostNameFromEnvironment(new URL(request.url).hostname, forceApiHostName)\n });\n\n if (data.isSuccess === false) {\n console.error('[DSP Middleware] 토큰 발급 실패');\n\n throw new Error('토큰 발급 실패');\n }\n\n console.log(`[DSP Middleware] 토큰 발급 성공`, data);\n\n return data;\n};\n","import { NextRequest, NextResponse } from 'next/server';\n\nimport { MiddlewareConfig } from '../server-side-helper.types';\nimport { isStaticAsset } from '../utils/middleware-utils';\nimport { parseQueryParameters } from '../utils/parse-utils';\n\nimport { handleAdaptiveProcessing } from './handlers/handleAdaptiveProcessing';\nimport { handleApiRequest } from './handlers/handleApiRequest';\nimport { handleDirectUrlAccess } from './handlers/handleDirectUrlAccess';\nimport { handleExternalInternalPaths } from './handlers/handleExternalInternalPaths';\nimport { handleResponsivePaths } from './handlers/handleResponsivePaths';\nimport { getTokensFromServer } from './handlers/handleTokensFromServer';\n\nexport const processDspMiddleware = async (request: NextRequest, config?: MiddlewareConfig): Promise<NextResponse> => {\n const { pathname } = request.nextUrl;\n\n // 0. 정적 자원 체크(Skip)\n if (isStaticAsset(pathname)) {\n return NextResponse.next();\n }\n\n console.log(`[DSP Middleware] 처리 시작:: ${request.url}`);\n console.log(`[DSP Middleware] pathname:: ${pathname}`);\n console.log('[DSP Middleware] hostname:: ', new URL(request.url).hostname);\n\n // 1. 토큰 받기 (임시토큰만 있으면)\n let tokens;\n try {\n const tokensResponse = await getTokensFromServer(request, parseQueryParameters(request).tempToken);\n tokens = tokensResponse?.data;\n } catch (error) {\n // 토큰 없이 계속 진행\n console.error(`[DSP Middleware] 토큰 획득 실패:: ${pathname}`, error);\n tokens = null;\n }\n\n // 2. API 요청 처리(by pass)\n const apiResponse = await handleApiRequest(request);\n if (apiResponse) {\n console.log(`[DSP Middleware] API 요청 pathname:: ${pathname}`);\n\n return apiResponse;\n }\n\n // 3. 외부/내부 경로 처리\n const externalInternalResponse = handleExternalInternalPaths(request, { cookieData: { tokens } });\n if (externalInternalResponse) {\n console.log(`[DSP Middleware] External/Internal 경로로 처리:: ${pathname}`);\n\n return externalInternalResponse;\n }\n\n // 4. 직접 적응형 URL 접근 처리\n const directUrlResponse = handleDirectUrlAccess(request, { cookieData: { tokens } });\n if (directUrlResponse) {\n console.log(`[DSP Middleware] 직접 URL 접근으로 처리:: ${pathname}`);\n\n return directUrlResponse;\n }\n\n // 5. 반응형 전용 경로 처리\n const responsivePathResponse = handleResponsivePaths(request, {\n cookieData: { tokens },\n responsivePaths: config?.responsivePaths\n });\n if (responsivePathResponse) {\n console.log(`[DSP Middleware] 반응형 경로로 처리:: ${pathname}`);\n\n return responsivePathResponse;\n }\n\n // 6. 적응형 경로 처리\n const adaptiveResponse = handleAdaptiveProcessing(request, { cookieData: { tokens } });\n if (adaptiveResponse) {\n return adaptiveResponse;\n }\n\n // 모든 핸들러가 null을 반환하면 기본 처리\n return NextResponse.next();\n};\n","import { NextRequest, NextResponse } from 'next/server';\n\nimport { MiddlewareHandler, MiddlewareConfig } from '../../server-side-helper.types';\n\n/**\n * 미들웨어 조립 함수\n * @param handlers\n * @param config\n * @returns\n */\nexport const createMiddleware = (handlers: MiddlewareHandler[], config?: MiddlewareConfig) => {\n return (request: NextRequest): NextResponse => {\n // 핸들러들을 순서대로 실행\n for (const handler of handlers) {\n const result = handler(request, config);\n if (result) {\n return result; // 첫 번째로 처리된 결과 반환\n }\n }\n\n // 모든 핸들러가 null을 반환하면 기본 처리\n return NextResponse.next();\n };\n};\n"]}
@@ -1,5 +1,6 @@
1
1
  import { NextRequest, NextResponse } from 'next/server';
2
- import { M as MiddlewareConfig, a as MiddlewareHandler } from '../server-side-helper.types-Cp3VfyqT.cjs';
2
+ import { M as MiddlewareConfig, a as MiddlewareHandler } from '../server-side-helper.types-DBOErcVd.cjs';
3
+ import 'sales-frontend-api/middleware';
3
4
 
4
5
  declare const processDspMiddleware: (request: NextRequest, config?: MiddlewareConfig) => Promise<NextResponse>;
5
6
 
@@ -27,7 +28,7 @@ declare const handleAdaptiveProcessing: MiddlewareHandler;
27
28
  * @param request
28
29
  * @returns
29
30
  */
30
- declare const handleApiRequest: MiddlewareHandler;
31
+ declare const handleApiRequest: (request: NextRequest) => Promise<NextResponse | null>;
31
32
 
32
33
  /**
33
34
  * 직접 URL 접근 처리
@@ -1,5 +1,6 @@
1
1
  import { NextRequest, NextResponse } from 'next/server';
2
- import { M as MiddlewareConfig, a as MiddlewareHandler } from '../server-side-helper.types-Cp3VfyqT.js';
2
+ import { M as MiddlewareConfig, a as MiddlewareHandler } from '../server-side-helper.types-DBOErcVd.js';
3
+ import 'sales-frontend-api/middleware';
3
4
 
4
5
  declare const processDspMiddleware: (request: NextRequest, config?: MiddlewareConfig) => Promise<NextResponse>;
5
6
 
@@ -27,7 +28,7 @@ declare const handleAdaptiveProcessing: MiddlewareHandler;
27
28
  * @param request
28
29
  * @returns
29
30
  */
30
- declare const handleApiRequest: MiddlewareHandler;
31
+ declare const handleApiRequest: (request: NextRequest) => Promise<NextResponse | null>;
31
32
 
32
33
  /**
33
34
  * 직접 URL 접근 처리