어떤 웹 페이지에 들어갔을 때 404 Not Found, 혹은 503 Service Unavailable 같은 문장을 본 적이 있을 것입니다. 개발자가 되기 전에는 그저 원하는 결과를 보지 못해 짜증만 유발하였는데, 이제는 코드가 대략적인 원인을 파악하게 만들어주는 고마운 녀석들이라는 것을 압니다. 그러나 기본적인 코드(200, 404)를 제외하고 여전히 아리송한 상태 코드들이 많습니다. 각 코드의 의미에 맞는 적절한 사용을 위해 이번 포스팅에서는 자주 보는 HTTP Status Code에 대해 알아봅시다.
Status Code가 뭔가요?
요청이 성공적이었는지의 여부를 빠르게 검사할 수 있는 세 개의 숫자로 구성된 코드입니다. 기본적으로 100번에서 500번대 까지 5개의 그룹으로 나뉘어 있으며, 코드의 첫 번째 숫자를 보면 어떤 그룹에 속해있는지 알 수 있습니다.
- 1XX - Informational codes
- 2XX - Success codes
- 3XX - Redirection codes
- 4XX - Client error codes
- 5XX - Server error codes
1XX - 정보
요청이 수신되었고, 처리가 되는 동안 임시적으로 발급하는 코드입니다. 요청의 성공 또는 실패를 나타내는 대신에 클라이언트와 서버 간의 프로토콜 통신에 사용됩니다.
일반적으로 볼 일이 없는 상태 코드입니다. 실제로 저도 보았던 경험이 없네요(보고 지나쳤을 수도).
- 100 Continue: 서버가 요청의 처음 부분을 수신했으며 나머지 요청을 계속 처리
- 101 Switching Protocols: 서버에서 프로토콜을 변경할 것임을 알려줌
- 102 Processing: 서버가 아직 요청을 처리하고 있지만 최종 응답을 보낼 준비는 되지 않음
2XX - 성공
마주치면 제일 반갑습니다. 요청이 서버에 의해 성공적으로 처리되었음을 나타냅니다. 일반적으로 "성공"이라고 이해해도 되지만, 추가적인 의미가 있는 코드도 있습니다.
리소스를 생성하는 API를 만들 때, 항상 201과 200 상태 코드 중에 어떤 것을 사용할 지 고민이 됩니다. 201이 의미에 더 맞긴 하지만, 각 팀의 컨벤션에 따르도록 합시다.
- 200 OK: 요청이 성공적으로 완료되었으며 서버가 요청한 데이터를 반환
- 201 Created: 요청이 성공적으로 완료되었으며 서버에 새 리소스가 생성됨
- 202 Accepted: 서버에서 요청을 수락했지만 아직 처리를 완료하지 않음
- 204 No Content: 요청에 성공했지만 반환할 데이터가 없음
3XX - 리다이렉션
클라이언트가 요청을 완료하기 위해 추가 작업을 진행해야 함을 의미합니다. 일반적으로 리다이렉션을 의미합니다.
- 301 Move Permanently: 요청한 리소스가 영구적으로 새로운 URL로 이동되었음
- 302 Found: 요청한 리소스가 임시적으로 새로운 URL로 이동되었음
4XX - 클라이언트 에러
클라이언트 요청에 문제가 있을 때 발생하게 되는 에러 코드입니다. 대개 잘못된 매개 변수 또는 인증이 원인입니다.
괜히 400번대 에러를 보면 안심하게 됩니다. 제가 서버 개발자라 그런거겠죠? 실제로 405나 400 코드는 원인이 명확하여 금방 해결되고는 합니다.
- 400 Bad Request: 구문이 잘못되거나 변수가 누락되어 서버가 요청을 이해할 수 없음
- 401 Unauthorized: 해당 요청에 대한 권한이 없음
- 403 Forbidden: 금지된 요청을 허가하지 않음
- 404 Not Found: 요청한 페이지를 찾을 수 없음
- 405 Method Not Allowed: 해당 메서드가 제공되지 않음
- 429 Too Many Requests: 짧은 시간 안에 너무 많은 요청을 보냄
5XX - 서버 에러
2XX 코드와 상반되게 제일 마주치기 싫은 코드입니다(특히 500). 요청을 처리하는 동안 서버 측에서 오류가 발생했음을 나타냅니다.
- 500 Internal Server Error: 요청을 처리하는 동안 서버에 예기치 않은 오류 발생
- 502 Bad Gateway: 게이트웨이나 프록시의 상태가 나쁨
- 503 Service Unavailable: 서버 과부하 또는 유지 관리로 인해 서버를 사용할 수 없음