-
[HTTP] 상태코드 (1xx, 2xx, 3xx, 4xx, 5xx)HTTP 2023. 1. 26. 17:36
상태코드란? - 서버가 클라이언트가 보낸 요청의 처리 상태를 응답해서 알려주는 기능이다.- 1xx(Informational): 요청이 수신되어 처리중
- 2xx(Successful) : 요청 정상 처리
- 3xx(Redirection) : 요청을 완료하려면 추가 행동(redirect)이 필요함
- 4xx(Client Error) : 클라이언트 오류, 잘못된 문법 등으로 서버가 요청을 수행할 수 없음
- 5xx(Server Error) : 서버 오류, 서버가 정상 요청을 처리하지 못함. 서버 내부문제
만약 모르는 상태코드가 나타낸다면?
클라이언트가 인식할 수 없는 상태코드(ex) 299)를 서버가 반환하면? 클라이언트는 상위 상태코드(2xx, 3xx등)으로 해석해서 처리한다.
미래에 새로운 상태코드가 추가되어도 상태코드를 해석하는 클라이언트는 원래하던데로 사용하며 변경하지 않아도 된다.
1xx - 요청이 수신되어 처리중
거의 사용하지않는다.
2xx - 성공
- 200 성공
- 201 요청성공하여 리소스 생성됨
- 202 요청접수되었으나 처리되지않았음
- 204 요청성공하였으나 보낼 메세지 없음
200 OK
- 말그대로 요청성공
201 Created
- 요청 성공해서 새로운 리소스가 생성됨
- 주로 POST로 호출할때 등장하는 상태코드이다.
- 새로 생성된 리소스는 응답의 Location header필드로 식별 할 수 있다.
202 Accepted
- 요청이 접수되었으나 처리가 완료되지 않았음
- 배치 처리 같은 곳에 사용된다.
- ex) 요청 접수 후 1시간 뒤에 배치 프로세스가 요청을 처리
204 No content
- 서버가 요청을 성공적으로 수행했지만, 응답으로 본문에 보낼 데이터가 없는경우이다.
- ex)웹 문서 편집기에서 save버튼을 누르는 경우 save버튼의 결과로 아무 내용이 없어도 되며, 눌렀을때 같은 화면을 유지해야한다.
- 결과내용이 없어도 204메세지만으로 성공을 인식할 수 있다.
3xx(리다이렉션)
요청을 완료하기 위해, 유저에이전트(client의 program인 web browser)의 추가 조치(리다이렉트)가 필요함.
이말은 즉슨, 내가 2xx성공 요청을 받기 전에 ,어떤 요청을 취했을때 서버가 2xx성공을 하기위해서는 보낸 location으로 리다이렉트를 하라고 3xx응답메세지를 보낸다. 3xx 응답에는 location header를 포함하는것이 일반적인데, 이때 클라이언트는 3xx로 서버로부터온 응답메세지를 읽고 리다이렉트(location위치로 이동)하여 서버에 다시 요청메세지를 보내면 2xx 성공 상태코드를 받을 수 있다. 이때 리다이렉트 하는 방법은 상태코드마다 재각기 다르다. (요청메소드를 유지, 제거 하거나, 본문을 유지,제거 하는 등) 즉 서버에 재연결(리다이렉트)하는 행위가 리다이렉션이다.
상태코드 redirect 방법 300 Multipie Choices 301 Moved Permanently 리다이렉트시 요청 메소드가 GET으로 변하고, 본문이 제거될 수 있음. (may) 302 Found 리다이렉트시 요청 메소드가 GET으로 변하고, 본문이 제거될 수있음. (may) 303 See Other 리다이렉트시 요청메소드가 GET으로 변경 304 Not Modified 캐시로 리다이렉트 307 Temporary Redirect 리다이렉트시 요청 메소드와 본문을 유지함. 308 Permanent Redirect 리다이렉트시 요청 메소드와 본문을 유지함. 영구 리다이렉션 - 특정 리소스의 URI가 영구적으로 이동. 301/308
일시 리다이렉션 - 일시적인 변경이며 PRG패턴을 사용한다. 302/303/307
특수 리다이렉션 - 결과 대신 캐시를 사용한다. 304
리다이렉션 이란?
웹 브라우저는 3xx 응답의 결과에 Location header가 있으면, Location위치로 자동 이동(리다이렉트)한다.
- 다음은 서버 url 경로가 event에서 new-event로 바뀐 경우(영구 리다이렉션)이다. 이때 클라이언트가 event로 요청을 보내면 서버는 경로가 바꼈으므로 301 메세지와 함께 새로운 경로를 Location header에 담아서 보낸다. 3xx응답 결과에 Location 헤더가 있으므로 Location의 위치인 new-event로 자동이동(리다이렉트)한다.
영구 리다이렉션 - 301 /308
- 리소스의 URI가 영구적으로 이동한 경우다.
- 원래의 URL을 사용해서는 안되며, 검색 엔진 등에서도 변경을 인지해야한다.
301 Moved Permanently
- 리다이렉트시 요청 메소드가 GET으로 변하고, 본문이 제거될 수 있다.(may)
308 Permanent Redirect
- 301과 기능은 같지만 301의 불확실성을 해결하기 위해 고안되었다.
- 리다이렉트시 요청 메스드와 본문을 유지한다.
- 그러나 실무에서는 요청 메스드와 본문을 유지하기보다는, POST요청을 GET으로 돌리는 방식으로 많이 쓰인다.
일시 리다이렉션 : 302,307,303
- 리소스의 URI가 일시적으로 변경된다.
- 따라서 검색엔진 등에서 URL을 변경하면 안된다.
- RPG패턴 사용
302 Found
- 리다이렉트시 요청 메소드가 GET으로 변하고, 본문이 제거될수도있다.(may)
307 Temporary Redirect
- 302와 기능은같다. 리다이렉트시 요청 메소드와 본문을 유지한다. (요청 메세드를 변경할 수 없다.)
303 See Other
302와 기능은 같다. 리다이렉트시 요청 메소드가 GET으로 변경된다.
처음 302 스펙의 의도는 메소드를 유지하는것이었다. 그러나 대부분의 웹 브라우저들이 GET으로 메소드로 변경했다. 그래서 모호한 302를 대신하는 명확한 303(요청메소드 변경)과 307(요청메소드 변경불가)이 등장했다. 307,303을 권장하지만 현실적으로 이미 많은 애플리케이션 라이브러리들이 302를 기본값으로 사용하고있고, 자동 리다이렉션시 GET으로 변해도 된다면 302를 사용해도 큰 문제없다.
PRG패턴 : POST/ REDIRECT/ GET
Post 수행후 자동으로 Get으로 리다이렉트함
- RPG를 사용하지않을경우 : 만약 POST로 상품을 주문한 후에 웹브라우저를 새로고침한다면, 새로고침은 다시요청이므로 POST를 재요청하여 중복주문이 일어나게된다.
- RPG를 사용한경우: POST로 주문후에 새로고침으로 인한 중복 주문을 방지하기위해서, 주문후 주문결과 화면을 GET메소드로 리다이렉트한다. (POST -> GET) ,이후에는 새로고침해도 결과화면만 GET으로 반복 조회하는 형태이기때문에 중복주문이 일어나지않는다.
기타 리다이렉션
300 Multiple Choices
- 사용하지않음
304 Not Modified
- 캐시를 목적으로 사용한다.
- 클라이언트에게 리소스가 수정되지 않았음을 알려준다. 클라이언트는 리소스가 수정되지 않은걸 알았으므로 로컬 PC에 저장된 캐시를 재사용한다.(캐시를 리다이렉트)
- 304응답은 응답에 메세지 바디를 포함하지 않는다. 이유는 로컬 캐시를 사용해야하기때문이다.
- 조건부 GET, HEAD요청시 사용된다.
4xx - Client 오류
- 클라이언트의 요청에 잘못된 문법등으로 서버가 요청을 수행할 수 없음
- 오류의 원인이 클라이언트에게 있다.
- 클라이언트가 이미 잘못된 요청을, 데이터를 보내고 있기 때문에 똑같이 재시도해도 실패함.
400 Bad Request
클라이언트가 잘못된 요청을 해서 서버가 요청을 처리할 수 없음.
- 요청구문,메세지 등등 오류
- 클라이언트는 요청 내용을 다시 검토하고 보내야함
- ex) 요청 파라미터가 잘못되었거나, API스펙이 맞지않음
401 Unauthorized
클라이언트가 해당 리소스에 대한 인증이 필요
- 인증(Authentication) 되지 않음
- 401오류 발생시 응답에 WWW-Authenticate 헤더와 함께 인증 방법을 설명해서 보낼 수있음.
- 인증? Authentication : 본인이 누구인지 확인하는것(로그인)
- 인가? Authorization : 권한부여 (ADMIN 권한 처럼 특정 리소스에 접근할 수 있는 권한, 인증이 있어야 인가가있다.)
403 Forbidden
서버가 요청을 이해했지만 승인 거부
- 주로 인증 자격 증명은 있지만, 접근 권한이 불충분한 경우
- ex) 어드민 등급이 아닌 사용자가 로그인은 했지만, 어드민 등급에 리소스에 접근하는 경우. 즉 인증은되었지만 인가가 되지않은경우
404 Not Found
요청 리소스 찾을 수 없음
- 요청 리소스가 서버에 없는경우이다.
- 또는 클라이언트가 권한이 부족한 리소스에 접근할때 해당 리소스를 숨기려는 목적으로도 쓰임
5xx - 서버오류
- 서버 문제로 오류 발생
- 서버에 문제가 있기때문에 재시도 하면 성공할 수도있음(서버 복구)
- 서버에서는 5xx오류를 만들면 안된다, 정말 서버에 문제가있을경우 내보내야하기때문에.
500 Internal Server Error
서버 문제로 오류 발생
- 서버 내부 문제로 오류 발생
- 애매하면 500 오류
503 Service Unavailable
- 서버가 일시적인 과부하 또는 예정된 작업으로 잠시 요청을 처리할수없음(과도한 트래픽)
- Retry-After 헤더 필드로 얼마뒤에 복구되는지 보낼 수 있음.
https://www.inflearn.com/course/http-%EC%9B%B9-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC/dashboard
모든 개발자를 위한 HTTP 웹 기본 지식 - 인프런 | 강의
실무에 꼭 필요한 HTTP 핵심 기능과 올바른 HTTP API 설계 방법을 학습합니다., - 강의 소개 | 인프런...
www.inflearn.com
'HTTP' 카테고리의 다른 글
[HTTP] 헤더 - 캐시와 조건부 요청 (0) 2023.01.29 [HTTP] 헤더 - 일반헤더와 쿠키 (0) 2023.01.27 [HTTP] API설계 예시로 알아보는 URI 설계 개념(컬렉션,스토어,컨트롤URI) (0) 2023.01.26 [HTTP] Client에서 Server로 데이터를 전송하는 방법 (0) 2023.01.25 [HTTP] http 메서드(GET, POST, PUT, PATCH, DELETE) (0) 2023.01.24