KISA 제보 취약점(KVE-2026-1914/1919/2019/2029/2041/2042/2043/2044)과 그 수정 과정에서 드러난 자격증명 전송로 결함을 함께 해소한다. globalHeaders 는 데이터소스와 apiCall 핸들러에만 적용되는데, 코어 ApiClient 를 직접 부르는 경로들이 그 사실을 모른 채 게이트된 엔드포인트를 호출하고 있었다. 서버는 정당한 사용자를 거부하고 화면은 이미 버튼을 내준 뒤라, 예외도 로그도 없이 그 자리만 비는 형태로만 드러났다. 전송로 10축을 전수 열거해 6건을 고치고, 같은 실수가 반복되지 않도록 규정과 coverage 에 등재했다. 아웃바운드 프록시가 사이트 자기 자신으로 가는 내부 요청까지 가로채 저장이 수십 초씩 걸리던 문제도 함께 고쳤다. 실패가 폴백으로 삼켜져 화면에는 지연으로만 나타났다.
63 lines
2.0 KiB
TypeScript
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;
|
|
}
|