HTTP 상태코드 정리
HTTP 상태별 의미와 다음 확인 사항을 정리했습니다. 코드 하나로 원인을 단정하지 않고 URL·요청 방식·서버 로그를 함께 봅니다.
PPORT ·
빠른 사용법
- HTTP 응답을 받았는지 확인하세요.
- 상태코드와 최종 URL을 살펴보세요.
- 같은 시각의 서버 로그와 비교하세요.
상태코드를 읽는 기준
| 코드 | 의미 | 다음 확인 |
|---|---|---|
| 200 | 요청을 성공적으로 처리했다는 HTTP 응답 | 내용이 올바른지·로그인 페이지가 대신 나온 것은 아닌지 확인 |
| 301 / 302 / 307 / 308 | 다른 위치로 이동하는 응답 | Location과 최종 URL 확인 |
| 401 / 403 | 인증 요구 또는 접근 거부 | 인증·권한·WAF 정책 확인 |
| 404 | 요청한 리소스를 찾지 못했다는 응답 | 경로와 배포 상태 확인 |
| 429 | 요청량 제한 | Retry-After와 제한 정책 확인 |
| 500 / 502 / 503 / 504 | 서버 처리·업스트림·가용성·시간 초과 관련 오류 | 앱·프록시 로그를 구분해 확인 |
리다이렉트와 성공 응답
3xx 응답은 HTTP 이동 정보입니다. 307·308은 요청 메서드를 유지하는 의미가 있고, 301·302의 후속 요청 동작은 메서드와 클라이언트에 따라 달라질 수 있습니다. 이 도구는 브라우저의 모든 동작을 재현하지 않습니다.
최종 200은 HTTP 수준의 처리 결과입니다. 로그인 안내나 오류 내용을 200으로 반환하는 사이트도 있으므로 화면과 기능도 확인합니다.
서버 오류를 좁혀가기
502·504는 중간 프록시와 업스트림 사이에서 발생할 수 있습니다. 앱 프로세스 상태, 내부 수신 포트, 응답 시간과 같은 시각의 로그를 함께 확인하세요. 상태코드 하나만으로 특정 프로그램이 고장났다고 확정하지 않습니다.
DNS·TLS·TCP 실패는 별도입니다
HTTP 응답을 받기 전에 실패했다면 상태코드가 없을 수 있습니다. 이름 해석 → 연결 → TLS 검증 → HTTP 응답 순서로 단계별 오류를 구분하세요.
curl로 상태코드와 이동 경로 확인하기
브라우저는 리다이렉트를 자동으로 따라가므로 중간 응답이 보이지 않습니다. curl로 첫 응답과 최종 응답을 따로 확인하세요. 아래는 PPORT 자체 주소로 확인한 결과입니다.
$ curl -sI http://pport.cloud/ | grep -iE '^HTTP|^location'
HTTP/1.1 308 Permanent Redirect
Location: https://pport.cloud/
$ curl -s -o /dev/null -w '%{http_code} %{url_effective}\n' -L http://pport.cloud/ko
200 https://pport.cloud/ko/
$ curl -s -o /dev/null -w '%{http_code}\n' https://pport.cloud/ko/no-such-page
404http로 들어온 요청은 308로 https 주소로 영구 이동하고, 최종 페이지는 200입니다. 없는 주소는 404를 돌려줍니다. HEAD 요청(-I)을 GET과 다르게 처리하는 서버도 있으므로, 결과가 이상하면 -o /dev/null로 GET 요청을 보내 비교하세요.
nginx 앞단에서 502와 504 구분하기
| 코드 | 흔한 원인 | nginx error.log에 보이는 문구 |
|---|---|---|
| 502 Bad Gateway | 뒤쪽 앱 프로세스가 꺼져 있거나 다른 포트에서 대기 중 | connect() failed (111: Connection refused) while connecting to upstream |
| 504 Gateway Timeout | 앱이 proxy_read_timeout(기본 60초) 안에 응답하지 않음 | upstream timed out (110: Connection timed out) while reading response header from upstream |
sudo tail -n 30 /var/log/nginx/error.log
systemctl status myapp
sudo ss -ltnp | grep ':8000'PPORT도 nginx 뒤에서 127.0.0.1:8000의 gunicorn으로 동작합니다. 업데이트 직후 앱이 다시 시작되는 몇 초 동안 내부 연결이 거부되는데, 그 사이에 들어온 요청이 502를 받는 것과 같은 원리입니다.
페이지를 옮기거나 지울 때 고르는 코드
주소가 영구히 바뀌었다면 301이나 308, 잠시 다른 곳을 보여 줄 때는 302나 307을 씁니다. 검색 엔진은 영구 이동을 새 주소를 대표 주소로 삼으라는 강한 신호로 받아들입니다. PPORT도 2026년 10월 제공 언어를 한국어와 영어로 줄이면서, 중단한 언어의 주소를 같은 경로의 영어 페이지로 301 이동시켰습니다.
페이지를 완전히 없앴다면 404나 410을 돌려줍니다. 없는 페이지에 200 상태로 “찾을 수 없음” 화면을 보여 주면 검색 엔진이 빈 페이지를 정상 문서로 다룰 수 있습니다(소프트 404).