sales-frontend-server-side-helper 0.0.9 → 0.0.11
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.
- package/dist/api-route/index.cjs +150 -4
- package/dist/api-route/index.cjs.map +1 -1
- package/dist/api-route/index.d.cts +39 -1
- package/dist/api-route/index.d.ts +39 -1
- package/dist/api-route/index.js +149 -4
- package/dist/api-route/index.js.map +1 -1
- package/dist/config/index.cjs +16 -0
- package/dist/config/index.cjs.map +1 -0
- package/dist/config/index.d.cts +5 -0
- package/dist/config/index.d.ts +5 -0
- package/dist/config/index.js +14 -0
- package/dist/config/index.js.map +1 -0
- package/dist/middleware/index.cjs +247 -4
- package/dist/middleware/index.cjs.map +1 -1
- package/dist/middleware/index.d.cts +61 -2
- package/dist/middleware/index.d.ts +61 -2
- package/dist/middleware/index.js +241 -4
- package/dist/middleware/index.js.map +1 -1
- package/dist/server-side-helper.types-Cp3VfyqT.d.cts +52 -0
- package/dist/server-side-helper.types-Cp3VfyqT.d.ts +52 -0
- package/dist/utils/index.cjs +144 -0
- package/dist/utils/index.cjs.map +1 -0
- package/dist/utils/index.d.cts +60 -0
- package/dist/utils/index.d.ts +60 -0
- package/dist/utils/index.js +135 -0
- package/dist/utils/index.js.map +1 -0
- package/package.json +20 -10
- package/dist/api-route/something.cjs +0 -10
- package/dist/api-route/something.cjs.map +0 -1
- package/dist/api-route/something.d.cts +0 -3
- package/dist/api-route/something.d.ts +0 -3
- package/dist/api-route/something.js +0 -8
- package/dist/api-route/something.js.map +0 -1
- package/dist/common/cookie.cjs +0 -11
- package/dist/common/cookie.cjs.map +0 -1
- package/dist/common/cookie.d.cts +0 -9
- package/dist/common/cookie.d.ts +0 -9
- package/dist/common/cookie.js +0 -9
- package/dist/common/cookie.js.map +0 -1
- package/dist/common/index.cjs +0 -11
- package/dist/common/index.cjs.map +0 -1
- package/dist/common/index.d.cts +0 -2
- package/dist/common/index.d.ts +0 -2
- package/dist/common/index.js +0 -9
- package/dist/common/index.js.map +0 -1
- package/dist/middleware/sample.cjs +0 -13
- package/dist/middleware/sample.cjs.map +0 -1
- package/dist/middleware/sample.d.cts +0 -5
- package/dist/middleware/sample.d.ts +0 -5
- package/dist/middleware/sample.js +0 -11
- package/dist/middleware/sample.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/middleware/sample.ts"],"names":[],"mappings":";;;AAEO,IAAM,WAAW,MAAM;AAC5B,EAAM,MAAA,QAAA,GAAW,aAAa,IAAK,EAAA;AAEnC,EAAO,OAAA,QAAA;AACT","file":"index.js","sourcesContent":["import { NextResponse } from 'next/server';\n\nexport const doSample = () => {\n const response = NextResponse.next();\n\n return response;\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/dsp-middleware.ts","../../src/middleware/handlers/createMiddleware.ts"],"names":["NextResponse"],"mappings":"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","file":"index.js","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('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 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//! 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 return Promise.resolve({\n isSuccess: true,\n code: 'string',\n message: 'string',\n data: {\n tokenType: 'Bearer',\n accessToken: 'accessToken-string1234',\n refreshToken: 'refreshToken-string1234',\n expiresIn: 0\n }\n });\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 // 토큰타입\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 === 'local' || environment === 'dev') {\n return {\n ...COOKIE_DEFAULT_CONFIG,\n httpOnly: false,\n secure: false\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 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 } 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. 토큰 받기 (임시토큰만 있으면)\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 // 1. API 요청 처리\n const apiResponse = handleApiRequest(request);\n if (apiResponse) {\n console.log(`[DSP Middleware] API 요청:: ${pathname}`);\n\n return apiResponse;\n }\n\n // 2. 외부/내부 경로 처리\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 // 3. 직접 적응형 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 // 4. 반응형 전용 경로 처리\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 // 5. 적응형 경로 처리\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"]}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { NextRequest, NextResponse } from 'next/server';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* 각 처리 로직을 독립적인 함수화
|
|
5
|
+
*/
|
|
6
|
+
type MiddlewareHandler = (request: NextRequest, config?: MiddlewareConfig) => NextResponse | null;
|
|
7
|
+
interface RefreshTokensOptions {
|
|
8
|
+
/** 강제 API 호스트명 (테스트 환경 등에서 사용) */
|
|
9
|
+
forceApiHostName?: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* 미들웨어 설정 타입
|
|
13
|
+
*/
|
|
14
|
+
interface MiddlewareConfig {
|
|
15
|
+
/** 반응형 적용 pathname */
|
|
16
|
+
responsivePaths?: string[];
|
|
17
|
+
/** 쿠키 생성 데이타 */
|
|
18
|
+
cookieData?: CookieData;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* 쿠키 데이터 타입
|
|
22
|
+
*/
|
|
23
|
+
interface CookieData {
|
|
24
|
+
tokens?: DspTokenResponseDto | null;
|
|
25
|
+
formFactor?: string | null;
|
|
26
|
+
}
|
|
27
|
+
interface DspTokenResponseDto {
|
|
28
|
+
tokenType: string;
|
|
29
|
+
accessToken: string;
|
|
30
|
+
refreshToken: string;
|
|
31
|
+
expiresIn: number;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* 토큰 관련 응답 타입
|
|
35
|
+
*/
|
|
36
|
+
interface DspResponseDspTokenResponseDto {
|
|
37
|
+
isSuccess: boolean;
|
|
38
|
+
code: string;
|
|
39
|
+
message: string;
|
|
40
|
+
data?: DspTokenResponseDto;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* API 에러 응답 타입
|
|
44
|
+
*/
|
|
45
|
+
interface ApiErrorResponse {
|
|
46
|
+
isSuccess: false;
|
|
47
|
+
code: string;
|
|
48
|
+
message: string;
|
|
49
|
+
data: null;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export type { ApiErrorResponse as A, CookieData as C, DspResponseDspTokenResponseDto as D, MiddlewareConfig as M, RefreshTokensOptions as R, MiddlewareHandler as a };
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { NextRequest, NextResponse } from 'next/server';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* 각 처리 로직을 독립적인 함수화
|
|
5
|
+
*/
|
|
6
|
+
type MiddlewareHandler = (request: NextRequest, config?: MiddlewareConfig) => NextResponse | null;
|
|
7
|
+
interface RefreshTokensOptions {
|
|
8
|
+
/** 강제 API 호스트명 (테스트 환경 등에서 사용) */
|
|
9
|
+
forceApiHostName?: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* 미들웨어 설정 타입
|
|
13
|
+
*/
|
|
14
|
+
interface MiddlewareConfig {
|
|
15
|
+
/** 반응형 적용 pathname */
|
|
16
|
+
responsivePaths?: string[];
|
|
17
|
+
/** 쿠키 생성 데이타 */
|
|
18
|
+
cookieData?: CookieData;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* 쿠키 데이터 타입
|
|
22
|
+
*/
|
|
23
|
+
interface CookieData {
|
|
24
|
+
tokens?: DspTokenResponseDto | null;
|
|
25
|
+
formFactor?: string | null;
|
|
26
|
+
}
|
|
27
|
+
interface DspTokenResponseDto {
|
|
28
|
+
tokenType: string;
|
|
29
|
+
accessToken: string;
|
|
30
|
+
refreshToken: string;
|
|
31
|
+
expiresIn: number;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* 토큰 관련 응답 타입
|
|
35
|
+
*/
|
|
36
|
+
interface DspResponseDspTokenResponseDto {
|
|
37
|
+
isSuccess: boolean;
|
|
38
|
+
code: string;
|
|
39
|
+
message: string;
|
|
40
|
+
data?: DspTokenResponseDto;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* API 에러 응답 타입
|
|
44
|
+
*/
|
|
45
|
+
interface ApiErrorResponse {
|
|
46
|
+
isSuccess: false;
|
|
47
|
+
code: string;
|
|
48
|
+
message: string;
|
|
49
|
+
data: null;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export type { ApiErrorResponse as A, CookieData as C, DspResponseDspTokenResponseDto as D, MiddlewareConfig as M, RefreshTokensOptions as R, MiddlewareHandler as a };
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var salesFrontendUtils = require('sales-frontend-utils');
|
|
4
|
+
|
|
5
|
+
// src/utils/cookie-utils.ts
|
|
6
|
+
|
|
7
|
+
// src/config/cookie-config.ts
|
|
8
|
+
var COOKIE_DEFAULT_CONFIG = {
|
|
9
|
+
httpOnly: true,
|
|
10
|
+
maxAge: 60 * 60 * 24,
|
|
11
|
+
sameSite: "strict",
|
|
12
|
+
secure: true
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
// src/utils/cookie-utils.ts
|
|
16
|
+
var createResponseWithCookies = (response, request, cookieData) => {
|
|
17
|
+
const { hostname } = new URL(request.url);
|
|
18
|
+
if (cookieData?.tokens?.tokenType) {
|
|
19
|
+
response.cookies.set({
|
|
20
|
+
name: "tokenType",
|
|
21
|
+
value: cookieData.tokens.tokenType,
|
|
22
|
+
...getDefaultCookieConfig(hostname)
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
if (cookieData?.tokens?.expiresIn) {
|
|
26
|
+
response.cookies.set({
|
|
27
|
+
name: "expiresIn",
|
|
28
|
+
value: String(cookieData.tokens.expiresIn),
|
|
29
|
+
...getDefaultCookieConfig(hostname)
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
if (cookieData?.tokens?.accessToken) {
|
|
33
|
+
response.cookies.set({
|
|
34
|
+
name: "accessToken",
|
|
35
|
+
value: cookieData.tokens.accessToken,
|
|
36
|
+
...getDefaultCookieConfig(hostname)
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
if (cookieData?.tokens?.refreshToken) {
|
|
40
|
+
response.cookies.set({
|
|
41
|
+
name: "refreshToken",
|
|
42
|
+
value: cookieData.tokens.refreshToken,
|
|
43
|
+
...getDefaultCookieConfig(hostname)
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
if (cookieData?.formFactor) {
|
|
47
|
+
response.cookies.set({
|
|
48
|
+
name: "formFactor",
|
|
49
|
+
value: cookieData.formFactor,
|
|
50
|
+
...getDefaultCookieConfig(hostname),
|
|
51
|
+
maxAge: 0
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
return response;
|
|
55
|
+
};
|
|
56
|
+
var getDefaultCookieConfig = (hostname) => {
|
|
57
|
+
const environment = salesFrontendUtils.getEnvironmentFromHostname(hostname);
|
|
58
|
+
if (environment === "local" || environment === "dev") {
|
|
59
|
+
return {
|
|
60
|
+
...COOKIE_DEFAULT_CONFIG,
|
|
61
|
+
httpOnly: false,
|
|
62
|
+
secure: false
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
return COOKIE_DEFAULT_CONFIG;
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
// src/utils/parse-utils.ts
|
|
69
|
+
var parseRequestHeaders = (request) => {
|
|
70
|
+
return {
|
|
71
|
+
formFactor: request.headers.get("FormFactor")
|
|
72
|
+
};
|
|
73
|
+
};
|
|
74
|
+
var parseQueryParameters = (request) => {
|
|
75
|
+
const { searchParams } = request.nextUrl;
|
|
76
|
+
return {
|
|
77
|
+
tempToken: searchParams.get("tempToken")
|
|
78
|
+
};
|
|
79
|
+
};
|
|
80
|
+
var parseCookies = (request) => {
|
|
81
|
+
return {
|
|
82
|
+
formFactor: request.cookies.get("formFactor")?.value,
|
|
83
|
+
accessToken: request.cookies.get("accessToken")?.value
|
|
84
|
+
};
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
// src/utils/middleware-utils.ts
|
|
88
|
+
var convertAdaptiveTargetPath = (pathname, formFactor) => {
|
|
89
|
+
switch (formFactor) {
|
|
90
|
+
case "tablet":
|
|
91
|
+
return `/tablet${pathname}`;
|
|
92
|
+
case "phone":
|
|
93
|
+
case "smartphone":
|
|
94
|
+
return `/mobile${pathname}`;
|
|
95
|
+
case "desktop":
|
|
96
|
+
default:
|
|
97
|
+
return `/pc${pathname}`;
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
var getFormFactor = (request) => {
|
|
101
|
+
const userAgent = request.headers.get("user-agent") || "";
|
|
102
|
+
const headerValue = parseRequestHeaders(request).formFactor;
|
|
103
|
+
if (headerValue) {
|
|
104
|
+
return headerValue;
|
|
105
|
+
}
|
|
106
|
+
const cookieValue = parseCookies(request).formFactor;
|
|
107
|
+
if (cookieValue) {
|
|
108
|
+
return cookieValue;
|
|
109
|
+
}
|
|
110
|
+
return salesFrontendUtils.getFormFactorFromUserAgent(userAgent);
|
|
111
|
+
};
|
|
112
|
+
var isResponsivePath = (pathname, responsivePaths = []) => {
|
|
113
|
+
return responsivePaths.some((path) => pathname.startsWith(path));
|
|
114
|
+
};
|
|
115
|
+
var getTokensFromServer = async (request, tempToken) => {
|
|
116
|
+
const { accessToken } = parseCookies(request);
|
|
117
|
+
if (accessToken || !tempToken) {
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
console.log(`[DSP Middleware] \uC784\uC2DC \uD1A0\uD070 \uCC98\uB9AC:: ${tempToken ? "\uC788\uC74C" : "\uC5C6\uC74C"}`);
|
|
121
|
+
return Promise.resolve({
|
|
122
|
+
isSuccess: true,
|
|
123
|
+
code: "string",
|
|
124
|
+
message: "string",
|
|
125
|
+
data: {
|
|
126
|
+
tokenType: "Bearer",
|
|
127
|
+
accessToken: "accessToken-string1234",
|
|
128
|
+
refreshToken: "refreshToken-string1234",
|
|
129
|
+
expiresIn: 0
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
};
|
|
133
|
+
//! test
|
|
134
|
+
|
|
135
|
+
exports.convertAdaptiveTargetPath = convertAdaptiveTargetPath;
|
|
136
|
+
exports.createResponseWithCookies = createResponseWithCookies;
|
|
137
|
+
exports.getFormFactor = getFormFactor;
|
|
138
|
+
exports.getTokensFromServer = getTokensFromServer;
|
|
139
|
+
exports.isResponsivePath = isResponsivePath;
|
|
140
|
+
exports.parseCookies = parseCookies;
|
|
141
|
+
exports.parseQueryParameters = parseQueryParameters;
|
|
142
|
+
exports.parseRequestHeaders = parseRequestHeaders;
|
|
143
|
+
//# sourceMappingURL=index.cjs.map
|
|
144
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/config/cookie-config.ts","../../src/utils/cookie-utils.ts","../../src/utils/parse-utils.ts","../../src/utils/middleware-utils.ts"],"names":["getEnvironmentFromHostname","getFormFactorFromUserAgent"],"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 // 토큰타입\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 === 'local' || environment === 'dev') {\n return {\n ...COOKIE_DEFAULT_CONFIG,\n httpOnly: false,\n secure: false\n };\n }\n\n return COOKIE_DEFAULT_CONFIG;\n};\n","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('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 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//! 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 return Promise.resolve({\n isSuccess: true,\n code: 'string',\n message: 'string',\n data: {\n tokenType: 'Bearer',\n accessToken: 'accessToken-string1234',\n refreshToken: 'refreshToken-string1234',\n expiresIn: 0\n }\n });\n};\n"]}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { NextResponse, NextRequest } from 'next/server';
|
|
2
|
+
import { C as CookieData, D as DspResponseDspTokenResponseDto } from '../server-side-helper.types-Cp3VfyqT.cjs';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* 쿠키 생성
|
|
6
|
+
* @param response
|
|
7
|
+
* @param cookieData
|
|
8
|
+
* @returns
|
|
9
|
+
*/
|
|
10
|
+
declare const createResponseWithCookies: (response: NextResponse, request: NextRequest, cookieData?: CookieData) => NextResponse;
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* FormFactor에 따른 적응형 경로 변환
|
|
14
|
+
* @param pathname
|
|
15
|
+
* @param formFactor
|
|
16
|
+
* @returns
|
|
17
|
+
*/
|
|
18
|
+
declare const convertAdaptiveTargetPath: (pathname: string, formFactor: string) => string;
|
|
19
|
+
/**
|
|
20
|
+
* FormFactor 구하기
|
|
21
|
+
* @param request
|
|
22
|
+
* @returns
|
|
23
|
+
*/
|
|
24
|
+
declare const getFormFactor: (request: NextRequest) => string;
|
|
25
|
+
/**
|
|
26
|
+
* 반응형 전용 pathname 판단
|
|
27
|
+
* @param pathname
|
|
28
|
+
* @param responsivePaths
|
|
29
|
+
* @returns
|
|
30
|
+
*/
|
|
31
|
+
declare const isResponsivePath: (pathname: string, responsivePaths?: string[]) => boolean;
|
|
32
|
+
declare const getTokensFromServer: (request: NextRequest, tempToken: string | null) => Promise<DspResponseDspTokenResponseDto | null>;
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* 요청 헤더에 값 파싱
|
|
36
|
+
* @param request
|
|
37
|
+
* @returns
|
|
38
|
+
*/
|
|
39
|
+
declare const parseRequestHeaders: (request: NextRequest) => {
|
|
40
|
+
formFactor: string | null;
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* 쿼리 스트링 값 파싱
|
|
44
|
+
* @param request
|
|
45
|
+
* @returns
|
|
46
|
+
*/
|
|
47
|
+
declare const parseQueryParameters: (request: NextRequest) => {
|
|
48
|
+
tempToken: string | null;
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* 요청 쿠키에 값 파싱
|
|
52
|
+
* @param request
|
|
53
|
+
* @returns
|
|
54
|
+
*/
|
|
55
|
+
declare const parseCookies: (request: NextRequest) => {
|
|
56
|
+
formFactor: string | undefined;
|
|
57
|
+
accessToken: string | undefined;
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
export { convertAdaptiveTargetPath, createResponseWithCookies, getFormFactor, getTokensFromServer, isResponsivePath, parseCookies, parseQueryParameters, parseRequestHeaders };
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { NextResponse, NextRequest } from 'next/server';
|
|
2
|
+
import { C as CookieData, D as DspResponseDspTokenResponseDto } from '../server-side-helper.types-Cp3VfyqT.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* 쿠키 생성
|
|
6
|
+
* @param response
|
|
7
|
+
* @param cookieData
|
|
8
|
+
* @returns
|
|
9
|
+
*/
|
|
10
|
+
declare const createResponseWithCookies: (response: NextResponse, request: NextRequest, cookieData?: CookieData) => NextResponse;
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* FormFactor에 따른 적응형 경로 변환
|
|
14
|
+
* @param pathname
|
|
15
|
+
* @param formFactor
|
|
16
|
+
* @returns
|
|
17
|
+
*/
|
|
18
|
+
declare const convertAdaptiveTargetPath: (pathname: string, formFactor: string) => string;
|
|
19
|
+
/**
|
|
20
|
+
* FormFactor 구하기
|
|
21
|
+
* @param request
|
|
22
|
+
* @returns
|
|
23
|
+
*/
|
|
24
|
+
declare const getFormFactor: (request: NextRequest) => string;
|
|
25
|
+
/**
|
|
26
|
+
* 반응형 전용 pathname 판단
|
|
27
|
+
* @param pathname
|
|
28
|
+
* @param responsivePaths
|
|
29
|
+
* @returns
|
|
30
|
+
*/
|
|
31
|
+
declare const isResponsivePath: (pathname: string, responsivePaths?: string[]) => boolean;
|
|
32
|
+
declare const getTokensFromServer: (request: NextRequest, tempToken: string | null) => Promise<DspResponseDspTokenResponseDto | null>;
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* 요청 헤더에 값 파싱
|
|
36
|
+
* @param request
|
|
37
|
+
* @returns
|
|
38
|
+
*/
|
|
39
|
+
declare const parseRequestHeaders: (request: NextRequest) => {
|
|
40
|
+
formFactor: string | null;
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* 쿼리 스트링 값 파싱
|
|
44
|
+
* @param request
|
|
45
|
+
* @returns
|
|
46
|
+
*/
|
|
47
|
+
declare const parseQueryParameters: (request: NextRequest) => {
|
|
48
|
+
tempToken: string | null;
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* 요청 쿠키에 값 파싱
|
|
52
|
+
* @param request
|
|
53
|
+
* @returns
|
|
54
|
+
*/
|
|
55
|
+
declare const parseCookies: (request: NextRequest) => {
|
|
56
|
+
formFactor: string | undefined;
|
|
57
|
+
accessToken: string | undefined;
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
export { convertAdaptiveTargetPath, createResponseWithCookies, getFormFactor, getTokensFromServer, isResponsivePath, parseCookies, parseQueryParameters, parseRequestHeaders };
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { getEnvironmentFromHostname, getFormFactorFromUserAgent } from 'sales-frontend-utils';
|
|
2
|
+
|
|
3
|
+
// src/utils/cookie-utils.ts
|
|
4
|
+
|
|
5
|
+
// src/config/cookie-config.ts
|
|
6
|
+
var COOKIE_DEFAULT_CONFIG = {
|
|
7
|
+
httpOnly: true,
|
|
8
|
+
maxAge: 60 * 60 * 24,
|
|
9
|
+
sameSite: "strict",
|
|
10
|
+
secure: true
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
// src/utils/cookie-utils.ts
|
|
14
|
+
var createResponseWithCookies = (response, request, cookieData) => {
|
|
15
|
+
const { hostname } = new URL(request.url);
|
|
16
|
+
if (cookieData?.tokens?.tokenType) {
|
|
17
|
+
response.cookies.set({
|
|
18
|
+
name: "tokenType",
|
|
19
|
+
value: cookieData.tokens.tokenType,
|
|
20
|
+
...getDefaultCookieConfig(hostname)
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
if (cookieData?.tokens?.expiresIn) {
|
|
24
|
+
response.cookies.set({
|
|
25
|
+
name: "expiresIn",
|
|
26
|
+
value: String(cookieData.tokens.expiresIn),
|
|
27
|
+
...getDefaultCookieConfig(hostname)
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
if (cookieData?.tokens?.accessToken) {
|
|
31
|
+
response.cookies.set({
|
|
32
|
+
name: "accessToken",
|
|
33
|
+
value: cookieData.tokens.accessToken,
|
|
34
|
+
...getDefaultCookieConfig(hostname)
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
if (cookieData?.tokens?.refreshToken) {
|
|
38
|
+
response.cookies.set({
|
|
39
|
+
name: "refreshToken",
|
|
40
|
+
value: cookieData.tokens.refreshToken,
|
|
41
|
+
...getDefaultCookieConfig(hostname)
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
if (cookieData?.formFactor) {
|
|
45
|
+
response.cookies.set({
|
|
46
|
+
name: "formFactor",
|
|
47
|
+
value: cookieData.formFactor,
|
|
48
|
+
...getDefaultCookieConfig(hostname),
|
|
49
|
+
maxAge: 0
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
return response;
|
|
53
|
+
};
|
|
54
|
+
var getDefaultCookieConfig = (hostname) => {
|
|
55
|
+
const environment = getEnvironmentFromHostname(hostname);
|
|
56
|
+
if (environment === "local" || environment === "dev") {
|
|
57
|
+
return {
|
|
58
|
+
...COOKIE_DEFAULT_CONFIG,
|
|
59
|
+
httpOnly: false,
|
|
60
|
+
secure: false
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
return COOKIE_DEFAULT_CONFIG;
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
// src/utils/parse-utils.ts
|
|
67
|
+
var parseRequestHeaders = (request) => {
|
|
68
|
+
return {
|
|
69
|
+
formFactor: request.headers.get("FormFactor")
|
|
70
|
+
};
|
|
71
|
+
};
|
|
72
|
+
var parseQueryParameters = (request) => {
|
|
73
|
+
const { searchParams } = request.nextUrl;
|
|
74
|
+
return {
|
|
75
|
+
tempToken: searchParams.get("tempToken")
|
|
76
|
+
};
|
|
77
|
+
};
|
|
78
|
+
var parseCookies = (request) => {
|
|
79
|
+
return {
|
|
80
|
+
formFactor: request.cookies.get("formFactor")?.value,
|
|
81
|
+
accessToken: request.cookies.get("accessToken")?.value
|
|
82
|
+
};
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
// src/utils/middleware-utils.ts
|
|
86
|
+
var convertAdaptiveTargetPath = (pathname, formFactor) => {
|
|
87
|
+
switch (formFactor) {
|
|
88
|
+
case "tablet":
|
|
89
|
+
return `/tablet${pathname}`;
|
|
90
|
+
case "phone":
|
|
91
|
+
case "smartphone":
|
|
92
|
+
return `/mobile${pathname}`;
|
|
93
|
+
case "desktop":
|
|
94
|
+
default:
|
|
95
|
+
return `/pc${pathname}`;
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
var getFormFactor = (request) => {
|
|
99
|
+
const userAgent = request.headers.get("user-agent") || "";
|
|
100
|
+
const headerValue = parseRequestHeaders(request).formFactor;
|
|
101
|
+
if (headerValue) {
|
|
102
|
+
return headerValue;
|
|
103
|
+
}
|
|
104
|
+
const cookieValue = parseCookies(request).formFactor;
|
|
105
|
+
if (cookieValue) {
|
|
106
|
+
return cookieValue;
|
|
107
|
+
}
|
|
108
|
+
return getFormFactorFromUserAgent(userAgent);
|
|
109
|
+
};
|
|
110
|
+
var isResponsivePath = (pathname, responsivePaths = []) => {
|
|
111
|
+
return responsivePaths.some((path) => pathname.startsWith(path));
|
|
112
|
+
};
|
|
113
|
+
var getTokensFromServer = async (request, tempToken) => {
|
|
114
|
+
const { accessToken } = parseCookies(request);
|
|
115
|
+
if (accessToken || !tempToken) {
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
console.log(`[DSP Middleware] \uC784\uC2DC \uD1A0\uD070 \uCC98\uB9AC:: ${tempToken ? "\uC788\uC74C" : "\uC5C6\uC74C"}`);
|
|
119
|
+
return Promise.resolve({
|
|
120
|
+
isSuccess: true,
|
|
121
|
+
code: "string",
|
|
122
|
+
message: "string",
|
|
123
|
+
data: {
|
|
124
|
+
tokenType: "Bearer",
|
|
125
|
+
accessToken: "accessToken-string1234",
|
|
126
|
+
refreshToken: "refreshToken-string1234",
|
|
127
|
+
expiresIn: 0
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
};
|
|
131
|
+
//! test
|
|
132
|
+
|
|
133
|
+
export { convertAdaptiveTargetPath, createResponseWithCookies, getFormFactor, getTokensFromServer, isResponsivePath, parseCookies, parseQueryParameters, parseRequestHeaders };
|
|
134
|
+
//# sourceMappingURL=index.js.map
|
|
135
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/config/cookie-config.ts","../../src/utils/cookie-utils.ts","../../src/utils/parse-utils.ts","../../src/utils/middleware-utils.ts"],"names":[],"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 // 토큰타입\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 === 'local' || environment === 'dev') {\n return {\n ...COOKIE_DEFAULT_CONFIG,\n httpOnly: false,\n secure: false\n };\n }\n\n return COOKIE_DEFAULT_CONFIG;\n};\n","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('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 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//! 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 return Promise.resolve({\n isSuccess: true,\n code: 'string',\n message: 'string',\n data: {\n tokenType: 'Bearer',\n accessToken: 'accessToken-string1234',\n refreshToken: 'refreshToken-string1234',\n expiresIn: 0\n }\n });\n};\n"]}
|
package/package.json
CHANGED
|
@@ -1,20 +1,30 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sales-frontend-server-side-helper",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.11",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"files": [
|
|
7
7
|
"dist"
|
|
8
8
|
],
|
|
9
9
|
"exports": {
|
|
10
|
-
"./
|
|
10
|
+
"./config": {
|
|
11
11
|
"import": {
|
|
12
|
-
"types": "./dist/
|
|
13
|
-
"default": "./dist/
|
|
12
|
+
"types": "./dist/config/index.d.ts",
|
|
13
|
+
"default": "./dist/config/index.js"
|
|
14
14
|
},
|
|
15
15
|
"require": {
|
|
16
|
-
"types": "./dist/
|
|
17
|
-
"default": "./dist/
|
|
16
|
+
"types": "./dist/utils/index.d.ts",
|
|
17
|
+
"default": "./dist/utils/index.cjs.js"
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
"./utils": {
|
|
21
|
+
"import": {
|
|
22
|
+
"types": "./dist/utils/index.d.ts",
|
|
23
|
+
"default": "./dist/utils/index.js"
|
|
24
|
+
},
|
|
25
|
+
"require": {
|
|
26
|
+
"types": "./dist/utils/index.d.ts",
|
|
27
|
+
"default": "./dist/utils/index.cjs.js"
|
|
18
28
|
}
|
|
19
29
|
},
|
|
20
30
|
"./middleware": {
|
|
@@ -40,18 +50,18 @@
|
|
|
40
50
|
},
|
|
41
51
|
"devDependencies": {
|
|
42
52
|
"@types/node": "^22.14.0",
|
|
43
|
-
"next": "^15.
|
|
53
|
+
"next": "^15.3.0",
|
|
44
54
|
"tsup": "^8.4.0",
|
|
45
55
|
"typescript": "5.8.2",
|
|
46
56
|
"sales-frontend-typescript-config": "0.0.2",
|
|
47
57
|
"eslint-config-sales-frontend-eslint-config-v8": "^0.0.6"
|
|
48
58
|
},
|
|
49
59
|
"peerDependencies": {
|
|
50
|
-
"next": ">=
|
|
60
|
+
"next": ">=15.3.0"
|
|
51
61
|
},
|
|
52
62
|
"dependencies": {
|
|
53
|
-
"sales-frontend-
|
|
54
|
-
"sales-frontend-
|
|
63
|
+
"sales-frontend-api": "0.0.28",
|
|
64
|
+
"sales-frontend-utils": "0.0.8"
|
|
55
65
|
},
|
|
56
66
|
"scripts": {
|
|
57
67
|
"lint": "eslint . --max-warnings 0",
|