웹 개발
배포 후 네트워크 연결 확인
로컬에서는 잘 되는데 배포 후 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);
});
최종 확인: 배포 환경에서 직접 테스트
- 서버에서
curl로 API 호출 → 성공하나? - 앱의 로그에서 API 호출 시도 기록이 있나?
- 응답 코드는 뭔가? (200, 401, 403, 500 등)
마지막으로, 네트워크 문제는 로컬 개발 때는 안 보인다. 배포 환경에서만 나타난다. 배포 직후에 꼭 기본 테스트를 해야 한다.