4장 결과를 전달하는 HTTP 상태 코드
4.1 상태 코드는 서버로부터 리퀘스트 결과를 전달한다.
- 1xx Information 리퀘스트를 받아들여 처리 중
- 2xx Success 리퀘스트를 정상적으로 처리했음
- 3xx Redirection 리퀘스트를 완료하기 위해서 추가 동작이 필요
- 4xx Client Error 서버는 리퀘스트 이해 불가능
- 5xx Server Error 서버는 리퀘스트 처리 실패
4.2 2xx 성공(Success)
리퀘스트가 정상으로 처리되었음을 나타낸다.
200 OK
- 리퀘스트를 서버가 정상 처리하였음을 나타낸다.
- GET 메서드의 경우 리퀘스트된 리소스에 대응하는 엔티티가 리스폰스에 보내진다.
201 Created
- 요청에 성공해서 새로운 리소스가 생성됨
- 생성된 리소스는 응답의 Location 헤더 필드로 식별
202 Accepted
- 요청이 접수되었으나 처리가 완료되지 않았음
- 배치 처리 같은 곳에서 사용
- 예) 요청 접수 후 1시간 뒤에 배치 프로세스가 요청을 처리함
204 No Content
- 서버가 리퀘스트를 처리하는 데 성공했지만 리스폰스에 엔티티 바디를 포함하지 않는다.
- 클라이언트에 대해서 새로운 정보를 보낼 필요가 없는 경우에 사용된다.
206 Partial Content
- Range에 의해서 범위가 지정된 리퀘스트에 의해서 서버가 부분적 GET 리퀘스트를 받았음을 나타낸다.
- 리스폰스에는 Content-Range로 지정된 범위가 엔티티에 포함된다.
4.3 3xx 리다이렉트(Redirection)
처리를 정상적으로 종료하기 위해 브라우저 측에서 특별한 처리를 수행해야 한다.
리다이렉트 종류
- 영구 리다이렉션 - 특정 리소스의 URI가 영구적으로 이동
- 일시 리다이렉션 - 일시적인 변경
- 주문 완료 후 주문 내역 화면으로 이동
- PRG: Post/Redirect/Get
- 특수 리다이렉션
- 결과 대신 캐시를 사용
영구 리다이레션
301, 308
- 리소스의 URI가 영구적으로 이동
- 원래의 URL를 사용하지 않고 검색 엔진 등에서도 변경 인지
- 301 Moved Permanently
- 리다이렉트 시 요청 메서드가 GET으로 변하고, 본문이 제거될 수 있음
- 308 Permanent Redirect
- 301과 기능은 같음
- 리다이렉트 시 요청 메서드와 본문 유지 (처음 Post를 보니면 리다이렉트도 Post)
영구 리다이렉션 - 301
- 옛날 URI로 메시지 바디에 정보를 담아 POST를 보낸다.
- 새로운 URI로 리다이렉트를 시키는 데 메시지 바디가 사라지고 GET 요청으로 변경한다.
- 이벤트 참여 Form을 작성했었더라면 처음부터 다시 작성해야 한다.
영구 리다이렉션 - 308
- 똑같은데 리다이렉트 시 본문을 유지한다.
- 이벤트 참여가 등록이 된다.
- 이게 스펙이기 때문에 설명한 거지 실무에서는 거의 이렇게 안 한다.
- 일반적으로 URI가 바뀌면 내부적으로 전달해야 하는 데이터가 다 바뀐다.
- 때문에 POST로 와도 301로 GET으로 돌리는 게 낫다.
- 실무에서 308은 거의 못 봤다고 한다.
일시적인 리다이렉션
302, 307, 303
- 리소스의 URI가 일시적으로 변경
- 검색 엔진에서 URL 변경하면 안 됨
- 302 Found
- 리다이렉트 시 요청 메서드가 GET으로 변하고, 본문이 제거될 수 있음 (메서드도 본문도 변경이나 제거가 확실치 않음)
- 301이랑 똑같음
- 307 Temporary Redirect
- 302와 기능은 같음
- 리다이렉트 시 요청 메서드와 본문 유지 (메서드를 변경하면 안 된다.)
- 303 See Other
- 302와 기능은 같음
- 리다이렉트 시 요청 메서드가 GET으로 변경
- 302와 다르게 무조건 GET으로 변경
- 정리
- 302 - GET으로 변할 수 있음
- 307 - 메서드가 변하면 안 됨
- 303 - 메서드가 GET으로 변경
- 모호한 302 대신 307, 303을 권장하지만 많은 애플리케이션들이 이미 302를 기본값으로 사용
- 자동 리다이렉션 시에 GET으로 변해도 되면 302를 써도 문제는 없다.
PRG: Post/Redirect/Get
- POST로 주문 후에 웹 브라우저를 새로고침하면?
- 새로고침은 다시 요청
- 중복 주문이 될 수 있다.
PRG 사용 전
- 주문 DB에 저장
- 새로고침
- 마지막 요청인 주문을 다시 한 번 DB에 저장
PRG 사용 후
- 주문 DB에 저장
- GET으로 리다이렉트
- 새로고침하면 마지막 요청인 GET 보냄
- 주문 중복 저장 안 됨
물론 이런 중복 주문은 PRG로 만족할 게 아니라 서버에서 잘 막아야 한다.
기타 리다이렉션
300, 304
- 300 Multiple Choices: 안 쓴다.
- 304 Not Modified
- 캐시 목적으로 사용
- 클라이언트에게 리소스가 수정되지 않았음을 알려준다. 따라서 로컬 PC에 저장된 캐시를 재사용한다. (캐시로 리다이렉트)
- 304 응답은 응답 메시지 바디를 포함하면 안 된다. (로컬 캐시를 사용해야 하므로)
- 조건부 GET, HEAD 요청 시 사용
4.4 4xx 클라이언트 에러(Client Error)
클라이언트의 원인으로 에러가 발생했음을 나타낸다.
400 Bad Request
- 리퀘스트 구문이 잘못되었음을 나타낸다.
- 브라우저는 이것을 200 OK와 같이 취급한다.
401 Unauthorized
- 송신한 리퀘스트에 HTTP 인증 정보가 필요하다는 것을 나타낸다.
- 이미 1번 리퀘스트가 이루어진 경우 유저 인증에 실패했음을 표시한다.
- 401 리스폰스에는 challenge를 포함한 WWW-Authenticate 헤더 필드를 포함할 필요가 있다.
- 인증 방법을 설명
- 처음 401 리스폰스를 받으면 인증을 위한 다이얼로그가 표시된다.
403 Forbidden
서버가 요청을 이해했지만 승인을 거부함
- 주로 인증 자격 증명은 있지만, 접근 권한이 불충분한 경우
- 예) 어드민 등급이 아닌 사용자가 로그인은 했지만, 어드민 등급의 리소스에 접근하는 경우
- 리퀘스트된 리소스의 엑세스가 거부되었음을 나타낸다.
- 서버 측은 거부의 이유를 엔티티 바디에 기재해서 분명하게 표시해야 한다.
- 403 원인으로는 시스템 퍼미션이 부여되지 않은 경우나 권한 문제가 있다.
404 Not Found
- 리퀘스트한 리소스가 서버상에 없다는 것을 나타낸다.
- 그 외에도 리퀘스트를 거부하고 싶은 이유를 분명히 하고 싶지 않은 경우에도 사용할 수 있다.
4.5 5xx 서버 에러(Server Error)
5xx는 서버 원인의 에러다.
500 Internal Server Error
- 서버에서 리퀘스트를 처리하는 도중에 에러가 발생하였음을 나타낸다.
503 Service Unavaliable
- 일시적으로 서버가 과부하 상태거나 점검 중이라 리퀘스트를 처리할 수 없음을 나타낸다.
- 걸리는 시간을 Retry-After 헤더 필드에 나타내는 것이 바람직하다.
참고
- 그림으로 배우는 HTTP & Network
- 모든 개발자를 위한 HTTP 웹 기본 지식
'네트워크' 카테고리의 다른 글
쿠키, 세션, 토큰 (0) | 2022.06.02 |
---|---|
HTTP 특징 및 메서드 정리 (0) | 2022.05.07 |