이 글은 책 ‘그림으로 배우는 HTTP & Network Basic’ 를 읽고 내용에 필자의 생각과 지식을 덧붙여 정리한 내용이다. 책 내용과 100% 일치하지 않을 수 있으며, 개인적인 견해나 경험이 들어갈 수 있다.
상태 코드는 서버로부터 리퀘스트 결과를 전달한다
클라이언트의 리퀘스트를 서버가 어떻게 처리했는지 알려주는 것이 상태코드이다. 이를 통해 클라이언트는 요청이 성공하였는지 실패하였는지 알 수 있다. 상태 코드는 3자리 숫자와 설명으로 나타낸다. 이때, 상태코드 맨 앞자리 숫자에 따라 5가지 클래스로 나뉜다.
상태 코드 클래스
상태 코드 | 클래스 | 설명 |
---|---|---|
1XX | Informational | 리퀘스트를 받아들여 처리중 |
2XX | Success | 리퀘스트를 정상적으로 처리했음 |
3XX | Redirection | 리퀘스트를 완료하기 위해서 추가 동작이 필요 |
4XX | Client Error | 서버가 리퀘스트를 이해할 수 없음 |
5XX | Server Error | 서버가 리퀘스트 처리를 실패함 |
클래스의 정의만 잘 지킨다면, RFC2616에 정의된 상태코드를 변경하거나 독자 상태 코드를 만들어도 괜찮다.
RFC2616과 확장인 RFC4918, 5842 (WebDAV), RFC 6586 (Additional HTTP Status Codes) 을 포함하면 60종류 이상의 상태코드가 있지만, 실제로 자주 사용되는 코드는 14가지 정도이다. 책에서는 14가지 상태코드만을 다룬다.
2XX 성공
200 OK
서버가 리퀘스트를 정상 처리하였음을 나타낸다.
204 No Content
서버가 리소스를 받아 처리하는데 성공했지만, 보내줄 리소스가 없을 때 사용한다. 리스폰스에 엔티티 바디를 포함하지 않고, 포함해서도 안된다. 클라이언트가 서버에 정보를 보내는 것으로 충분할 때 사용한다.
206 Partial Content
레인지 리퀘스트에 대한 상태 코드이다. 응답 헤더인 Content-Range로 지정된 범위의 엔티티가 포함된다.
3XX 리다이렉트
301 Moved Permanently
클라이언트가 요청한 리소스의 URI가 변경되어서 이후에 새로운 URI로 요청해야 한다는 것을 나타낸다.
302 Found
클라이언트가 요청한 리소스의 URI가 임시적으로 변경되었다는 것을 나타낸다.
303 See Other
302 Found와 비슷하지만, 변경된 리소스의 URI를 GET 메소드로 요청해야함을 명확히 나타낸다.
301, 302, 303 상태 코드가 반환되면 대부분의 브라우저는 POST를 GET으로 바꾸어 재송신한다. 이때, 엔티티 바디가 삭제된다. 301, 302의 공식 사양은 POST를 GET으로 바꾸는 것을 금지하고 있지만, 대부분의 구현은 이렇게 되어있다.
304 Not Modified
클라이언트가 조건부 리퀘스트를 했을 때 리소에 대한 접근은 허락하지만, 조건이 충족되지 않음을 나타낸다. 리스폰스 메시지 바디에 아무것도 포함되어 있어서는 안된다.
책에 내용에 조금 더 덧붙이자면, 304 Not Modified는 캐시를 목적으로 많이 사용한다. 클라이언트가 요청하고 있는 리소스의 캐시가 만료되지 않은 상황에서 리소스를 요청했을 때 서버의 데이터가 변경되지 않아 클라이언트가 가지고 있는 캐시 그대로 사용하면 된다고 알려줄 때 사용된다. 이에 관련된 내용은 별개의 포스트로 작성하겠다.
4XX 클라이언트 에러
400 Bad Request
리퀘스트 구문이 잘못되었음을 나타낸다. 클라이언트는 이 상태 코드를 수신했을 때, 리퀘스트 내용을 재검토하고 다시 송신해야한다.
401 Unauthorized
송신한 리퀘스트에 HTTP 인증 정보(BASIC 혹은 DIGEST 인증)가 필요하다는 것을 나타낸다. 혹은 이미 이와 같은 정보를 송신한 경우 인증에 실패했음을 나타낸다.
401을 반환할 경우 요청된 리소스에 적용되는 challenge를 포함한 WWW-Authenticate 헤더 필드를 포함할 필요가 있다.
403 Forbidden
요청된 리소스의 액세스가 권한에 문제가 있어 거부됨을 알린다. 서버측은 거부 이유를 엔티티 바디에 기재해서 유저측에 표시해야한다.
404 Not Found
요청된 리소스가 서버상에 존재하지 않음을 나타낸다. 혹은 요청을 거부하고 싶은데, 이유를 분명히 하고 싶지 않은 경우에도 사용할 수 있다.
500 서버 에러
500 Internal Server Error
서버에서 리퀘스트를 처리하는데 오류가 발생한 경우를 나타낸다.
503 Service Unavailable
일시적으로 서버가 과부하 상태 혹은 점검중인 상태일 때 반환한다. 서버는 Retry-After 응답 헤더 필드에 언제쯤 접속이 다시 가능할지 함께 보내는 것이 바람직하다.