클라이언트가 보낸 요청의 처리 상태를 응답에서 숫자로 표현하여 알려주는 기능이다. 보통
100~500
사이의 숫자로 표현된다.
☑️ 1xx(informational)
: 요청이 수신되어 처리중
☑️ 2xx(Successful)
: 요청 정상 처리
☑️ 3xx(Redirection)
: 요청을 완료하려면 추가 행동이 필요
☑️ 4xx(Client Error)
: 클라이언트 오류, 잘못된 문법등으로 서버가 요청을 처리할 수 없음.
☑️ 5xx(Server Error)
: 서버 오류, 서버가 정상요청을 처리하지 못함.
참고❗ 만약, 클라이언트가 인식할 수 없는 상태코드를 서버로부터 받으면, 상위 상태 코드로 해석하여 처리한다. 따라서 미래에 새로운 상태코드가 추가되어도 클라이언트를 변경하지 않아도 된다.
299 ???
➡️ 2xx(Successful)
451 ???
➡️ 4xx(Client Error)
599 ???
➡️ 5xx(Server Error)
요청이 수신되어 처리중인 상태
☑️ 거의 사용되지 않는다.
클라이언트의 요청을 성공적으로 처리한 상태
☑️ 200 OK
GET
과 같은 조회 요청에 대하여 성공적으로 요청을 받아서 결과를 정상적으로 처리해 응답할 경우 해당 상태코드를 반환한다.☑️ 201 Created
Location
헤더 필드로 인식한다.☑️ 202 Accepted
예) 요청 접수 1시간 뒤에 배치 프로세스가 요청을 처리할 경우등에 사용
☑️ 204 No Content
예) 웹문서 편집기에서 저장버튼을 눌렀을 경우 그 요청결과로 딱히 어떤 응답 내용이 필요하지는 않다. 결과 내용 없이도 204코드만으로 요청 성공을 인식하기만 하면된다.
요청을 완료하기위해 유저 에이전트의 추가 조치가 필요한 경우의 상태코드이다. 유저 에이전트는 주로 웹 브라우저를 말한다.
☑️ 300 Multiple Choices
: 사용하지 않는다.
☑️ 301 Moved Permanently
: 리다이렉트시 요청 메서드가 GET으로 변하고 본문이 제거될 수 있음.
☑️ 302 Found
: 리다이렉트시 요청 메서드가 GET으로 변하고 본문이 제거될 수 있음.
☑️ 303 See other
: 리다이렉트시 요청 메서드가 GET으로 변경
☑️ 304 Not Modified
: 캐시를 목적으로 사용하며 응답에 메시지 바디를 포함하지 않는다.
☑️ 307 Temporary Redirect
: 리다이렉트 요청 메서드와 본문을 유지한다.
☑️ 308 Permanent Redirect
: 리다이렉트시 요청메서드와 본문을 유지한다.
웹 브라우저는
3xx
응답의 결과에Location 헤더
가 있으면,Location 위치
로 자동 이동(리다이렉트)
[자동 리다이렉션의 흐름]
☑️ 영구 리다이렉트 : 특정 리소스의 URI가 영구적으로 이동
예1) /members ➡️ /users
예2) /event ➡️ /new-event
☑️ 일시 리다이렉션 : 일시적인 변경
주문완료 후 주문 내역 화면으로 이동
PRG : POST/Redirect/GET
☑️ 특수 리다이렉션
결과 대신 캐시를 사용
특정 리소스의
URI
가 영구적으로 이동된다. 이전URI
는 사용하지 않는다. 검색엔진에서도URI
변경을 인지하여 새로운URI
를 적용한다.
[301 Moved Permanently]
GET
으로 변하고 본문이 제거될 수 있다. 그럼 다시 POST
로 기존의 메시지를 보내 요청한다.[308 Permanent Redirect]
POST
를 사용했다면 리다이렉트시에도 POST
를 유지해야 한다.리소스의
URI
가 일시적으로 변경된다. 따라서 검색 엔진등에서URI
를 변경하면 안된다.
☑️ 302 Found
☑️ 307 Temporary Redirect
☑️ 303 See Other
☑️ 302
, 303
, 307
세가지의 상태코드 기능은 거의 동일하다.
예를 들어 POST를 사용하여 주문 요청 처리 후 웹 브라우저를 새로고침하면 어떻게 될까? ➡️ 새로 고침은 재요청이므로 주문이 중복 처리될 수 있다.
[PRG 사용전]
POST
로 주문을 요청하면 주문 데이터에 주문을 저장한 뒤 처리완료 응답을 한다. [PRG 사용후]
GET
으로 리다이렉트하게하면 새로고침을 해도 GET
조회만 발생한다. 중복주문 대신 결과 화면만 요청하는 것이다.POST
로 주문을 요청하면 서버는 응답시 200
이 아닌 302
나 303
코드를 응답한다. 그럼 클라이언트가 상태코드를 확인하고 GET
으로 자동 리다이렉트 하도록 한다. 즉, 새로고침을 해도 GET
결과 화면만 다시 요청하는 것이다.참고❗ 처음
302
상태 코드의 스펙은HTTP 메서드
를 유지하는 것이었다. 하지만 대부분의 웹 브라우저들이GET
으로 바꾸어 버렸고 대안으로303
과307
이 등장했다.
303
과307
을 권장하지만 많은 애플리케이션과 라이브러리들이 302를 이미 사용하고 있으므로 자동 리다이렉션시에GET
으로 변해도 상관없다면302
상태코드를 사용해도 된다.
☑️ 300 Multiple Choices
☑️ 304 Not Modified
GET
, HEAD
요청시 사용클라이언트가 잘못된 요청을해서 서버가 요청을 수행할 수 없을때 사용하는 상태코드이다. 오류의 원인이 클라이언트에 있기 때문에 같은 요청을 재시도해도 성공할 수 없다.
☑️ 400 Bad Request
500
오류로 서버문제로 넘어가지 않게 해야한다.☑️ 401 Unauthorized
WWW-Authenticate
헤더와 함께 인증 방법을 설명해야 한다.Unauthorized
이지만 인증이 되지 않았을 때 발생하는 상태이다.☑️ 403 Forbidden
☑️ 404 Not Found
서버에 문제가 생겨 발생하는 오류이다. 따라서 서버 복구시 같은 요청을 재시도하면 성공할수도 있다.
☑️ 500 Internal Server Error
☑️ 503 Service Unavailable
Retry-After
헤더필드로 얼마뒤에 복구되는지 보낼 수 있다.참고❗ 서버는 비즈니스 로직상 발생하는 문제를 500 오류로 처리해서는 절대 안된다. 진짜 서버에 문제가 터졌을 경우에만 발생시켜야한다.
예) 잔고가 부족하거나 필요한 연령제한을 못넘겨서 발생하는 예외는 비즈니스 로직상 정상 예외 케이스이므로 2xx 또는 4xx 상태코드로 해결하고 DB에러 등 서버자체에서 발생하는 문제일 경우에만 500에러로 처리하도록 한다.
[Reference]
gparkkii.log
Catsbi's Dlog
김영한 - HTTP 웹 기본지식 강의
Mozilla
kyun2da.dev
개발왕 도던