HTTP 상태코드는 클라이언트가 보낸 요청의 처리 상태를 응답에서 알려주는 기능을 한다. 100 부터 500대까지의 상태 코드가 있고 각각의 의미를 아래와 같다.
100번대는 거의 사용을 하지 않는다. 클라이언트가 인식할 수 없는 상태코드를 서버가 반환하면 클라이언트는 상위 상태코드로 해석해서 처리한다. 예를 들어 인식할 수 없는 299 코드를 보내면 2xx (Successful)로 해석하여 처리한다. 이러한 특성은 미래에 새로운 상태코드가 추가되어도 클라이언트를 변경하지 않아도 된다는 것을 뜻한다.
200 OK
요청 성공
201 Created
요청 성공해서 새로운 리소스가 생성됨, 생성된 리소스는 응답의 Location 헤더 필드로 식별한다.
202 Accepted
요청이 접수되었으나 처리가 완료되지 않은 상태, 배치 처리 같은 곳에서 사용한다.
204 No Content
서버가 요청을 성공적으로 수행했지만, 응답 페이로드 본문에 보낼 데이터가 없음, 예를 들어 블로그를 쓰다가 임시저장 버튼을 누르는 경우! 버튼을 눌러도 같은 화면을 유지해야 한다.
요청을 완료하기 위해 유저 에이전트(웹 브라우저)의 추가적인 조치가 필요하다. 웹 브라우저는 3xx 응답의 결과에 Location 헤더가 있으면, Location 위치로 자동 리다이렉트를 한다.
자동 리다이렉트의 흐름은 아래와 같다.
웹 브라우저의 요청에 대해 Location이 포함된 300대 응답을 보내면 웹 브라우저는 해당 Location으로 다시 요청을 보내게 되는 것이다.
리다이렉션의 종류에는 3가지가 있는데 한 번 알아보자.
특정 리소스의 URI가 영구적으로 이동하는 경우, 예를 들어 /members
가 /user
로 영구적으로 바뀌어 더이상 /members
를 쓰지 않는 경우이다. 검색 엔진 등에서도 변경을 인지할 수 있다.
301 Move Permanently
리다이렉트 시 요청 메서드가 GET으로 변하며 본문(body)이 제거될 수도 있다.(보통은 GET으로 바뀌고 본문 제거됨)
308 Permanent Redirect
301과 기능은 같으나 리다이렉트 시 요청 메서드와 본문을 유지한다.
하지만 보통은 301을 사용한다. /members
308 POST로 요청이 와도 다시 /user
로 redirect하는 경우 필요한 데이터도 바뀌므로 실무에서는 보통 GET으로 돌린다고 한다!
주문완료 후 주문 내역 화면으로 이동하는 등 일시적으로 변경하는 경우이다. PRG(Post/Redirect/Get) 패턴이 주로 사용된다.
🌟PRG패턴이란
Post - Redirect - Get
POST로 주문 후에 주문 결과 화면을 GET 메서드로 리다이렉트한다. 이렇게 하면 새로고침을 해도 결과 화면을 GET으로 조회하기 때문에 중복주문이 되지 않고 결과 화면을 계속 GET요청하게 된다. 만약 redirect를 GET이 아닌 POST를 유지한다면 새로고침할 때마다 중복주문이 들어가는 문제가 발생할 수 있다.
302 Found
리다이렉트 시 요청 메서드가 GET으로 변하고, 본문이 제거될 수 있다.(보통 제거됨)
302의 스펙이 모호하여 307과 303이 나왔으나 실무에서는 아직 302가 많이 쓰인다고 한다!
307 Temporary Redirect
302와 기능은 같으나 리다이렉트 시 요청 메서드와 본문이 유지된다.(변경하면 안됨)
303 See Other
302와 기능은 같으나 리다이렉트 시 요청 메서드가 GET으로 변경된다.
결과 대신 캐시를 사용한다.
클라이언트의 요청에 잘못된 문법 등으로 서버가 요청을 수행할 수 없을 때, 즉 오류의 원인이 클라이언트에 있을 때 사용한다.
400대 오류와 500대 오류의 차이에서 가장 중요한 점은 클라이언트가 똑같은 요청을 보내도 400대 오류 상황에서는 요청을 처리할 수 없으나 500대 오류에서는 나중에 요청을 처리할 수 있다는 것이다.
400 Bad Request
요청 파라미터가 잘못되었거나 API 스펙이 맞지 않는 등 요청 구문, 메시지 등에 오류가 있는 경우이다.
401 Unauthorized
인증이 되지 않은 경우이다.
403 Forbidden
주로 인증 자격 증명은 있지만 접근 권한이 불충분한 경우 서버가 요청을 이해했으나 승인을 거부한다는 의미로 사용된다.(일반 유저가 어드민 페이지에 접근하려고 하는 경우)
404 Not Found
요청 리소스가 서버에 없는 경우, 또는 클라이언트가 권한이 부족한 리소스에 접근할 때 해당 리소스를 숨기고 싶을 때에도 사용한다.
서버 문제로 오류가 발생한 경우로, 서버에 문제가 있기 때문에 재시도하면 성공할 수도 있다.
500 Internal Server Error
서버 내부 문제로 오류가 발생한 경우, 애매하면 500오류
503 Service Unavailable
서비스 이용 불가!! 서버가 일시적 과부하 또는 예정된 작업으로 잠시 요청을 처리할 수 없는 경우이다.