cURL 오류 28(연결 시간 초과) 해결 가이드

이 가이드는 WordPress에서 발생하는 cURL 오류 28의 원인과 WR(워드프레스 전문가) 권장 해결책을 단계별로 설명합니다. 단계별 체크리스트와 역할별(운영자, 개발자, 호스팅 지원) 점검 항목도 포함되어 있어 실제 문제 해결에 바로 활용할 수 있습니다.
개요 — cURL 오류 28이란?
cURL(Client URL)은 웹사이트가 API 요청을 보내고 응답을 받아 서버/데이터베이스와 데이터를 주고받게 해주는 라이브러리입니다. 이 요청-응답 과정에서 지정된 시간 안에 응답을 받지 못하면 “cURL 오류 28: Connection timed out”(연결 시간 초과) 오류가 발생합니다.
주요 원인:
- 워드프레스 방화벽 또는 보안 플러그인이 외부 API 요청을 차단
- 잘못된 DNS 설정이나 특정 플러그인 충돌
- 호스팅사 수준에서 설정된 낮은 타임아웃/리소스 제한
- SSL 설정 불일치 또는 만료된 인증서
참고: “타임아웃”은 요청을 기다리는 최대 시간을 초과했음을 의미합니다. WordPress 내부적으로는 wp_remote_get 등 HTTP 요청의 기본 타임아웃 값이 짧게 설정되어 있을 수 있습니다(환경에 따라 다름).
사전 점검(실행 전)
다음 기본 점검을 먼저 수행하세요. 간단하지만 많은 경우 이 단계로 문제를 해결할 수 있습니다.
- 호스팅 서버에서 최신 cURL 라이브러리, PHP, OpenSSL을 사용 중인지 확인하세요.
- 다른 브라우저나 시크릿(인코그니토) 모드로 시도해 보세요.
- 최근에 설치한 플러그인이나 테마 업데이트가 있다면 메모해 두세요.
1) 워드프레스 방화벽(보안 플러그인) 비활성화
방화벽이나 보안 플러그인은 외부 API 요청을 차단해 cURL 오류를 유발할 수 있습니다. 임시로 비활성화하고 문제가 해결되는지 확인하세요.
- WordPress 관리자 페이지에 로그인합니다.
- 플러그인(Plugins) 메뉴로 이동해 방화벽/보안 플러그인을 찾아 비활성화(Deactivate) 합니다.
문제가 해결되면 방화벽의 로그를 확인해 어떤 API 요청이 차단되었는지 파악하고, 필요한 예외(allowlist)를 추가하세요.
중요: 보안 플러그인을 완전히 삭제하기 전에 로그와 설정을 확인해 차단된 엔드포인트만 허용하고 보안 기능은 재활성화하세요.
2) 모든 플러그인 비활성화(문제 분리)
플러그인 충돌 여부를 확인하려면 모든 플러그인을 일괄 비활성화하고 문제가 해결되는지 확인합니다.
- 관리자 페이지에 로그인합니다.
- 플러그인 > 설치된 플러그인(Installed Plugins) 로 이동합니다.
- 상단 체크박스로 모든 플러그인을 선택한 뒤
- 드롭다운에서 비활성화(Deactivate) 를 선택합니다.
문제가 해결되면 하나씩 플러그인을 활성화하면서 문제를 재현하여 원인 플러그인을 찾습니다.
3) DNS 서버 변경(클라이언트 측 테스트)
로컬 또는 서버의 DNS 문제로 인해 외부 엔드포인트에 연결할 수 없을 수 있습니다. Windows 예시:
- Windows + R을 눌러 실행창을 엽니다.
- ncpa.cpl 입력 후 확인(OK) 을 클릭해 네트워크 연결을 엽니다.
- 활성 네트워크를 우클릭해 속성(Properties) 를 선택합니다.
- “이 연결은 다음 항목을 사용함(This connection uses the following items)”에서 인터넷 프로토콜 버전 4(TCP/IPv4) 를 선택한 뒤 속성(Properties) 클릭.
- “다음 DNS 서버 주소 사용(Use the following DNS server addresses)”을 선택하고, 기본 DNS에 8.8.8.8, 보조 DNS에 8.8.4.4(Google Public DNS)를 입력합니다.
- 확인(OK) 을 눌러 저장합니다.
공용 DNS(예: Google DNS)를 사용하면 로컬 ISP의 DNS 문제를 우회할 수 있습니다. 서버 측 DNS 문제라면 호스팅사에 문의하세요.
4) 브라우저 캐시 및 쿠키 삭제
브라우저 캐시가 오래된 응답을 유지해 문제처럼 보일 수 있습니다. Chrome 예시:
- Chrome을 열고 우측 상단의 세 점(더보기) 아이콘을 클릭합니다.
- 설정(Settings) > 개인정보 및 보안(Privacy & security) 로 이동합니다.
- 인터넷 사용 기록 삭제(Clear browsing data) 를 선택합니다.
- 기간(Time range)을 전체(All time) 로 설정하고, 쿠키 및 기타 사이트 데이터(Cookies and other site data), 캐시된 이미지 및 파일(Cache images and files) 을 선택한 뒤 데이터 삭제(Clear data) 를 클릭합니다.
캐시를 지운 뒤 문제가 해결되는지 확인합니다.
5) SSL 구성 점검
SSL 인증서의 잘못된 설치나 체인 불일치가 요청 실패를 유발할 수 있습니다.
- Qualys SSL Labs(SSL Server Test)로 이동합니다.
- 사이트 도메인을 입력하고 Submit(제출)합니다.
테스트 결과에서 인증서 체인, 프로토콜 지원, 만료 여부 등을 확인하세요. 문제 발견 시 인증서를 재설치하거나 SSL 공급업체의 지원을 받습니다.
6) 서버 제한 및 cURL 버전 확인
WordPress 대시보드에서 서버 정보 및 제한을 확인하세요.
- 대시보드에서 도구(Tools) > 사이트 상태(Site Health) 로 이동합니다.
- 정보(Info) 탭을 클릭하고 서버(Server) 항목에서 cURL 버전, PHP 버전, 허용 메모리, 최대 실행 시간(max_execution_time) 등을 확인합니다.
만약 서버의 타임아웃이 지나치게 짧거나 리소스가 부족하면 호스팅사에 문의해 타임아웃 연장이나 리소스 증설을 요청하세요.
언제 이 방법들이 실패하는가(예외 사례)
- 외부 API 자체의 응답 지연이나 다운 상태: 사이트 외부의 문제로, 서비스 제공자의 상태 페이지를 확인해야 합니다.
- 네트워크 레벨(라우터/방화벽)에서 특정 포트 차단: 클라이언트/서버 양쪽의 네트워크 장비 설정 확인 필요.
- 호스팅사가 임의로 outbound(발신) 요청을 차단한 경우: 호스팅사 정책으로 인해 해결이 불가능할 수 있음.
대안적 접근법
- 서버 측에서 직접 cURL 명령으로 문제 재현(curl -v
) — 이 방법은 서버에서 엔드포인트로 직접 연결 가능한지 확인하는 데 유용합니다. - wp_remote_get에 ‘timeout’ 파라미터를 늘려 시도(임시 디버그 목적). 예: wp_remote_get($url, [‘timeout’ => 30]) — 단, 근본 원인 해결이 우선입니다.
- 외부 API의 경우 레이트 리밋(rate limit) 확인 및 백오프(지수적 대기) 전략 적용.
역할 기반 체크리스트
- 운영자(사이트 관리자): 플러그인 비활성화, 브라우저 캐시 삭제, 방화벽 설정 확인
- 개발자: 서버 로그(예: PHP errorlog, 웹서버 액세스/에러 로그), wp_remote* 호출 코드 검토, 타임아웃 상수 확인
- 호스팅 지원: 서버 네트워크/방화벽 설정, 아웃바운드 연결 정책, cURL/PHP/OpenSSL 버전 확인 및 필요 시 업데이트
표준 운영 절차(SOP) — 문제 해결 플레이북
- 재현: 오류 로그와 Site Health에서 cURL 오류 상세 확인
- 사전 점검: 플러그인/방화벽 비활성화, 브라우저 캐시 삭제
- 네트워크 점검: 서버와 클라이언트의 DNS 및 라우팅 확인
- SSL 점검: Qualys 테스트로 인증서 상태 확인
- 서버 리소스: 서버 제한(타임아웃, 메모리) 확인
- 외부 재확인: API 제공자 상태 확인
- 호스팅 문의: 위 단계 결과를 정리해 호스팅사에 전달
- 복구 및 모니터링: 문제 해결 후 비활성화한 보안 설정을 안전하게 되돌리고 모니터링 설정
테스트 케이스(수용 기준)
- 시나리오 A: 방화벽 비활성화 후 요청 성공 → 수용 기준: 동일한 API 호출이 정상 응답(HTTP 200 등)을 반환
- 시나리오 B: DNS를 공용 DNS로 변경 후 성공 → 수용 기준: DNS 변경 전/후 응답 시간 차이 확인
- 시나리오 C: 서버의 타임아웃 상향 조정 후 성공 → 수용 기준: 타임아웃 변경 전후에 안정적으로 응답 획득
빠른 의사결정 흐름(Flowchart)
flowchart TD
A[문제 감지: cURL 오류 28] --> B{플러그인/방화벽 활성화?}
B -- 예 --> C[비활성화 후 재시도]
B -- 아니오 --> D{DNS 문제일 가능성}
C --> E{해결됨?}
D --> F[공용 DNS로 변경 후 재시도]
F --> E
E -- 예 --> Z[문제 해결]
E -- 아니오 --> G[SSL 구성 점검]
G --> H{문제 발견?}
H -- 예 --> I[인증서 재설치/공급사 연락]
H -- 아니오 --> J[서버 타임아웃 및 리소스 확인]
J --> K{호스팅 제한?}
K -- 예 --> L[호스팅사에 요청]
K -- 아니오 --> M[추가 로그 분석/개발자 개입]
L --> Z
I --> Z
M --> Z
주요 사실 정리(Fact box)
- WordPress의 일부 HTTP 함수는 기본 타임아웃이 짧게 설정될 수 있으므로(환경에 따라 다름) 요청 실패 시 타임아웃 값을 점검하세요.
- 공용 DNS(예: 8.8.8.8)는 로컬 ISP의 DNS 문제를 우회하는 데 자주 사용됩니다.
- SSL 인증서 체인 문제나 만료는 외부 연결 실패의 흔한 원인입니다.
간단 용어집(1줄)
- cURL: 서버 간 HTTP 요청을 수행하는 라이브러리
- 타임아웃: 요청이 응답을 기다리는 최대 시간
- SSL 인증서 체인: 서버 인증서와 신뢰 루트 사이의 연결 정보
요약 및 권장 행동
- 우선: 방화벽/보안 플러그인과 캐시를 점검하고 모든 플러그인을 일시적으로 비활성화하세요.
- 다음: DNS를 공용 DNS로 변경해 네트워크 문제를 배제합니다.
- SSL과 서버 제한(타임아웃, 메모리)을 점검하고, 필요 시 호스팅사에 문의하세요.
- 문제 해결 후에는 보안 설정을 안전하게 되돌리고, 동일한 문제가 재발하지 않도록 모니터링을 설정하세요.
자주 묻는 질문(FAQ)
Q1: cURL 오류 28을 무시하고 사이트를 운영해도 괜찮나요?
아니요. 외부 API 호출 실패가 기능 저하(예: 소셜 로그인, 결제, 외부 데이터 표시)를 초래할 수 있으므로 근본 원인을 해결하는 것이 좋습니다.
Q2: 플러그인 하나씩 비활성화하는 번거로움을 피할 방법이 있나요?
스테이징 환경이나 로컬 복제본에서 순차적으로 재현 테스트를 하는 것이 안전합니다. 플러그인 충돌이 의심되면 개발자 도구로 네트워크 호출 로그를 확인하세요.
Q3: 호스팅사에 어떤 정보를 제공해야 하나요?
재현 절차, Site Health에서 캡처한 서버 정보(예: cURL/PHP 버전), 시도한 모든 해결 단계 및 로그(에러 로그, 웹서버 로그)를 제공하세요.
문제가 계속되면 아래 댓글로 현상(에러 로그, 발생 빈도, 최근 변경사항)을 남겨주시면 추가로 도와드리겠습니다.