HTTP 상태 코드 정리
모든 HTTP 응답은 어떤 일이 일어났는지 클라이언트에 알려 주는 세 자리 상태 코드로 시작합니다. 계열별로 코드를 살펴보고, 알기 쉬운 설명과 응답 예시, 각 코드가 리디렉션과 SEO에 어떤 의미인지 확인하세요.
1xx 정보 응답
요청을 받았으며 처리가 계속되고 있습니다. 이 중간 응답은 최종 응답보다 먼저 도착하며, 리디렉션 체인의 마지막 응답이 되는 일은 없습니다.
- 100
계속
서버가 요청 헤더를 받아들였으므로, “Expect: 100-continue”를 보낸 클라이언트가 이제 요청 본문을 보내면 된다는 중간 응답입니다. - 101
프로토콜 전환
서버가 클라이언트의 Upgrade 요청을 수락하고 이 연결을 다른 프로토콜로 전환합니다. 전환 대상은 실제로 거의 항상 WebSocket입니다. - 102
처리 중
더 이상 쓰이지 않는 WebDAV 중간 응답으로, 서버가 오래 걸리는 요청을 아직 처리하고 있으니 계속 기다리라고 클라이언트에 알립니다. - 103
Early Hints
최종 응답보다 먼저 Link 헤더를 보내, 서버가 아직 작업하는 동안 브라우저가 리소스를 미리 로드하거나 미리 연결할 수 있게 하는 중간 응답입니다.
2xx 성공
요청을 받아 이해하고 수락했습니다. 정상적인 리디렉션 체인은 이 계열의 코드, 보통 200 OK로 끝납니다.
- 200
OK
요청이 성공했습니다. GET 요청이라면 본문에 요청한 리소스가 담깁니다. 모든 리디렉션 체인은 200을 반환하는 URL에서 끝나야 합니다. - 201
생성됨
요청이 성공해 새 리소스가 생성되었습니다. 보통 POST나 PUT 다음에 반환되며, Location 헤더가 있으면 새 리소스를 가리킵니다. - 202
수락됨
요청을 처리 대상으로 수락했지만 처리가 아직 끝나지 않았습니다. 비동기 작업에 쓰이며, 최종적으로 성공할지는 보장되지 않습니다. - 203
원본이 아닌 정보
요청은 성공했지만 중간의 변환 프록시가 응답을 수정했으므로, 받은 콘텐츠가 원본 서버가 보낸 것과 정확히 같지 않습니다. - 204
콘텐츠 없음
요청은 성공했고 보낼 콘텐츠가 없습니다. 브라우저는 현재 페이지에 그대로 머무르며, DELETE, 비콘, CORS 사전 요청에 흔히 쓰입니다. - 205
콘텐츠 재설정
요청이 성공했으니 클라이언트가 문서 화면을 초기화해야 한다는 뜻입니다. 예를 들어 방금 제출한 폼을 비웁니다. - 206
부분 콘텐츠
클라이언트가 Range 헤더로 요청한 바이트 범위만 보냅니다. 동영상 스트리밍과 이어받기가 가능한 다운로드에 쓰입니다. - 207
다중 상태
여러 리소스나 속성 각각에 대한 상태 코드를 XML multistatus 본문에 따로 담아 보내는 WebDAV 응답입니다. - 208
이미 보고됨
WebDAV 207 응답 안에서 이 컬렉션의 구성원이 이미 앞에서 나열되었음을 나타내, 바인딩이 순환할 때 끝없는 반복을 막습니다. - 226
IM Used
서버가 델타 인코딩(RFC 3229)으로 GET에 응답했습니다. 본문에는 클라이언트가 이미 가진 버전과 비교한 변경 사항만 담깁니다.
3xx 리디렉션
클라이언트가 추가 조치를 취해야 하며, 보통 Location 헤더에 담긴 URL을 요청합니다. 리디렉션 체인은 바로 이 코드들로 이루어집니다.
- 300
여러 선택 항목
리소스에 여러 표현이 있어 클라이언트가 하나를 선택할 수 있습니다. 브라우저는 Location 헤더가 있어도 300을 자동으로 따라가지 않습니다. - 301
영구 이동
리소스가 Location 헤더의 새 URL로 영구 이동했다는 영구 리디렉션(301 리다이렉트)입니다. 클라이언트와 검색엔진은 앞으로 새 URL을 사용해야 합니다. - 302
임시 이동
리소스가 일시적으로 다른 URL에 있다는 임시 리디렉션(302 리다이렉트)입니다. 클라이언트는 Location 헤더를 따라가지만 앞으로도 원래 URL을 사용해야 합니다. - 303
다른 위치 보기
클라이언트를 GET으로 가져와야 하는 다른 URL로 리디렉션합니다. 주로 폼 제출 후 결과 페이지를 보여 줄 때 씁니다(Post/Redirect/Get). - 304
수정되지 않음
조건부 GET 또는 HEAD에 대한 응답입니다. 클라이언트의 캐시 사본이 아직 유효하므로 서버는 본문을 보내지 않고, 캐시 사본이 재사용됩니다. - 305
프록시 사용
사용 중단된 코드입니다. Location에 지정된 프록시를 거쳐 요청을 다시 보내라고 지시했지만, 보안상의 이유로 브라우저는 이를 무시합니다. - 306
미사용(구 Switch Proxy)
예약되었지만 쓰이지 않는 코드입니다. 한때 “Switch Proxy”로 제안되었다가 폐기되었으며, 사용해서는 안 되고 클라이언트는 알 수 없는 3xx 코드로 처리합니다. - 307
임시 리디렉션
Location URL에서 같은 메서드와 본문으로 요청을 반복해야 하는 임시 리디렉션입니다. POST를 GET으로 바꿀 수 있는 302와 다릅니다. - 308
영구 리디렉션
요청 메서드와 본문을 유지하는 영구 리디렉션입니다. 301처럼 앞으로는 새 URL을 사용해야 하지만, POST가 GET으로 바뀌지 않습니다.
4xx 클라이언트 오류
요청을 보낸 그대로는 처리할 수 없습니다. 페이지가 존재하지 않거나, 접근이 거부되었거나, 클라이언트가 너무 많은 요청을 보낸 경우입니다.
- 400
잘못된 요청
잘못된 요청 구문, 유효하지 않은 URL, 너무 큰 쿠키처럼 클라이언트 측 오류로 보이는 문제 때문에 서버가 요청을 처리하지 않습니다. - 401
인증 필요
유효한 인증이 필요한 요청입니다. 서버는 Basic이나 Bearer처럼 인증 방법을 알려 주는 WWW-Authenticate 헤더를 보내야 합니다. - 402
결제 필요
HTTP가 향후 사용을 위해 예약해 둔 코드입니다. 실제로는 일부 API와 서비스가 결제, 크레딧, 구독이 필요할 때 사용합니다. - 403
접근 금지
서버가 요청을 이해했지만 권한 부여를 거부합니다. 401과 달리 같은 인증 정보로 요청을 다시 보내는 것만으로는 해결되지 않습니다. - 404
찾을 수 없음
이 URL에 해당하는 리소스가 서버에 없거나, 서버가 리소스의 존재 여부를 밝히지 않으려 합니다. 없는 상태가 일시적인지 영구적인지는 알려 주지 않습니다. - 405
허용되지 않는 메서드
URL은 존재하지만 사용한 HTTP 메서드를 지원하지 않습니다. 정적 페이지에 POST를 보낸 경우가 그 예이며, Allow 헤더에 지원하는 메서드가 나열됩니다. - 406
수용할 수 없음
서버가 클라이언트의 Accept 헤더(형식, 언어, 인코딩)에 맞는 응답을 만들 수 없으며, 기본 응답도 보내지 않습니다. - 407
프록시 인증 필요
401과 비슷하지만, 클라이언트와 서버 사이의 프록시가 인증을 요구합니다. 인증 방법은 Proxy-Authenticate 헤더로 알려 줍니다. - 408
요청 시간 초과
서버가 제시간에 완전한 요청을 받지 못해 연결을 닫습니다. 클라이언트는 새 연결에서 요청을 다시 보낼 수 있습니다. - 409
충돌
요청이 대상 리소스의 현재 상태와 충돌해 처리할 수 없습니다. 편집 충돌, 중복 레코드, 버전 불일치 등이 대표적인 예입니다. - 410
사라짐
리소스가 의도적으로 삭제되었으며 다시 돌아올 것으로 예상되지 않습니다. 404 Not Found보다 명확하고 영구적인 신호입니다. - 411
길이 필요
본문은 있지만 Content-Length 헤더가 없는 요청을 서버가 거부합니다. 클라이언트는 유효한 Content-Length를 넣어 다시 보낼 수 있습니다. - 412
전제 조건 실패
If-Match나 If-Unmodified-Since 같은 요청 헤더의 조건이 거짓으로 평가되어, 서버가 변경 사항을 적용하지 않았습니다. - 413
콘텐츠가 너무 큼
용량이 너무 큰 업로드처럼 요청 본문이 서버가 허용하는 크기보다 큽니다. 이전 이름은 “Payload Too Large”와 “Request Entity Too Large”입니다. - 414
URI가 너무 김
요청한 URL이 서버가 처리하는 길이보다 깁니다. 리디렉션 루프가 URL에 매개변수를 계속 덧붙이는 경우가 그 예입니다. - 415
지원되지 않는 미디어 유형
요청 본문의 형식(Content-Type)이나 콘텐츠 코딩(Content-Encoding)을 지원하지 않아 서버가 요청을 거부합니다. - 416
범위를 충족할 수 없음
요청의 Range 헤더에 지정한 바이트 범위가 파일 밖에 있습니다. 변경된 파일의 끝을 넘어서 다운로드를 이어받으려 할 때 발생합니다. - 417
기대 조건 실패
서버가 요청의 Expect 헤더에 담긴 기대 조건을 충족할 수 없습니다. 실제로는 Expect: 100-continue를 지원하지 않는다는 뜻입니다. - 418
나는 찻주전자입니다
1998년 커피포트 프로토콜(RFC 2324)에서 나온 만우절 농담입니다. HTTP에서는 미사용으로 예약되어 있지만, 일부 사이트는 일부러 반환합니다. - 421
잘못 전달된 요청
요청이 이 호스트 이름에 응답할 수 없는 서버에 도달했습니다. 흔히 TLS SNI 불일치나 재사용된 HTTP/2 연결 때문입니다. - 422
처리할 수 없는 콘텐츠
요청 형식은 올바르지만 콘텐츠가 의미상 유효하지 않습니다. 주로 API의 유효성 검사 오류이며, 이전 이름은 “Unprocessable Entity”입니다. - 423
잠김
WebDAV에서 리소스가 잠겨 있어 지금은 메서드를 적용할 수 없습니다. 클라이언트는 잠금 토큰이 필요하거나 잠금이 풀릴 때까지 기다려야 합니다. - 424
의존성 실패
WebDAV에서 메서드가 의존하던 다른 작업이 실패해 메서드를 수행할 수 없었습니다. PROPPATCH의 속성 하나가 실패한 경우가 그 예입니다. - 425
너무 이른 요청
재전송될 위험이 있으므로 서버가 TLS 조기 데이터(0-RTT)로 보낸 요청을 처리하지 않습니다. 클라이언트는 핸드셰이크 후 다시 시도합니다. - 426
업그레이드 필요
서버가 현재 프로토콜로는 요청을 처리하지 않으며, Upgrade 헤더에 지정된 프로토콜로 업그레이드할 것을 요구합니다. - 428
전제 조건 필요
여러 클라이언트가 같은 리소스를 편집할 때 변경 사항이 유실되지 않도록, 서버가 조건부 요청(If-Match)을 요구합니다. - 429
너무 많은 요청
클라이언트가 정해진 시간 안에 너무 많은 요청을 보냈습니다(속도 제한). Retry-After 헤더로 다시 시도하기 전에 기다릴 시간을 알려 줄 수 있습니다. - 431
요청 헤더 필드가 너무 큼
요청 헤더가 너무 커서 서버가 요청을 거부합니다. 대개 브라우저가 너무 많거나 너무 큰 쿠키를 보내는 것이 원인입니다. - 444
응답 없음
nginx nginx의 비표준 코드로, 서버가 아무 응답도 보내지 않고 연결을 닫습니다. 클라이언트에는 빈 응답만 보이며 444는 전달되지 않습니다. - 451
법적 사유로 이용 불가
법원 명령이나 정부의 차단 같은 법적 요구 때문에 접근이 거부되었습니다. 레이 브래드버리의 소설 “화씨 451”에서 이름을 따왔습니다. - 499
클라이언트 요청 종료
nginx 서버가 응답을 보내기 전에 클라이언트가 연결을 닫았을 때 nginx가 액세스 로그에 기록하는 비표준 코드입니다.
5xx 서버 오류
서버가 유효해 보이는 요청을 처리하지 못했습니다. 5xx 오류가 계속되면 방문자와 크롤러 모두 페이지에 접근할 수 없습니다.
- 500
내부 서버 오류
서버 측에서 발생한 일반적인 오류입니다. 애플리케이션 비정상 종료나 손상된 설정 파일처럼 서버 내부에서 무언가 잘못되었다는 뜻입니다. - 501
구현되지 않음
서버가 요청을 처리하는 데 필요한 기능을 지원하지 않습니다. 대개 서버가 인식하지 못하는 HTTP 메서드인 경우입니다. - 502
잘못된 게이트웨이
게이트웨이나 프록시가 업스트림 서버로부터 유효하지 않은 응답을 받았습니다. nginx 뒤의 애플리케이션이 다운된 경우가 그 예입니다. - 503
서비스 이용 불가
과부하나 점검 때문에 서버가 일시적으로 요청을 처리할 수 없습니다. Retry-After로 언제 다시 시도할지 알려 줄 수 있습니다. - 504
게이트웨이 시간 초과
게이트웨이나 프록시가 제시간에 업스트림 서버의 응답을 받지 못했습니다. 대개 애플리케이션이 너무 느린 것이 원인입니다. - 505
지원되지 않는 HTTP 버전
서버가 요청에 사용된 HTTP 주 버전을 지원하지 않거나 지원을 거부합니다. 요즘은 요청 줄의 형식이 잘못되었다는 신호인 경우가 많습니다. - 506
Variant Also Negotiates
투명한 콘텐츠 협상(RFC 2295)에서 발생하는 서버 설정 오류입니다. 선택된 변형 자체가 다시 협상 대상이어서 루프가 생깁니다. - 507
저장 공간 부족
WebDAV에서 디스크나 사용자 할당량이 가득 차는 등의 이유로 서버가 요청을 완료하는 데 필요한 데이터를 저장할 수 없습니다. - 508
루프 감지됨
WebDAV에서 서버가 바인딩의 무한 루프를 발견해 Depth: infinity 작업을 중단했습니다. 리디렉션 루프와는 관계가 없습니다. - 510
확장되지 않음
폐기된 HTTP 확장 프레임워크(RFC 2774)에서 나온 코드로, 요청에 필요한 확장 선언이 없다는 뜻입니다. 과거 코드이며 사실상 쓰이지 않습니다. - 511
네트워크 인증 필요
네트워크(대개 Wi-Fi 로그인 페이지인 캡티브 포털)가 접속을 허용하기 전에 로그인을 요구합니다. 원본 서버가 아니라 요청을 가로채는 네트워크가 보냅니다. - 520
웹 서버가 알 수 없는 오류를 반환함
Cloudflare Cloudflare 전용 코드로, 비정상 종료나 연결 재설정 등으로 원본 서버가 비어 있거나 알 수 없거나 예상하지 못한 응답을 반환했다는 뜻입니다. - 521
웹 서버가 다운됨
Cloudflare Cloudflare 전용 코드로, 원본 서버가 Cloudflare의 연결을 거부했습니다. 대개 웹 서버가 중단되었거나 Cloudflare를 차단하고 있습니다. - 522
연결 시간 초과
Cloudflare Cloudflare 전용 코드로, Cloudflare가 제시간에 원본 서버와 TCP 연결을 완료하지 못했거나 원본 서버가 요청을 확인하지 않았습니다. - 523
원본에 연결할 수 없음
Cloudflare Cloudflare 전용 코드로, Cloudflare가 원본 서버에 전혀 도달할 수 없습니다. 대개 라우팅 문제나 DNS의 잘못된 원본 IP 주소가 원인입니다. - 524
시간 초과 발생
Cloudflare Cloudflare 전용 코드로, Cloudflare가 원본 서버에 연결했지만 읽기 타임아웃(기본 약 2분) 안에 HTTP 응답을 받지 못했습니다. - 525
SSL 핸드셰이크 실패
Cloudflare Cloudflare 전용 코드로, Cloudflare와 원본 서버 사이의 TLS 핸드셰이크가 실패했습니다. 원본 서버에 유효한 인증서가 없는 경우가 그 예입니다. - 526
유효하지 않은 SSL 인증서
Cloudflare Cloudflare 전용 코드로, Full (strict) 모드에서 원본 서버의 인증서를 검증하지 못했습니다. 인증서가 만료되었거나 자체 서명되었거나 다른 이름용인 경우입니다. - 530
Cloudflare 1xxx 오류
Cloudflare Cloudflare 전용 코드로, 1016(원본 DNS 오류)이나 1033(Cloudflare Tunnel 오류) 같은 Cloudflare 1xxx 오류와 함께 전송됩니다.
HTTP 상태 코드 읽는 법
첫 번째 자리는 응답의 계열을, 나머지 두 자리는 그 계열 안에서의 정확한 의미를 나타냅니다. 특정 코드를 알지 못하는 클라이언트는 그 코드를 해당 계열의 x00 코드처럼 처리하므로, 알 수 없는 4xx 코드는 400 Bad Request와 같이 처리됩니다.
숫자 뒤에 붙는 Not Found나 Moved Permanently 같은 사유 구절(reason phrase)은 사람이 읽기 위한 설명일 뿐입니다. 클라이언트는 숫자만 보고 동작하며, HTTP/2와 HTTP/3에서는 사유 구절을 아예 보내지 않습니다.
리디렉션 상태 코드 한눈에 보기
- 301 Moved Permanently: 영구 리디렉션이며, 브라우저가 POST를 GET으로 바꿀 수 있습니다. 페이지를 옮겼을 때 기본으로 쓰는 코드입니다.
- 302 Found: 임시 리디렉션이며, 메서드가 바뀔 수 있습니다. 많은 프레임워크의 기본값입니다.
- 303 See Other: 임시 리디렉션이며, 항상 GET으로 따라갑니다. 폼 제출 후에 사용합니다.
- 307 Temporary Redirect: 임시 리디렉션이며, 메서드와 본문이 그대로 유지됩니다.
- 308 Permanent Redirect: 영구 리디렉션이며, 메서드와 본문이 그대로 유지됩니다.
- 304 Not Modified: 다른 URL로 보내는 리디렉션이 아니라, 클라이언트에 캐시된 사본이 아직 유효하다는 신호입니다.
각 코드를 언제 써야 하는지는 HTTP 리디렉션 상태 코드 정리 글에서 확인하세요.
리디렉션 체인의 상태 코드
리디렉션 체인은 최종 응답으로 끝나는 일련의 3xx 응답입니다. 방문자나 크롤러가 실제로 받는 것은 마지막 상태 코드뿐이므로, 그 앞의 리디렉션이 아무리 깔끔해 보여도 404로 끝나는 체인은 깨진 링크입니다. URL 리디렉션 검사 도구로 모든 홉(리디렉션 한 단계)의 상태 코드를 확인하거나, 리디렉션 일괄 검사 도구로 여러 URL을 한 번에 검사하세요.
URL 리디렉션 검사
무료 TrueURL 리디렉션 검사 도구로 URL이 반환하는 모든 상태 코드를 홉별로 확인하세요.