HTTP 상태 코드(HTTP response status codes)
HTTP 상태코드는 클라이언트에서 요청한 HTTP 요청이 성공적으로 처리 되었는지 알려준다. 서버는 요청의 처리 상태를 상태 코드와 간단한 이유 문구를 포함하여 응답 메세지의 시작라인에 명시한다. 이번 포스팅에서는 자주 쓰이는 상태 코드와 의미에 대해서 알아보자.
상태 코드 그룹
- Informational responses (100 - 199): 요청이 수신되어 처리 중인 상태
- Successful response (200-299): 요청이 성공적으로 처리된 상태
- Redirection message (300-399): 요청을 완료하려면 추가적인 행동이 필요한 상태
- Client error response (400-499): 클라이언트에서 발생한 오류로 인해 서버가 요청을 수행할 수 없는 상태
- Server error response (500-599): 서버가 정상 요청을 처리하지 못하여 오류가 발생한 상태
5개 그룹으로 상태 코드를 분류해서 이해할 수 있다. 그 중 1xx 상태 코드는 자주 사용되지 않아서 이번 포스팅에서는 그 내용을 제외했다.
클라이언트가 모르는 상태코드를 마주하게 된다면?
클라이언트에서 이해할 수 없는 상태 코드가 응답 메세지에 포함되어 있다면, 클라이언트는 상태 코드가 속한 그룹을 기반으로 응답 메세지를 이해하게 된다. 이를 통해, 새로운 상태 코드가 HTTP 표준으로 도입된다 하더라도 클라이언트에서는 코드 변경없이 대응할 수 있게 된다. 현업에서도 모든 상태 코드를 사용하지 않고 개발팀에서 주로 사용할 상태 코드를 정해서 대응하게 된다.
Successful response (200-299)
200 OK
서버가 요청을 성공적으로 처리한 경우 반환하는 상태 코드. HTTP 메서드에 따라 응답 메세지에 포함되는 정보가 달라지게 된다. GET 메서드인 경우 리소스 정보를 응답 본문에 전송하게 되고, PUT 또는 POST의 경우 처리 결과에 대한 리소스 정보를 응답 본문에 전송하게 된다.
201 Created
요청을 성공적으로 처리하여 그 결과 새로운 리소스가 생성되었다는 뜻이다. 보통 POST, PUT 요청에 대한 응답으로 자주 사용된다.
202 Accepted
서버가 요청을 수신하였지만 처리를 완료하지 못한 경우에 쓰이는 상태 코드이다. 요청을 완료하기 위해서는 배치 프로세스에서 추가적인 작업이 필요한 경우에 202 응답을 반환하면 된다.
204 No Content
서버가 요청을 성공적으로 처리하였지만, 응답 메세지 본문에 보낼 정보가 없을 때 쓰이는 상태 코드이다. 리소스가 삭제되었거나, 문서 편집기에서 작성 내용을 저장할 때처럼, 현재 페이지에서 벗어나지 않고 리소스를 업데이트할 때 자주 쓰인다.
Redirection message (300-399)
HTTP 요청 메세지를 처리하기 위해서는 클라이언트에서 추가적인 행동이 필요한 경우 300번 대 상태 코드를 반환하게 된다. 서버는 [ic]Location[/ic] 헤더에 리다이렉션 되어야 하는 URI를 반환하고, 웹 브라우저는 해당 주소로 이동하게 된다.
영구 리다이렉션
- 영구적으로 리소스의 URI가 변경된 상황
- 기존의 URI는 더 이상 사용하지 않기 때문에, 검색 엔진에서도 새로운 URI를 색인 정보로 인식하게 된다.
- 301 Moved Permanently
- 요청한 리소스가 Location 헤더에 명시된 URI로 완전히 옮겨졌다는 뜻
- 리다이렉트 되어 재전송된 요청 메서드가 GET으로 변하고, 본문이 제거될 수 있음
- 308 Permant Redirect
- 301 응답 코드와 동일한 의미를 가지고 있지만, 요청 메세지의 메서드와 본문을 유지한다는 차이점이 있다.
실무에서는 308 상태 코드보다 301 상태 코드로 더 많이 응답하게 된다. 기존에 사용하던 페이지가 바뀌면서 API 스펙도 바뀌는 경우가 많기 때문에, 기존의 POST 메서드 요청이 제대로 수행되지 않는 경우가 많다.
일시적 리다이렉션
- 리소스의 URI가 일시적으로 변경된 상태
- 검색 엔진의 색인 정보에 새로운 URI가 등록되지 않는다.
- 302 Found
- 요청한 리소스가 Location 헤더에 명시된 URI로 일시적으로 이동된 상태
- 리다이렉트 되어 재전송된 요청 메서드가 GET으로 변하고, 본문이 제거될 수 있음
- 307 Temporay Redirect
- 302 응답 코드와 동일한 의미를 가지고 있지만, 요청 메세지의 메서드와 본문을 그대로 유지
- 303 See Other
- 302 응답 코드와 동일한 의미를 가지고 있지만, 요청 메세지의 메서드를 GET으로 변경되어 리다이렉트 되게 함
Client error response (400-499)
클라이언트의 요청에 잘못된 문법 등과 같은 오류가 있어 서버가 요청을 수행할 수 없는 상태 코드가 400번 대 그룹이다. 이미 요청 메세지 자체에 문제가 있기 때문에 수정 없이 재시도 했을 때에는 똑같이 실패한다는 점을 유의해야 한다. 서버 개발자라면 클라이언트 개발자에게 어떤 문제가 발생하고 있는지 정확히 알려줘야 빠르게 문제 해결할 수 있다.
400 Bad Request
잘못된 문법으로 인하여 서버가 요청을 이해할 수 없다는 것을 뜻한다. 이 때 클라이언트 개발자는 API 스펙을 다시 확인하여 파라미터 형식이나 메세지 본문 형식에 잘못된 구문이 없는지 확인해서 수정해야 한다.
401 Unauthorized
클라이언트가 요청을 응답받기 위해서는 인증이 필요하여 서버가 응답을 거부한 상태이다. HTTP 표준에서는 unauthorized(비인가)이라고 되어 있지만, unauthenticated(비인증)을 의미하는 상태 코드이다. 웹사이트에서 게시물을 열람하거나 수정하려고 할 때 로그인 정보를 제공해야 하는데, 그렇지 않으면 401 에러 코드가 반환된다. 서버는 오류 메세지를 반환할 때, [ic]WWW-Authenticate[/ic] 헤더에 인증 방법을 클라이언트에 알려줄 수 있다.
403 Forbidden
401 에러가 비인증에 대한 상태 응답이었다면, 403 에러는 비인가에 대한 응답이다. 예를 들어 웹 사이트에서 관리자 권한을 가진 사용자만 열람을 할 수 있는 리소스에 일반 사용자가 접근 요청을 하였을 경우에 [ic]403 Forbidden[/ic] 상태 코드가 반환되게 된다. 의미 상으로 [ic]401 Unauthorized[/ic]로 반환하는 것이 더 적절해 보일 수 있지만, 403으로 반환해야 한다는 것에 유의하자.
404 Not Found
클라이언트가 요청한 리소스를 서버가 찾을 수 없을 때 반환되는 상태 코드이다. 때로는 서버가 인증되지 않은 클라이언트로부터 리소스를 숨기기 위해서 403 대신에 이 응답을 전송할 수 있다.
Server error response (500-599)
서버에 문제가 생겨 HTTP 요청을 제대로 처리하지 못하는 상태를 표현하는 코드 그룹이다. 클라이언트가 동일한 요청을 재시도 하였을 때, 서버의 문제가 해결되면 올바른 응답을 받을 수 있다는 특징이 있다.
500 Internal Server Error
가장 대표적인 서버 오류 상태 코드. 서버 내부에 어떠한 원인으로 인해 문제가 발생해서 요청을 처리할 수 없는 경우에 해당 응답 코드를 반환하게 된다. 또는 원인을 특정하기 어려운 경우에도 이 응답을 반환하기도 한다.
503 Service Unavailable
서버가 현재 동작하고 있지 않다는 상태를 나타낸다. 일시적인 과부하 또는 유지 보수 작업으로 인해 서버의 작동이 멈춘 상황에서 503 에러가 자주 발생한다. 서버는 클라이언트에게 [ic]Retry-After[/ic] HTTP 헤더를 통해 서버의 복구 시점을 알려줄 수 있다.
📌 References
HTTP 상태 코드 - HTTP | MDN
HTTP 응답 상태 코드는 특정 HTTP 요청이 성공적으로 완료되었는지 알려줍니다. 응답은 5개의 그룹으로 나누어집니다: 정보를 제공하는 응답, 성공적인 응답, 리다이렉트, 클라이언트 에러, 그리고
developer.mozilla.org
'Backend > Network' 카테고리의 다른 글
서비스간의 메세지를 주고받자 (0) | 2022.10.25 |
---|---|
RESTful한 API 설계하기 (1) | 2022.10.04 |
댓글