Files
Gnuboard7/plugins/_bundled/sirsoft-pay_nicepayments/resources/js/guestOrderToken.ts
T
HeuJung 9cf9c3ff8c fix(core,board,ecommerce,payments,basic): KVE-2026 보안 게이트 6묶음 + 자격증명 전송로 정합
KISA 제보 취약점(KVE-2026-1914/1919/2019/2029/2041/2042/2043/2044)과
그 수정 과정에서 드러난 자격증명 전송로 결함을 함께 해소한다.

globalHeaders 는 데이터소스와 apiCall 핸들러에만 적용되는데, 코어 ApiClient 를
직접 부르는 경로들이 그 사실을 모른 채 게이트된 엔드포인트를 호출하고 있었다.
서버는 정당한 사용자를 거부하고 화면은 이미 버튼을 내준 뒤라, 예외도 로그도 없이
그 자리만 비는 형태로만 드러났다. 전송로 10축을 전수 열거해 6건을 고치고,
같은 실수가 반복되지 않도록 규정과 coverage 에 등재했다.

아웃바운드 프록시가 사이트 자기 자신으로 가는 내부 요청까지 가로채 저장이 수십 초씩
걸리던 문제도 함께 고쳤다. 실패가 폴백으로 삼켜져 화면에는 지연으로만 나타났다.
2026-09-06 00:42:29 +09:00

63 lines
2.0 KiB
TypeScript

/**
* 비회원 주문 조회 토큰 확보 (플러그인 공용)
*
* 비회원 주문의 영수증·결제수단 정보는 서버가 `X-Guest-Order-Token` 으로 소유자를
* 확인한다. 이 토큰을 싣지 않으면 서버는 그 주문을 찾을 수 없다고 응답하므로,
* 비회원 손님에게는 영수증 버튼이 아예 나타나지 않는다 — 예외도 콘솔 오류도 남지
* 않아 운영자가 원인을 알 수 없다.
*
* 코어 storageHandlers 가 sessionStorage 에 저장하며, 그 접근이 막힌 환경
* (프라이빗 창·iframe)을 위해 전역 상태 폴백을 함께 본다.
*/
/**
* 회원 인증 토큰을 돌려줍니다.
*
* @return 토큰 또는 null
*/
export function getAuthToken(): string | null {
return localStorage.getItem('auth_token');
}
/**
* 비회원 주문 조회 토큰을 돌려줍니다.
*
* @return 토큰 또는 null
*/
export function getGuestOrderToken(): string | null {
try {
const sessionToken = sessionStorage.getItem('g7_guest_order_token');
if (sessionToken) return sessionToken;
} catch {
// sessionStorage 접근 불가 환경 — 전역 상태 폴백으로 진행
}
const globalToken = (window as any).G7Core?.state?.get?.('_global')?.guestOrderToken;
return typeof globalToken === 'string' && globalToken !== '' ? globalToken : null;
}
/**
* 주문 조회 요청 헤더를 만듭니다. 회원 토큰을 우선하고, 없으면 비회원 토큰을 씁니다.
*
* @return 헤더 객체. 둘 다 없으면 null (호출 자체를 하지 않아야 함)
*/
export function buildOrderRequestHeaders(): Record<string, string> | null {
const authToken = getAuthToken();
const guestToken = getGuestOrderToken();
if (!authToken && !guestToken) {
return null;
}
const headers: Record<string, string> = { Accept: 'application/json' };
if (authToken) {
headers.Authorization = `Bearer ${authToken}`;
} else if (guestToken) {
headers['X-Guest-Order-Token'] = guestToken;
}
return headers;
}