이 글은 그림으로 배우는 HTTP & Network와 HTTP 완벽 가이드 서적을 참고해 작성하였습니다.
클라이언트가 서버로 요청했을때 서버에서 그 결과가 어떻게 처리되었는 지를 알려주는 것이 Status Codes
의 역할이다. 이를 통해서 서버가 요청을 정상적으로 처리했는지 아니면 에러가 발생했는지를 클라이언트에서 알 수 있다.
HTTP 명세에 따르면, 상태 코드
는 3자리 숫자와 그에 대한 설명을 나타내는데 팀 내부적으로 3자리 이상의 숫자를 커스텀하게 사용할 수도 있다.
아래는 HTTP 명세 표준을 나타낸 것인데, 3자리 숫자 중 첫 번째 자리의 숫자로 의미를 구분한다.
그럼 각 클래스 별로 대표적인 상태 코드를 하나씩 살펴보자.
2XX
상태 코드는 서버가 요청을 정상적으로 처리했다는 것을 의미한다.
클라이언트가 보낸 요청을 서버가 정상 처리했다는 것을 나타내고, 요청 메소드에 따라 응답 본문은 달라진다.
예를 들어, GET 메소드 경우에는 요청에 대응하는 엔티티가 응답으로 보내진다.
204
상태 코드는 서버가 요청을 정상적으로 처리했지만 응답 메시지에 Entity Body
를 포함하지 않는다는 것을 의미한다.
204
상태 코드는 클라이언트에 보낼 새로운 정보가 없을 경우에 사용된다.
206
상태 코드는 Range
헤더를 가진 GET
요청을 받았다는 것을 의미함과 동시에, Range
헤더에 의해서 지정된 범위에 해당하는 리소스를 Entity Body
로 응답했다는 것을 의미한다.
3XX
상태 코드는 전달받은 요청을 정상적으로 완료하기 위해서, 브라우저 측에 추가적인 처리가 필요함을 의미한다.
301
상태 코드는 요청에 대응하는 리소스가 다른 URI로 이동했으므로, 해당 리소스를 참조하기 위해서는 변경된 URI로 요청을 다시 보내야 한다는 것을 의미한다.
301
상태 코드를 받은 브라우저는 Location
응답 헤더를 참고해서 재요청을 보낸다.
HTTP/1.1 301 Moved Permanently
Location: http://www.something.com/index.html
302
상태 코드도 301
과 유사하게 리소스에 새로운 URI가 할당되었음을 의미하지만, 일시적인 이동임을 나타낸다.
또한, 302
상태 코드도 브라우저가 Location
응답 헤더를 참고해서 재요청을 보낸다.
굳이 일시적인 이동인 것을 나타내는 이유는 검색 엔진(봇)에서 새로운 URI로 링크를 갱신하지 않게 하기 위함이다.
303
상태 코드는 요청에 대한 리소스가 다른 URI에 있기 때문에 반드시 GET 메소드를 사용해서 요청해야 한다는 것을 의미한다.
302
와 유사하지만, 리다이렉트 장소에 GET 메소드로 요청해야 한다는 것을 명확하게 지정한다.
예를 들어, 어떠한 작업을 POST 메소드로 처리하고 결과를 별도의 URI에서 GET 메소드로 리다이렉트 시키고 싶은 경우 303
상태 코드를 사용한다.
304
상태 코드는 클라이언트가 조건부 요청한 경우에 리소스에 대한 접근은 허락하지만, 조건이 충족되지 않았음을 의미한다.
주로 캐시에서 If-None-Match
또는 If-Modified-Since
헤더에 대한 응답에서 사용되고, 반드시 응답 Entity Body
에 아무 것도 포함해선 안된다.
307
상태 코드는 302
와 같은 의미지만, 메소드가 변경되지 않고 Location
응답 헤더로 리다이렉트한다.
4XX
상태 코드는 클라이언트의 원인으로 에러가 발생했다는 것을 의미한다.
400
상태 코드는 요청 구문이 잘못되었다는 것을 의미한다.
400
상태 코드를 받으면, 요청 내용을 다시 검토해 재요청할 필요가 있다.
브라우저는 이에 대한 대응을 따로 하지 않습니다.
401
상태 코드는 요청한 Request Message
에 HTTP 인증 정보가 필요하다는 것을 의미한다.
401
응답은 리소스를 얻기 위해 필요한 인증 정보를 WWW-Authenticate
헤더에 포함해 전달한다.
HTTP/1.1 401 Unauthorized
Date: Fri, 23 Oct 2009 11:32:20 GMT
WWW-Authenticate: Basic realm="Access to staging site"
403
상태 코드는 요청한 리소스의 접근이 권한때문에 거부되었다는 것을 의미한다.
리소스의 접근이 거부 이유에 대해서는 Entity Body
에 전달할 수 있는데, 반드시 이유를 전달하는 것을 권장한다.
404
상태 코드는 요청한 리소스가 서버상에 없다는 것을 의미한다.
404
상태 코드를 서버측에서 해당 요청에 대해 거부하는 경우에도 사용할 수 있는데, 이러한 경우에는 클라이언트 입장에서는 Not Found
의미와 다르기 때문에 헷갈리게 하는 구석이 있다.
이러한 모호함을 그나마 해소하기 위해서는 Entity Body
에 거부 이유를 명확하게 기재하는 것을 권장한다.
만약 리소스가 영구적으로 삭제되었다는 의미를 나타내기 위해서는 404
가 아닌 410(Gone)
상태 코드를 사용해야 한다.
5XX
상태 코드는 서버 원인으로 에러가 발생하고 있음을 의미한다.
500
상태 코드는 서버에서 요청을 처리하는 도중에 예기치 못한 에러가 발생했다는 것을 의미한다.
500
에러는 서버 에러 총칭하는 의미이기 때문에 이유가 될만한 구체적인 내용은 Entity Body
에 포함하는 것을 권장한다.
503
상태 코드는 일시적으로 서버가 과부하 상태이거나 점검중이기 때문에 현재 요청을 처리할 수 없다는 것을 의미한다. 즉, 서버가 요청을 처리할 준비가 되지 않았음을 나타낸다.
또한, 서비스 복구하기 위한 예상 시간을 Retry-After
응답 헤더에 전달하는 것을 권장한다.