배경, 원인과 해결방안을 찾기까지의 과정은 이전 포스팅 글에서 확인할 수 있다.
원인이 파악된 시점, 해결방안은 3가지 정도 고려할 수 있었다.
- 클라이언트 프로그램 실행이 되는 PC / 모바일 내 IPv6를 비활성화 처리
- Node.js 내 http/https Request 시 axios , request.js 내 family 설정
- 도메인 내 AAAA 레코드 추가 / Nginx Server Conf 파일 내 IPv6 호환 설정
1. 클라이언트 프로그램 실행이 되는 PC / 모바일 내 IPv6 를 비활성화 처리
위 방법은 클라이언트 프로그램을 실행하는 PC나 모바일에 직접 처리하는 방법으로, 검증을 위한 간단하게 확인할 수 있는 방법이므로 가볍게 설정하는 방법과 함께 빠르게 지나가도록 하자.
실제 고객들에게 일일히 이를 설정하라고 할 순 없는 노릇 아닌가?
윈도우에서는 아래와 같이 설정한다
본인이 사용하는 유선랜 ( 혹은 무선랜 ) 어댑터를 오른쪽 버튼 누른 후 [속성]
인터넷 프로토콜 버전 6(TCP/IPv6) 부분 체크 해제
맥에서는 아래와 같이 설정한다
IPv6 구성을 사진과 같이 링크-로컬 전용으로 변경하면 된다.
2. Node.js 내 http/https Request 시 axios , request.js 내 family 설정
fetch의 경우 브라우저에서 결정하여 처리하는 부분을 그대로 따르기에 설정법이 따로 없다고 확인되었지만, Axios 나 http/https request 등의 경우에는 설정이 가능한 것으로 확인되었다.
family를 4로 설정하는 경우 IPv4로 고정하여 요청한다는 뜻이고, 6으로 설정하는 경우 IPv6로 고정하여 요청한다는 뜻이다.
프로그래밍 코드 상에서 XHR(XML Http Request) 통신시 처리하므로 아무래도 1번보다는 확실한 방법이다.
이전 포스팅 글에서 사용한 예시코드를 가져와 family를 적용하는 방법은 아래와 같다.
// test.js
const https = require("https");
const url = "{URL 주소}";
const request = https.get(url, { timeout: 2000, family: 4 }, (response) => {
const { statusCode } = response;
if (statusCode === 200) {
console.log("통과");
} else {
console.log("안됨");
console.error(`에러 상태 코드: ${statusCode}`);
}
})
.on("error", (error) => {
console.error("요청 중 에러 발생:", error.message);
});
// 타임아웃 설정
request.setTimeout(2000, () => {
console.error("요청 시간 초과");
request.abort(); // 요청 취소
});
Axios 경우 아래와 같이 설정한다.
const axiosOption = {
baseURL: "{BASE URL}",
timeout: 4000, // 4초로 설정
headers: {
"User-Agent": "Chrome",
Accept: "text/html",
},
family: 4,
};
// 설정이 적용된 axios instance
const instance = axios.create(axiosOption);
instance.get("{BASE URL}").then(() => {
// 정상
})
.catch((error) => {
// 에러
console.log(error);
});
( 대략적인 예시일뿐, 실제 사용 시에는 좀 더 다양한 옵션들을 사용하는 게 좋다.)
3. 도메인 내 AAAA 레코드 추가 / Nginx Server Conf 파일 내 IPv6 호환 설정
가장 이상적인 방법이지만, 내 경우에는 적용하지 못한 방법이다. 이유는 차차 설명하도록 하겠다.
Nginx에 IPv6를 설정하는 법은 단순하다.
아래는 일반적으로 설정하는 server conf 파일이다.
80과 443 , http와 https에 대해 응답하고 server name으로 요청을 받아 처리해주고 있다.
자세한 전체 설명은 스킵하도록 하고 단순하게 보면 listen 80 / listen 443 ssl 부분은 어떤 포트로 듣는지 설정하는 부분인데
IPv6로 설정하는 법은 단순히 listen 80; 을 listen [::]:80; 으로 변경하면 된다. SSL 쪽도 마찬가지로 진행한다는 가정하에 아래와 같이 설정할 수 있다.
이후에 systemctl reload nginx 명령어를 쉘에 명령어를 날려주어 적용해주도록 하자.
자 이제 남은건 도메인 AAAA 레코드 설정이다.
간단하게 보면 A 레코드는 IPv4 기반 대응이고, AAAA 레코드는 IPv6 대응인데 여기서 이슈가 발생했다.
내가 보유하고 있는 도메인의 도메인 업체에서 AAAA 레코드 설정이 불가한 것으로 확인했다.
상담원과 이야기를 해본 결과, 국내 도메인업체 G사에서는 IPv6를 아직 많이 사용하지 않으므로 설정이 불필요하다고 판단하여 굳이 서비스를 제공하지 않는다는 것이다. 같은 이유인지는 모르겠지만 유명 국내 도메인업체 C사 등등도 없는 건 마찬가지였다.
반면 Google Doamin은 가능한걸 확인할 수 있었다.. 갓구글... (이번 기회에 해외 도메인업체로 옮겨야겠다는 생각이 들었다.)
도메인에서 AAAA 레코드를 처리해주지 않으면 아무리 Nginx에서 처리한다한들 결국 404 페이지가 뜰 수밖에 없을 것이다.
도메인 업체를 변경하지 않는 이상 3번 방법은 더 이상 진행이 불가능했다.
선택
어쩔 수 없이 결국 도메인 부분에 막혀, 방법 2로 적용할 수밖에 없었다.
가장 이상적인 방법은 3번이 맞지만, 최선이라 판단된 2번 방안을 선택 후 진행하여 이슈를 해결하였다.
위 방안들이 정답일 수 도 있지만, 정답이 아닐 수도 있다. 분명 더 좋은 방안이 있을 것이고, 지금 없다면 추후에 더 좋은 방안이 나올지도 모른다.
이후에 더 좋은 방안이 나온다면 잊지 말고 수정하기 위해 해당 글을 남긴다.
'이슈' 카테고리의 다른 글
D보험사 -> S보험사로 자동차보험을 변경한 이유 (0) | 2023.09.15 |
---|---|
Mac OS 파이썬 한글 인식 문제 (한글 깨짐) (0) | 2023.09.08 |
인텔리J ultimate 버전 스크립트 코드 분석 비활성화 (0) | 2023.09.07 |
통신사 테더링 후 Node.js 프로그램 내 Request 안되는 이슈 (1/2) (0) | 2023.08.23 |