제 4장. 결과를 전달하는 HTTP 상태 코드

Posted by , August 03, 2024
HTTP

💡 본 포스트는 "그림으로 배우는 HTTP & Network Basic" 라는 책을 읽고 내 생각과 책 내용을 인용하여 작성했다.

상태 코드는 서버로부터 리퀘스트 결과를 전달한다

클라이언트가 서버를 향해 요청을 보낼 때 서버에서 그 결과가 어떻게 되었는지 알려주는 것이 상태코드의 역할이다. 서버가 요청을 정상적으로 처리했는지, 그렇지 않다면 요청 결과가 에러였는지를 알 수 있다.

상태 코드는 클래스는 아래와 같이 5가지 종류로 정의되어있다.

  • 1xx (Informational) : 요청을 받아들여 처리중인 상태
  • 2xx (Success) : 요청을 정상적으로 처리한 상태
  • 3xx (Redirection) : 요청을 완료하기 위해서 추가 동작이 필요한 상태
  • 4xx (Client Error) : 서버가 요청을 이해 불가능한 상태
  • 5xx (Server Error) : 서버가 요청 처리를 실패한 상태

HTTP 상태코드는 RFC2616 에 실려있는 것 만으로도 40개 종류가 넘고, 게다가 WebDAV 와 Addational HTTP Status Codes 등의 확장을 포함하면 60종류 이상이 존재한다. 하지만 실제로 자주 사용되고 있는 것은 그 중에서 14가지 종류 정도이다. 여기선 대표적인 154개의 상태 코드에 대해 학습하도록 한다.

2xx 성공 (Success)

2xx 응답은 클라이언트가 전송한 요청을 서버가 정상적으로 처리했음을 나타내는 것이다. 응답에서 상태코드와 함께 되돌아 오는 정보는 메소드에 따라 다르다. 예를들어 GET 메소드는 요청된 리소스에 대응하는 엔티티가 응답로 보내지고, HEAD 메소드는 요청된 리소스에 대응하는 엔티티 헤더 필드가 Message Body 를 동반하지 않고 응답으로 되돌아온다.

204 No Content

이 응답은 서버가 요청을 받아서 처리하는데는 성공했지만, 응답에 엔티티 바디를 포함하지 않는다. 또한, 어떠한 엔티티 바디를 되돌려 보내서도 안된다. 클라이언트에서 서버에 정보를 보내는 것만으로 충분하고, 클라이언트에게 새로운 정보를 보낼 필요가 없는 경우에 사용된다.

206 Partial Content

Range 에 의해서 범위가 지정된 요청에 의해서 서버가 GET 요청을 부분적으로 응답받았음을 나타낼 때 사용한다. 응답에는 Content-Range 로 지정된 범위의 엔티티가 포함된다.

3xx 리다이렉트(Redirectiono)

3xx 응답은 요청이 정상적으로 처리를 종료하기 위해 브라우저 측에 특별한 처리를 수행해야 함을 나타낸다.

301 Moved Permanently

요청된 리소스에 새로운 URI 가 부여되어 있기 때문에, 이후로는 그 리소스를 참조하는 URI 를 사용해야 한다는 것을 나타내고 있다. 결국 북마크하고 있는 경우에는 Location 헤더 필드에서 가리키고 있는 URI 에 북마크를 다시 하는게 좋다는 것을 나타내고 있다.

301 이 발생하는 상황 예시로는 디렉토리를 지정했을 때 마지막 부분에 슬래시 "/" 를 붙이는 것을 잊은 경우 등이 해당한다.

302 Found

요청된 리소스에는 새로운 URI 가 할당되어 있기 떄문에, 그 URI 를 참조해 주길 바란다는 의미를 나타낸다. 301 Moved Permanently 와 비슷하지만, 302 는 영구적인 이동이 아닌, 어디까지나 일시적인 것이다. 결국, 이동하는 곳의 URI 는 앞으로 이동될 가능성이 있다. 예를들면, 북마크하고 있는 경우네는 301의 경우와 같이 북마크를 변경하지 않고, 계속해서 302를 돌려준 페이지에 대해서 북마크해야 한다.

