✨ 배경
페이플 결제창(cpay.payple.kr)은 결제 완료 후 PCD_RST_URL(= POST /api/prompts/purchases/payple-result)로 브라우저 폼 POST를 보낸다. 이때 브라우저가 Origin: https://cpay.payple.kr 헤더를 함께 실어 보내는데, 현재 CORS 미들웨어는 화이트리스트 밖 origin 을 만나면
callback(new Error("Not allowed by CORS"));
로 에러를 throw 한다 → 라우터에 도달하기 전에 errorHandler 가 잡아 500 InternalServerError 응답. 결과적으로 결제는 성공했는데 프론트 프롬프트 상세 페이지로 리다이렉트되지 못하고 500 화면이 뜬다.
✨ 원인 (증상 아님)
cpay.payple.kr 가 화이트리스트에 없어서가 아니라, 미허용 origin 처리 방식이 잘못됨이 근본 원인이다.
- 폼 POST 리다이렉트는 top-level navigation 이라 애초에 CORS 헤더가 필요 없다. 화이트리스트에 추가해도 되지만 불필요하게 권한을 넓히는 것.
cors 패키지의 정석은 callback(null, false) — CORS 헤더만 빼고 요청은 그대로 통과시킨다. 브라우저는 여전히 응답을 읽지 못하므로 보안 수준은 동일하고, 서드파티가 보내는 브라우저 네비게이션/콜백이 500 으로 죽지 않는다.
- 현재 방식은 payple 뿐 아니라 화이트리스트 밖 모든 origin 요청을 500 으로 기록해 에러 로그도 오염시킨다.
✨ 개발 목록
✨ 기타
PURCHASE_RESULT_REDIRECT_URL 환경변수가 dev/prod 양쪽에 설정돼 있어야 리다이렉트가 동작한다 (미설정 시 200 OK 텍스트 응답).
- 화이트리스트에
https://cpay.payple.kr 를 추가하는 방식은 채택하지 않음 — 네비게이션에는 CORS 헤더가 필요 없고, 다른 PG/서드파티 콜백이 늘어날 때마다 같은 500 이 재발한다.
✨ 배경
페이플 결제창(
cpay.payple.kr)은 결제 완료 후PCD_RST_URL(=POST /api/prompts/purchases/payple-result)로 브라우저 폼 POST를 보낸다. 이때 브라우저가Origin: https://cpay.payple.kr헤더를 함께 실어 보내는데, 현재 CORS 미들웨어는 화이트리스트 밖 origin 을 만나면로 에러를 throw 한다 → 라우터에 도달하기 전에 errorHandler 가 잡아 500 InternalServerError 응답. 결과적으로 결제는 성공했는데 프론트 프롬프트 상세 페이지로 리다이렉트되지 못하고 500 화면이 뜬다.
✨ 원인 (증상 아님)
cpay.payple.kr가 화이트리스트에 없어서가 아니라, 미허용 origin 처리 방식이 잘못됨이 근본 원인이다.cors패키지의 정석은callback(null, false)— CORS 헤더만 빼고 요청은 그대로 통과시킨다. 브라우저는 여전히 응답을 읽지 못하므로 보안 수준은 동일하고, 서드파티가 보내는 브라우저 네비게이션/콜백이 500 으로 죽지 않는다.✨ 개발 목록
src/index.ts— cors origin 콜백을callback(null, allowed)형태로 변경 (throw 제거)pnpm build확인✨ 기타
PURCHASE_RESULT_REDIRECT_URL환경변수가 dev/prod 양쪽에 설정돼 있어야 리다이렉트가 동작한다 (미설정 시200 OK텍스트 응답).https://cpay.payple.kr를 추가하는 방식은 채택하지 않음 — 네비게이션에는 CORS 헤더가 필요 없고, 다른 PG/서드파티 콜백이 늘어날 때마다 같은 500 이 재발한다.