diff --git a/backend-node/src/services/externalRestApiConnectionService.ts b/backend-node/src/services/externalRestApiConnectionService.ts index cee16dc0..668c07ae 100644 --- a/backend-node/src/services/externalRestApiConnectionService.ts +++ b/backend-node/src/services/externalRestApiConnectionService.ts @@ -607,12 +607,25 @@ export class ExternalRestApiConnectionService { } } - // HTTP 요청 실행 (배치관리 RestApiConnector와 동일하게 TLS 검증 우회 옵션 적용) + // HTTP 요청 실행 + // [인수인계 중요] 2024-11-27 추가 + // 특정 레거시/내부망 API(예: thiratis.com)의 경우 SSL 인증서 체인 문제로 인해 + // Node.js 레벨에서 검증 실패(UNABLE_TO_VERIFY_LEAF_SIGNATURE)가 발생합니다. + // + // 원래는 인프라(OS/Docker)에 루트 CA를 등록하는 것이 정석이나, + // 유지보수 및 설정 편의성을 위해 코드 레벨에서 '특정 도메인'에 한해서만 + // SSL 검증을 우회하도록 예외 처리를 해두었습니다. + // + // ※ 보안 주의: 여기에 모르는 도메인을 함부로 추가하면 중간자 공격(MITM)에 취약해질 수 있습니다. + // 꼭 필요한 신뢰할 수 있는 도메인만 추가하세요. + const bypassDomains = ["thiratis.com"]; + const shouldBypassTls = bypassDomains.some((domain) => + url.includes(domain) + ); + const httpsAgent = new https.Agent({ - // 배치관리와 동일하게, 일부 내부망/자체 서명 인증서를 사용하는 API를 위해 - // 인증서 검증을 비활성화한다. - // 공개 인터넷용 API에는 신중히 사용해야 함. - rejectUnauthorized: false, + // bypassDomains에 포함된 URL이면 검증을 무시(false), 아니면 정상 검증(true) + rejectUnauthorized: !shouldBypassTls, }); const requestConfig = {