
상태 코드는 클라이언트가 보낸 요청의 처리 상태를 나타내며, HTTP 응답 메시지에 포함된다.
상태 코드는 100번대에서 500번대까지 존재하며, 첫 자리 숫자가 상태의 주요 범주를 나타낸다.
예: 성공(200번대), 리다이렉션(300번대), 클라이언트 에러(400번대), 서버 에러(500번대).
상태 코드의 의미를 완전히 알지 못하더라도, 첫 자리 숫자로 요청 처리 상태를 유추할 수 있다.
예를 들어, 299 상태 코드를 응답 메시지에서 본다면 정확한 이슈는 몰라도 200번대이므로 요청이 성공했다는 것을 알 수 있다.
거의 사용하지 않으므로 생략.
요청이 성공적으로 처리되었으며, 클라이언트가 원하는 결과를 받았음을 의미한다.
요청이 성공적으로 처리되었으며, 새로운 리소스가 생성되었음을 나타낸다.
생성된 리소스의 URI는 응답 메시지 헤더의 Location 필드에 포함된다.
요청이 성공적으로 접수되었으나, 처리 완료까지 시간이 소요되는 경우 사용된다.
예: 배치 처리와 같이 처리가 지연되는 작업.
요청이 성공적으로 처리되었으나, 응답 본문에 보낼 데이터가 없는 경우 사용된다.
예: 문서 편집기에서 변경사항 없이 저장 버튼을 누르는 경우.
300번대는 클라이언트가 요청을 완료하기 위해 추가 조치가 필요함을 나타낸다.
웹 브라우저는 Location 헤더에 지정된 URI로 자동으로 리다이렉트한다.
리소스가 영구적으로 이동되었음을 나타낸다.
리다이렉트 시 요청 메서드가 GET으로 변경되고 본문이 제거될 수 있다.
301과 동일하지만, 요청 메서드와 본문을 유지한다.
일반적으로 POST 요청의 본문을 유지한 채로 리다이렉트하는 것은 권장되지 않는다.
리소스가 임시적으로 이동되었음을 나타낸다.
리다이렉트 시 요청 메서드가 GET으로 변경되고 본문이 제거될 수 있다.
302와 동일하지만, 요청 메서드와 본문을 유지한다.
302와 비슷하며, 리다이렉트 시 요청 메서드가 항상 GET으로 변경된다.
리다이렉션 이전 URI로 다시 접근할 가능성이 있는 경우 302를 사용하는 것이 적절하다.
예:
영구 리다이렉션은 과거 URI에서 새로운 URI로 이동해야 하며, 과거 URI로 다시 돌아갈 일이 없을 때 사용한다.
예:
영구 리다이렉션은 301로 처리하며, 과거 URI가 완전히 대체된 경우에 적합하다.
일시적 리다이렉션은 302로 처리하며, 다시 이전 URI로 돌아갈 가능성이 있는 상황에서 사용한다.
실제 웹 애플리케이션에서 302의 상황이 301보다 더 빈번하게 발생한다는 것을 예상할 수 있다.
303 See Other는 POST 요청의 리다이렉션을 더 편리하게 처리하기 위해 도입된 상태 코드이다. 과거에는 리다이렉션 시 302만 사용되었지만, POST를 리다이렉션하는 경우 요청 메시지 바디를 유지하는 것이 불편했고, 대부분의 경우 GET으로 전환하여 리다이렉션을 처리했다. 이를 표준화한 것이 303이며, 리다이렉션 시 항상 GET 메서드로 전환된다. 하지만 302 GET 리다이렉션이 이미 널리 사용되고 표준처럼 굳어져 있어, 현재도 많은 환경에서 302를 계속 사용하는 경우가 많다.
PRG(Post/Redirect/Get)는 POST 요청 후 바로 200 응답을 반환하지 않고, 리다이렉트를 통해 GET 요청으로 전환하는 방식이다.
이 방식은 POST 요청의 중복 처리를 방지하기 위한 설계 패턴이다.
이 경우 클라이언트는 /order 위치에 머물며, 새로고침(F5)을 시도할 경우 POST 요청이 다시 전송된다.
이는 중복 처리를 유발하며, 백엔드에서 이를 방지하기 위해 400번대 에러를 반환하거나 추가 로직이 필요할 수 있다.
PRG 방식을 사용하면 POST 요청 후 리다이렉트를 통해 중복 요청 문제를 방지할 수 있다.
사용자가 새로고침을 시도해도 GET 요청만 반복되므로, 백엔드에서 불필요한 에러 로그나 중복 처리를 피할 수 있다.
따라서 PRG 방식은 사용자 경험(UX)과 서버 안정성을 동시에 향상시키는 설계 패턴이다.
304 Not Modified는 주로 캐시를 목적으로 사용되며, 클라이언트에게 리소스가 수정되지 않았음을 알리는 상태 코드이다.
GET 요청에서 자주 사용되며, 클라이언트가 반복적으로 GET 요청을 보낼 때, 이전에 받은 응답이 캐시되어 있는 경우 서버가 새로운 데이터를 보내지 않고, 캐시된 데이터를 사용하도록 지시할 때 반환된다.
304 응답은 효율성을 위한 상태 코드로, 서버는 메시지 본문을 포함하지 않고, 클라이언트에게 캐시 데이터를 활용하라고 알린다.
따라서 304 응답에는 메시지 바디가 포함되지 않아야 한다.
클라이언트의 잘못된 요청으로 인해 서버가 요청을 수행할 수 없을 때 발생한다.
클라이언트가 잘못된 요청 데이터를 보낸 경우, 동일한 요청을 여러 번 반복하더라도 실패한다.
요청 구문에 오류가 있거나 메시지 형식이 잘못된 경우 발생한다.
클라이언트는 API 스펙이나 요청 파라미터를 재검토한 후 올바르게 수정하여 다시 요청해야 한다.
클라이언트가 해당 리소스에 대한 인증(로그인)이 필요한 경우 발생한다.
이 응답에는 WWW-Authenticate 헤더가 포함되며, 지원되는 인증 방법에 대한 정보가 제공된다.
서버가 요청을 이해했으나, 승인을 거부하는 경우 발생한다.
주로 인증은 되었으나 권한이 불충분한 경우 발생한다.
요청한 리소스를 서버에서 찾을 수 없는 경우 발생한다.
또한, 권한 부족으로 리소스를 숨기고자 할 때도 사용할 수 있어 403과 중복 사용이 가능하다.
서버 자체의 문제로 인해 요청을 처리할 수 없을 때 발생한다.
이 경우 재시도하면 서버 복구 등으로 요청이 성공할 가능성이 있다.
가장 일반적으로 사용되는 서버 오류 코드로, 서버 내부 문제를 포괄적으로 나타낸다.
구체적인 원인을 정의하기 어려울 때 사용된다.
서버가 일시적인 과부하 또는 예정된 유지보수로 인해 요청을 처리할 수 없음을 나타낸다.
Retry-After 헤더를 포함해 복구 예상 시간을 알릴 수 있다.