303 See Ohter

이 응답은 요청에 대한 리소스는 다른 URI 에 있기 떄문에 GET 메소드를 사용해서 얻어야 한다는 것을 나타내고 있다. 이것은 302 Found 와 같은 기능이지만, 리다이렉트 장소를 GET 메소드로 얻어야 한다고 명확하게 되어 있다는 점이 302 와 다르다.

예를들어, POST 메소드로 엑세스한 CGI 프로그램을 실행한 후에 처리 결과를 별도의 URI 에 GET 메소드로 리다이렉트 시키고 싶은 경우 등에 303 이 사용되고 있다. 302 Found 도 가능하지만, 303 을 사용하는 것이 더 바람직하다.

304 Not Found

이 응답은 클라이언트가 조건부 요청을 했을 때 리소스에 대한 엑세스는 허락하지만, 조건이 충족되지 않음을 표현한다. 304 를 되돌려 줄 경우에는 응답 바디에 어떤 것도 포함되어 있어서는 안된다. 304 는 3xx 에 분류되어 있지만, 리다이렉트와는 연관이 없다.

307 Temporary Redirect

302 Found 와 같은 의미를 지니지만, 302 는 POST 로 부터 GET 으로 치환이 금지되어 있는데도 불구하고 구현상 그와 같이 되어 있지는 않다. 307 에서는 브라우저 사양에 따라 POST 에서 GET 으로 치환하지 않는다. 단지, 브라우저마다 응답을 처리하는 동작이 다를 경우가 있다.

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

400 Bad Request

이 응답은 요청 구문이 잘못되었음을 나타내고 있다. 이 애러가 발생한 경우, 요청 내용을 다시 재컴토하고 나서 재송신할 필요가 있다.

401 UnAuthorized

송신한 요청에 HTTP 인증 정보가 필요하다는 것을 나타낸다. 즉, 유저 인증(Authentication)에 실패했음을 나타낸다.

403 Forbidden

인증(Authentication) 에는 성공했지만, 요청된 리소스의 엑세스가 거부되었음을 나타낸다. 즉, 인가(Authorization) 에 실패했음을 나타낸다. 서버 측은 거부의 이유를 분명히 하여 클라이언트에게 전달할 필요가 있는데, 이유를 명확하게 하는 경우에는 엔티티 바디에 기재해서 유저 측에 표시한다.

403 이 발생한 원인으로는 파일 시스템의 권한(permission) 이 부여되지 않은 경우와, 엑세스 권한에 문제(허가되지 않은 송신 IP 주소의 엑세스 등) 가 있는것을 예로 들 수 있다.

404 Not Found

요청한 리소스가 서버에 존재하지 않음을 나타낸다.

5xx 서버 에러(Server Error)

500 Internal Server Error

서버에서 요청을 처리하는 도중에 에러가 발생했음을 나타낸다. 웹 애플리케잇녀에 에러가 발생한 경우나 일시적인 경우도 해당한다.

503 Service Unavailable

일시적으로 서버가 과부하 상태이거나 점검중이기 때문에 현재 요청을 처리할 수 없으을 나타낸다. 이 상태가 해소되기까지 시간이 걸리는 경우에는 Retry-After 헤더 필드에 따라 클라리언트에 전달하는 것이 바람직하다.

💡 상태 코드가 현재 상황과 불일치할 수도 있다 응답으로 되돌아오는 상태코드의 대부분은 유저가 다른 내용을 알기 어렵게 되엉씨다. 흔히 있는 상황으로, 웹 애플리케이션에서 애플리케이션 에러가 발생한 겨웅에도 상태 코드로 200 OK 가 되돌아오는 경우가 있다.

Haon
꾸준히, 배움에 대한 생각을 글로 정제하기 위한 블로그입니다.
gatsby-starter-haonkakaotech