const https = require("https");
여기 아주 간단한 코드가 있다.
Node.js 에서 Axios를 통해 특정 Site URL에 request를 송신 후, 응답을 받아오는 코드이다.
# hosts 를 통해 127.0.0.1 을 local.dev.kr 로 매핑해둔 상태
const axios = require("axios");
const axiosOption = {
timeout: 4000,
headers: {
"User-Agent": "Chrome",
},
};
const instance = axios.create(axiosOption);
instance.get("http://local.dev.kr").then((res) => { })
별거 아닌 코드인데도 불구하고 바로 에러를 뱉어주신다.
에러코드
AxiosError: write EPROTO 4864335056:error:100000f7:SSL routines:OPENSSL_internal:WRONG_VERSION_NUMBER:../../third_party/boringssl/src/ssl/tls_record.cc:231:
at AxiosError.from (/Users/shinbc89/doctorworks/dwaidata-client/node_modules/axios/dist/node/axios.cjs:829:14)
at RedirectableRequest.handleRequestError (/Users/shinbc89/doctorworks/dwaidata-client/node_modules/axios/dist/node/axios.cjs:2975:25)
at RedirectableRequest.emit (node:events:525:35)
at eventHandlers.<computed> (/Users/shinbc89/doctorworks/dwaidata-client/node_modules/follow-redirects/index.js:14:24)
at ClientRequest.emit (node:events:513:28)
at TLSSocket.socketErrorListener (node:_http_client:502:9)
at TLSSocket.emit (node:events:513:28)
at emitErrorNT (node:internal/streams/destroy:151:8)
at emitErrorCloseNT (node:internal/streams/destroy:116:3)
at process.processTicksAndRejections (node:internal/process/task_queues:82:21) {
syscall: 'write',
code: 'EPROTO',
errno: -100,
config: {
transitional: {
silentJSONParsing: true,
forcedJSONParsing: true,
clarifyTimeoutError: false
},
이 오류는 HTTPS 요청 시 SSL 버전이 맞지 않아 발생하는 것으로 보이는데
이를 해결하기 위해 다음과 같은 방법들을 시도해 볼 수 있겠지만, 내가 해결했던 방안은 아래와 같다.
반응형
해결방안
Axios에서 SSL 쪽 rejectUnauthorized 속성을 false로 설정.
해당 부분은 http 그것도, 로컬에서 테스트할때만 사용되기 때문에 protocol에 따라 분기처리를 하였다.
const axios = require("axios");
const https = require("https"); // ---------- 추가
const axiosOption = {
timeout: 4000,
headers: {
"User-Agent": "Chrome",
Accept: "text/html",
},
};
const url = "http://local.dev.kr";
const protocol = url.includes("https://") ? "https" : "http"
// -------------- 코드 추가 START
if (protocol === "http") {
axiosOption.httpsAgent = new https.Agent({ rejectUnauthorized: false });
}
// -------------- 코드 추가 END
const instance = axios.create(axiosOption);
instance.get("http://local.dev.kr").then((res) => { })
반응형