0. 서론

이번 포스트에서는 HTTP Response Message에 포함되는 상태 코드(Status Code)들을 살펴보자.

1. TL;DR

  • HTTP 통신에서 서버는 응답 메시지에 요청에 대한 처리 결과를 알려주는 상태 코드를 포함시킨다.
  • 상태 코드는 1XX ~ 5XX의 범위로 표현되며, 세 번째 자릿수의 숫자에 따라 다음과 같은 의미를 포함한다.
    • 1XX : Informational - 요청을 받아 처리중
    • 2XX : Success - 요청을 정상적으로 처리하였음
    • 3XX : Redirection - 요청을 정상적으로 처리하기 위해 추가 동작이 필요함
    • 4XX : Client Error - 서버가 이해할 수 없는 요청이므로 클라이언트에 에러가 발생한 것 같음
    • 5XX : Server Error - 요청을 이해했으나 서버가 처리할 수 없으므로, 서버에 에러가 발생한 것 같음

2. 상태 코드(Status Code)

HTTP 프로토콜을 이용해 클라이언트가 서버에 동작을 요청하는 경우, 서버는 그 동작을 수행한 후 동작에 맞는 적절한 응답을 클라이언트에 회신한다. 그러나 모종의 이유로 인해 서버가 동작을 수행할 수 없는 경우가 존재할 수도 있다. 또는, 클라이언트가 회신을 필요로 하지 않는 동작을 요청한 경우도 존재할 수 있다. 대표적인 예가 파일 업로드이다.

만약 이러한 상황에서 클라이언트가 서버의 요청 처리 결과를 모른다면 그 이후 요청에서 문제가 발생할 확률이 높아진다. 따라서 이러한 문제들을 방지하기 위해 HTTP Protocol에서는 클라이언트의 요청에 대해 어떠한 경우라도 서버가 그 처리 결과를 응답 메시지에 포함시켜 클라이언트에 회신하도록 되어 있다.

이때 처리 결과를 나타내는 정보를 상태 코드(Status Code)라 하는데, 상태 코드는 세 자리의 자연수로 이루어져 있고, 이 중 백의 자릿수에 해당하는 숫자가 응답 클래스(Response Class)를 의미한다.

응답 클래스는 처리가 어떻게 진행되었는지를 설명하는 용도인데, 1~5의 범위를 가지며 아래와 같이 구분되어 있다.

Code Response Class Description
1XX Informational 요청을 정상적으로 받았으며 현재 처리중입니다.
2XX Success 요청을 정상적으로 처리 완료하였습니다.
3XX Redirection 요청을 정상적으로 처리하기 위해 추가적인 동작이 필요합니다.
4XX Client Error 서버가 이해할 수 없는 요청입니다.
5XX Server Error 요청을 이해하였으나 현재 서버가 이를 처리할 수 없습니다.

보통 응답 클래스를 제외한 나머지 두 자릿수도 RFC에 명시된 코드를 사용하지만, 응답 클래스를 처리 결과에 맞게 잘 지정한다면 나머지 자릿수에 프로그래머가 직접 설정한 코드를 명시할 수도 있다. 만약 이러한 경우라면 클라이언트와 서버가 서로 코드에 따른 대응 동작을 잘 합의해야 할 것이다.

2XX 성공(Success)

2XX 응답 클래스는 리퀘스트가 정상적으로 처리되었음을 나타내는데 이 중에도 여러가지 세부 코드가 존재한다.

200 OK

200 OK 상태 코드는 리퀘스트가 완벽히 처리되었으며, 그 결과를 함께 반환한다는 뜻이다. 그러나 만약 HEAD Method와 같이 별도의 리소스를 요청하지 않은 경우에는 리스폰스 메시지의 바디가 빈 채로 회신하게 된다.

204 No Contact

204 No Contact 상태 코드는 리퀘스트가 완벽히 처리되었으나 회신할 리소스가 존재하지 않으므로 바디를 비운 채로 반환한다는 의미이다. 따라서 어떠한 엔티티 바디를 되돌려 보내서도 안되며, 클라이언트 사이드에서 브라우저 상태가 변하는 일이 없어야 한다.

206 Partial Content

직전 포스트에서 살펴 본 Range Request 방식의 요청에 대한 처리가 정상적으로 이루어졌을 때 반환하는 상태 코드이다. 이를 풀어서 설명하면 ‘클라이언트가 리소스의 일부분만을 요청했으므로, 그 요청에 따라 리소스의 일부분을 포함시켜 회신하겠다’ 라는 뜻이다.

따라서 엔티티 바디에는 클라이언트가 명시한 바이트 범위의 리소스가 포함되게 된다.

3XX 리디렉션(Redirection)

3XX 응답 클래스는 리퀘스트가 정상적으로 처리를 종료하기 위해 브라우저 측에서 추가 동작을 해 주어야 함을 의미한다.

301 Moved Permanently

