📗 Reference
모든 개발자를 위한 HTTP 웹 기본 지식
🟢 2xx (Successful)
- 200 : OK
- 201 : Created
- 202 : Accepted
- 204 : No Content
2xx : 클라이언트의 요청을 성공적으로 처리
* 200 : 서버에서 결과를 정상적으로 잘 처리해서 응답을 하면 200 OK
* 201 : 요청 성공해서 새로운 리소스가 생성되는데, 생성된 리소스는 응답의 Location 헤더 필드로 식별
* 202 : 요청이 접수되었으나 처리가 완료되지 않은 상태
* 204 : 서버가 요청을 성공적으로 수행했지만, 응답 페이로드 본문에 보낼 데이터가 없을 경우
🟢 3xx (Redirection)
- 300 : Multiple Choices
- 301 : Moved Permanently
- 302 : Found
- 303 : See Other
- 304 : Not Modified
- 307 : Temporary Redirect
- 308 : Permanent Redirect
- 300은 잘 쓰지 않고 301 ~ 308 까지가 중요
3xx : 요청을 완료하기 위해 유저 에이전트의 추가 조치 필요
🟣 리다이랙션의 이해
- 리다이랙트란? 웹 브라우저가 3xx 응답의 결과에 Location 헤더가 있으면, Location 위치로 자동 이동하는 것

🟣 영구 리다이렉션 - 301 (Moved Permanently)

- 리소스의 URI가 영구적으로 이동
- 원래의 URL을 사용하지 않고, 검색 엔진 등에서도 변경 인지
- 리다이렉트시 요청 메서드가 GET으로 변하고, 본문이 제거될 수 있음
🟣 영구 리다이렉션 - 308 (Permanent Redirect)

- 301과 기능은 같음
- 리다이렉트시 요청 메서드와 본문 유치(처음 POST를 보내면 리다이렉트도 POST 유지)
🟣 일시적인 리다이렉션 - 302 (Found)
- 리소스의 URI가 일시적으로 변경
- 따라서 검색 엔진 등에서 URL을 변경하면 안 됨
- 리다이렉트시 요청 메서드가 GET으로 변하고, 본문이 제거될 수 있음
🟣 일시적인 리다이렉션 - 307 (Temporary Redirect)
- 302와 기능은 같음
- 리다이렉트시 요청 메서드와 본문 유지 (요청 메서드를 변경하면 안 됨)
🟣 일시적인 리다이렉션 - 303 (See Other)
- 302와 기능은 같음
- 리다이렉트시 요청 메서드가 GET으로 변경
🟣 PRG: Post/Redirect/Get 예시

- POST로 주문후에 웹 브라우저를 새로고침하면?
- 새로고침은 다시 요청 -> 중복 주문이 될 수 있다.

- POST로 주문후에 새로 고침으로 인한 중복 주문 방지
- POST로 주문후에 주문 결과 화면을 GET 메서드로 리다이렉트
- 새로고침해도 결과 화면을 GET으로 조회
- 중복 주문 대신에 결과 화면만 GET으로 다시 요청
<==3xx 정리==>
- 302 Found -> 요청 메서드가 GET으로 변하고 본문이 제거될 수 있음
- 307 Temporary Redirect -> 요청 메서드와 본문 유지
- 303 See Other -> 요청 메서드가 GET으로 변경
- 307, 303을 권장하지만 많은 애플리케이션 라이브러리들이 302를 기본값으로 사용하기 때문에 GET으로 자동 리다이렉션시 변해도 되면 302를 사용해도 됨
- 300 Multiple Choices -> 거의 쓰지 않음
- 304 Not Modified -> 캐시를 목적으로 사용
🟢 4xx (Client Error)
- 400 : Bad Request
- 401 : Unauthorized
- 403 : Forbidden
- 404 : Not Found
4xx : 클라이언트 오류
- 오류의 원인이 클라이언트에 있음
- 클라이언트가 이미 잘못된 요청, 데이터를 보내고 있기 때문에 똑같은 재시도가 실패
🟣 400 (Bad Request)
- 클라이언트가 잘못된 요청을 해서 서버가 요청을 처리할 수 없음
- ex) 잘못된 요청 파라미터, 맞지 않는 API 스펙
🟣 401 (Unauthorized)
- 인증(Authentication)이 되지 않았을 때 발생
- 클라이언트가 해당 리소스에 대한 인증이 필요
- 401 오류 발생시 응답에 WWW-Authenticate 헤더와 함께 인증 방법을 설명해야함
🟣 403 (Forbidden)
- 서버가 요청을 이해했지만 승인을 거부함
- ex) 어드민 등급이 아닌 사용자가 로그인은 했지만, 어드민 등급의 리소스에 접근하는 경우
🟣 404 (Not Found)
- 요청 리소스를 찾을 수 없음
- 권한이 부족한 클라이언트가 리소스에 접근할 때 403처럼 접근 금지가 아닌 해당 리소스를 숨기고 싶을 때 사용
🟢 5xx (Server Error)
- 500 : Internal Server Error
- 503 : Service Unavailable
5xx : 서버 문제로 오류 발생
🟣 500 (Internal Server Error)
🟣 503 (Service Unavailable)
- 서비스 이용 불가
- 서버가 일시적인 과부화 또는 예정된 작업으로 잠시 요청을 처리할 수 없음
- Retry-After 헤더 필드로 복구 예상 시간을 보낼 수 있음
- 하지만 이러한 오류는 예측 불가능하기 때문에 503보다 바로 500을 내보내는 경우가 많음
<==4xx 오류와 5xx 오류의 차이점==>
- 오류 발생 후 똑같은 재시도를 할 때 5xx 오류는 서버를 복구하면 정상적으로 보내짐
- 하지만 4xx 오류는 문제가 클라이언트의 잘못된 요청에 있음
- 따라서 4xx 오류는 클라이언트가 올바른 요청을 하지 않는 이상 복구 불가능