← 전체 글로 돌아가기

웹 개발

배포 후 네트워크 연결 확인

로컬에서는 잘 되는데 배포 후 API 호출이 실패하면, 네트워크 경로의 어디가 막혔는지 차례대로 확인해야 합니다.

로컬에서는 API가 잘 온다. 배포하니까 갑자기 연결 에러다. 방화벽? 네트워크? DNS?

먼저 배포 서버에서 테스트

브라우저나 모바일 앱이 아니라 서버 자신에서 API를 호출해본다.

# 배포 서버 터미널에 접속
ssh [email protected]

# 간단한 요청
curl https://api.example.com/health

# 상세한 정보
curl -v https://api.example.com/health

서버에서도 실패하면 방화벽이나 네트워크 설정 문제다. 앱이 제대로 요청을 보내지 못한다.

DNS 확인

DNS가 제대로 작동하는가?

# 도메인을 IP로 변환
dig api.example.com
nslookup api.example.com

# 특정 DNS 서버로 확인
dig @8.8.8.8 api.example.com

ANSWER SECTION에 IP가 나오면 DNS는 정상이다. 나오지 않으면 도메인이 등록되지 않았거나 DNS 설정이 잘못됐다.

네트워크 연결성 테스트

아예 서버가 외부와 통신할 수 없을 수 있다.

# 인터넷 연결 확인
ping 8.8.8.8

# 특정 호스트 접근
ping api.example.com

# 포트 연결
telnet api.example.com 443

# 또는
nc -zv api.example.com 443

telnet이 응답하면 포트가 열려 있다.

방화벽 규칙 확인

아웃바운드 트래픽을 차단했을 수 있다.

# UFW (Ubuntu 방화벽)
sudo ufw status
sudo ufw default allow outgoing

# iptables
sudo iptables -L -n

# 특정 포트 허용
sudo ufw allow out 443

앱의 환경 변수 확인

로컬과 배포 환경의 API URL이 다를 수 있다.

# 배포 서버에서 앱의 환경 변수 확인
echo $API_URL

# 또는 앱의 로그에서
tail -f /var/log/myapp.log | grep -i api

API 주소가 잘못되거나, 내부 주소로 설정되어 있을 수 있다.

// 나쁜 예: 로컬에서만 작동
const API_URL = 'http://localhost:8000';

// 낫다: 환경에 따라 다르게
const API_URL = process.env.API_URL || 'http://localhost:8000';

CORS 문제

Browser에서 CORS 에러가 나면, 서버의 CORS 설정이 잘못됐다.

# 응답 헤더 확인
curl -i https://api.example.com/data

# 특히 이 헤더를 본다
# Access-Control-Allow-Origin
# Access-Control-Allow-Credentials

배포 서버의 API 주소가 https://api.example.com이면, CORS 헤더에서 이 도메인을 허용해야 한다.

인증서 문제

HTTPS에서 인증서가 유효하지 않을 수 있다.

# 인증서 확인
openssl s_client -connect api.example.com:443

# 만료 확인
curl -v https://api.example.com 2>&1 | grep expire

자체 서명 인증서 (self-signed cert)를 쓰면, 앱에서 명시적으로 무시해야 한다.

// Node.js (권장하지 않음 - 개발 환경만)
process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';

로그로 요청 추적

앱에 로깅을 추가해서 요청이 어디서 막혔는지 본다.

console.log(`[${new Date().toISOString()}] API 요청 시작: ${API_URL}`);

fetch(`${API_URL}/data`, { timeout: 5000 })
  .then(res => {
    console.log(`[${new Date().toISOString()}] API 응답: ${res.status}`);
    return res.json();
  })
  .catch(err => {
    console.error(`[${new Date().toISOString()}] API 에러:`, err.message);
  });

최종 확인: 배포 환경에서 직접 테스트

  1. 서버에서 curl로 API 호출 → 성공하나?
  2. 앱의 로그에서 API 호출 시도 기록이 있나?
  3. 응답 코드는 뭔가? (200, 401, 403, 500 등)

마지막으로, 네트워크 문제는 로컬 개발 때는 안 보인다. 배포 환경에서만 나타난다. 배포 직후에 꼭 기본 테스트를 해야 한다.