📌HTTP 상태코드 소개
💡상태코드란?
클라이언트가 보낸 요청의 처리 상태를 응답에서 알려주는 기능이다.
- 1xx (Informational): 요청이 수신되어 처리중 (거의 사용 안함)
- 2xx (Successful): 요청 정상 처리
- 3xx (Redirection): 요청을 완료하려면 추가 행동(작업)이 필요
- 4xx (Client Error): 클라이언트 오류, 잘못된 문법등으로 서버가 요청을 수행할 수 없음
- 5xx (Server Error): 서버 오류, 서버가 정상 요청을 처리하지 못함
클라이언트가 인식할 수 없는 상태코드를 서버가 반환하면?
- 클라이언트는 상위 상태코드로 해석해서 처리한다
- 따라서 미래에 새로운 상태 코드가 추가되어도 클라이언트를 변경하지 않아도 된다
ex)
299 ??? -> 2xx (Successful)
451 ??? -> 4xx (Client Error)
599 ??? -> 5xx (Server Error)
📌2xx - 성공
클라이언트의 요청을 성공적으로 처리했다는 뜻
[ 200 OK ]
요청성공이라는 뜻
[ 201 Created ]
요청성공해서 새로운 리소스가 생성되었고 응답의 Location헤더 필드(생성된 리소스의 경로가 담겨있는)가 있을 수 있다는 뜻
[ 202 Accepted ]
요청이 접수는 됐지만 처리가 완료되지 않았을 때 쓰인다. 클라이언트 요청은 성공했는데 서버는 1시간 뒤에 배치를 돌려 처리해야 할 경우 등에 쓰인다.
[ 204 No Content ]
보통 요청에 성공하면 응답 바디에 데이터가 있는데 요청을 성공적으로 수행해도 보낼 데이터가 없는 경우 쓰인다.
EX) 웹 문서 편집기에서 save(저장) 버튼
웹 문서 편집기에서 저장 버튼을 누르면 서버에서 저장 처리를 한 뒤 결과로 본문을 줄 필요는 없다. 그냥 잘 저장됐다는 것만 전달하면 된다. 이럴 경우 결과 내용 없이 204로 성공을 알릴 수 있다.
📌3xx - 리다이렉션
서버가 요청을 완료하기 위해 유저 에이전트(클라이언트)의 추가 작업이 필요하다는 의미
(여기서 유저 에이전트는 주로 웹 브라우저를 의미한다.)
- 300 Multiple Choices
- 301 Moved Permanently
- 302 Found
- 303 See Other
- 304 Not Modified
- 307 Temporary Redirect
- 308 Permanent Redirect
※리다이렉션이란?
웹 브라우저가 3xx 응답 결과에 Location 헤더가 있으면 그 위치로 자동 이동하는 것을 의미한다
[ 자동 리다이렉트 흐름 ]
이벤트가 새로운 것으로 변경되었을 때, 기존 링크가 이미 공유되었거나 즐겨찾기 되어있을 수 있으므로 새로운 경로로 가도록 리다이렉트 한다.
[ 리다이렉션의 종류 ]
- 영구 리다이렉션 - 특정 리소스의 URI가 영구적으로 이동
- 일시 리다이렉션 - 일시적인 변경
- 특수 리다이렉션
💡영구 리다이렉션 (301, 308)
특정 리소스의 URI가 영구적으로 이동한다. 이전 리소스는 사용하면 안되는 상황일 때 해당된다. 검색 엔진들도 이 변경을 인지해서 새로운 URI를 적용한다.
EX1) /members -> /users , EX2) /event -> /new-event
[ 301 Moved Permanently ]
- 리다이렉트 시 요청 메서드가 GET으로 변하고 본문이 제거될 될 수도 있다.
- 그럼 다시 POST로 기존의 메시지를 보내서 요청한다.
[ 308 Permanent Redirect ]
- 301과 기능은 같다.
- 리다이렉트시 요청 메서드와 본문 유지한다는 점이 다르다.(처음 POST를 보내면 리다이렉트도 POST 유지)
[참고]
실무에서는 URI가 바뀌면 처리해야 할 메시지도 달라지기 때문에 POST로 와도 그냥 GET으로 돌리는 게 낫다.
💡일시 리다이렉션(302, 307, 303)
리소스의 URI가 일시적으로 변경된다. 따라서 검색 엔진 등에서 URL을 변경하면 안된다.
EX) 주문 완료 후 주문 내역 화면으로 이동
[ 302 Found ]
-리다이렉트 시 요청 메서드가 GET으로 변하고 본문이 제거될 수도 있다.
[ 307 Temporary Redirect ]
-302와 기능은 같다.
-리다이렉트 시 요청 메서드와 본문을 유지한다.
-요청 메서드를 변경하면 안된다.
[ 303 See Other ]
-302와 기능은 같다.
-리다이렉트 시 요청 메서드가 GET으로 변경된다.
EX) PRG : Post / Redirect / Get
만약 POST로 물건을 주문후에 웹 브라우저를 새로고침하면 그 순간 다시 POST로 요청이 되어 중복 주문이 될 수 있다.
하지만 PRG를 사용하면 POST로 주문후에 주문 결과 화면을 GET 메서드로 리다이렉트 하면 새로 고침을 하여도 결과 화면을 GET으로 조회만 발생한다. 즉 중복 주문 대시 결과 화면만 요청한다.
클라이언트가 주문을 요청하면 응답으로 302나 303과 함께 리다이렉트할 Location을 보낸다. 그럼 클라이언트가 상태 코드가 302 홋은 303임을 확인하고 GET으로 자동 리다이렉트를 한다. 새로고침을 해도 GET 결과 화면만 다시 요청한다.
[ 302,307,303 중 무엇을 쓸까? ]
처음 302의 의도는 HTTP 메서드를 유지하는 것이었다. 그런데 대부분의 웹 브라우저들이 GET으로 바꿔버렸고, 그래서 모호한 302 대신 명확한 307과 303이 등장했다. 307과 303을 권장하지만 현실에선 이미 많은 애플리케이션 라이브러리들이 302를 기본값으로 사용하고 있기 때문에 GET으로 변해도 되면 그냥 302를 사용해도 된다.
💡기타 리다이렉션(300, 304)
[ 300 Multiple Choices ]
사용하지 않는다
[ 304 Not Modified ]
- 캐시를 목적으로 사용한다.
- 클라이언트가 캐시가 만료됐는지 서버에 확인하기 위해 캐시 정보를 넘기고, 서버는 사용해도 되면 캐시로 다시 조회하라고 응답을 보낸다.
- 클라이언트에게 리소스가 수정되지 않았음을 알려준다. 그러면 클라이언트는 캐시로 리다이렉트 해서 로컬 PC에 저장된 캐시를 재사용 한다.
- 304 응답은 로컬 캐시를 사용해야 하므로 응답에 메시지 바디를 포함하면 안된다.
- 조건부 GET, HEAD 요청 시 사용한다.
📌4xx - 클라이언트 오류
클라이언트가 잘못된 요청을 해서 서버가 수행할 수 없을 때 사용한다. 클라이언트가 이미 잘못 요청한 것이기 때문에 똑같이 재시도 해도 실패한다.
(5xx 에러는 재시도 하면 성공할 수 있다는 차이가 있다.)
[ 400 Bad Request ]
- 클라이언트가 잘못된 요청을 해서 서버가 요청을 처리할 수 없는 상태를 의미한다.
- 요청 파라미터가 잘못되거나 API 스펙이 맞지 않을 때 발생한다.
- 클라이언트가 요청 내용을 다시 검토하고 보내야 한다.
- 백엔드 개발자는 철저하게 validation 해서 스펙 안맞으면 바로바로 튕겨줘야 한다.
[ 401 Unauthorized ]
- 클라이언트가 해당 리소스에 대한 인증이 필요한 상태이다.
- 응답에 WWW-Authenticate 헤더와 함께 인증 방법을 설명한다.
- 인증(Authentication) : 본인이 누구인지 확인하는 것, 로그인
- 인가(Authorization) : 권한을 부여하는 것 (ADMIN(관리자)처럼 특정 리소스에 접근할 수 있는 권한)
401은 오류 메시지가 Unauthorized이지만 인증에 해당된다.
[ 403 Forbidden ]
- 서버가 요청을 이해했지만 승인을 거부한 상태이다.
- 주로 인증 자격 증명은 있지만 접근 권한이 없는 경우에 해당한다.
ex) ADMIN(관리자) 등급이 아닌 사용자가 로근인은 했지만 ADMIN등급의 리소스에 접근하는 경우
[ 404 Not Found ]
- 요청 리소스를 찾을 수 없는 상태이다.
- 또는 클라이언트가 권한이 부족한 리소스에 접근하면 그 리소스를 숨기고 싶을 때 사용한다.
📌5xx - 서버 오류
서버에 문제가 있어서 발생하는 오류다. 따라서 서버가 복구되면 재시도 시 성공할 수 있다.
[ 500 Internal Server Error ]
- 서버 내부 문제라는 의미
- 애매한 문제는 대부분 500 오류로 낸다.
- 500은 진짜 서버에 문제가 있을 때만 내야 한다. 예를 들어 DB에러나 NPE 등의 문제 등에서
[ 503 Service Unavailable ]
- 서비스 이용 불가
- 서버가 일시적인 과부하에 걸리거나 예정된 작업으로 잠시 요청을 처리할 수 없는 상태
- Retry-After 헤더 필드로 얼마 뒤에 복구되는지 보낼 수도 있다.
reference - 모든 개발자를 위한 HTTP 웹 기본 지식(김영한)
'CS > HTTP' 카테고리의 다른 글
HTTP 메소드 활용 (0) | 2022.07.09 |
---|---|
HTTP 메소드 - GET,POST,PUT,PATCH,DELETE (0) | 2022.07.09 |
HTTP 요청(request)/응답(response) 메시지 구조 (0) | 2022.07.09 |
HTTP 프록시란? (0) | 2022.07.08 |
HTTP 프로토콜이란? (0) | 2022.07.08 |