클라이언트가 지정한 리소스의 URI가 서버상에서 변경되었기 때문에 앞으로 클라이언트도 새로운 URI를 통해 리소스를 참조해야 한다는 것을 나타내는 상태 코드이다. 만약 특정 URI를 북마크하고 있다면 북마크를 다시 하는게 좋다는 것을 의미하기도 한다.

301이 발생하는 가장 흔한 상황은 디렉터리 지정 시 마지막 부분에 슬래시를 붙이는 것을 잊은 경우 등이 존재한다.

http://example.com/sample

>>> 301 Moved Permanently

http://example.com/sample/

>>> 200 OK

302 Found

클라이언트가 지정한 리소스가 서버에선 새로운 URI로 할당되어 있기 때문에 그 URI를 참조해 달라는 의미의 상태 코드이다.

301 Moved Permanently와 동일한 의미 아닌가 생각할 수 있지만, 302 Found는 301 Moved Permanently와 달리 일시적으로 URI가 재할당된 경우에 사용된다. 따라서 해당 URI를 북마크하고 있다면 301과 달리 그 북마크를 유지해야 한다.

303 See Other

클라이언트가 지정한 리소스가 다른 URI에 존재하므로 GET Method를 사용해서 얻어야 함을 나타내는 상태 코드이다.

302 Found와 완전히 동일한 의미이지만 리다이렉트 장소를 GET Method를 사용해 얻어야 한다고 명시한다는 점에서 조금 더 구체적이다.

따라서 클라이언트가 POST등의 다른 메소드를 이용해 서버에 요청 메시지를 전달했을 때 303 상태 코드가 회신될 경우 지정해준 새 URI에 GET 메소드를 이용해 리디렉션 해야 한다.

304 Not Modified

클라이언트가 조건부 요청을 했을 때 리소스에 대한 접근은 허용하지만 그 조건이 충족되지는 않았음을 의미하는 상태 코드이다.

따라서 304 Not Modified를 되돌려 줄 때에는 메시지 바디에 어떠한 정보도 포함시켜선 안 된다.

307 Temporary Redirected

302 Found와 같은 의미를 가지지만 302 Found의 경우 GET으로의 메소드 치환을 금지해 놓았지만 실제로는 치환을 하는 경우가 잦은데, 307의 경우 이를 명확히 금지했다는 차이가 있다.

따라서, 종합해보면 어떤 URI가 일시적으로 변경되었을 때 상태 코드에 따라 다음 의미를 가진다.

Status Code Description Difference
302 Found URI가 일시적으로 변경되었음. 메소드 치환을 권장하지 않으며, 변경된 URI로 접근하길 바람
303 See Other URI가 일시적으로 변경되었음. 반드시 메소드를 GET으로 치환해 변경된 URI로 접근하길 바람
307 Temporary Redirected URI가 일시적으로 변경되었음. 반드시 메소드를 치환하지 말고 그대로 변경된 URI로 접근하길 바람

4XX 클라이언트 에러(Client Error)

400 Bad Request

클라이언트에서 요청한 메시지의 구문이 올바르지 않음을 의미하는 상태 코드이다. 이 코드를 전달받은 클라이언트는 리퀘스트 내용을 재검토 후 다시 요청해야 한다. 다만 브라우저 상에서는 별도의 동작이 없으면 200 OK와 동일하게 취급한다.

401 Unauthorized

클라이언트가 송신한 요청에 해당하는 리소스가 인증 정보가 있어야만 접근할 수 있음을 의미하는 상태 코드이다.

만약 401 Unauthorized에 해당하는 리퀘스트가 2번 이상 수행된 경우라면 유저 인증에 실패했음을 의미하기도 한다.

401 Unauthorized 상태 코드를 포함한 리스폰스를 반환하는 경우에는 리퀘스트 된 리소스에 적용되는 챌린지를 포함한 WWW-Authenticate 헤더 필드를 포함해야 한다.

403 Forbidden

요청한 리소스의 액세스가 거부되었음을 나타내는 상태 코드이다.

이 때 액세스가 거부된 자세한 이유는 엔티티 바디에 기재해 반환한다.

404 Not Found

요청한 리소스가 서버 상에 존재하지 않음을 나타내는 상태 코드이다. 이외에도 액세스를 거부하지만 그 이유는 알려주고 싶지 않을 때 403 Forbidden 대신 이용하기도 한다.

5XX 서버 에러(Server Error)

500 Internal Server Error

서버에서 요청에 대한 처리를 진행하는 중 에러가 발생한 경우 사용하는 상태 코드이다. 웹 어플리케이션에 에러가 발생한 경우나 혹은 단순히 일시적인 에러가 발생한 경우일 수도 있다.

503 Service Unavailable

일시적으로 서버가 과부하 상태이거나 점검 중이어서 리퀘스트를 처리할 수 없는 경우를 나타내는 상태 코드이다. 만약 응답 메시지 작성 시 이 상태가 해소되기 전까지 어느 정도 시간이 걸리는 경우라면 Retry-After 헤더 필드에 따라 클라이언트에 전달하는 것이 바람직하다.