네트워크

HTTP 상태 코드 정리

더즈 2022. 5. 22. 22:59

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

image

  1. 옛날 URI로 메시지 바디에 정보를 담아 POST를 보낸다.
  2. 새로운 URI로 리다이렉트를 시키는 데 메시지 바디가 사라지고 GET 요청으로 변경한다.
  3. 이벤트 참여 Form을 작성했었더라면 처음부터 다시 작성해야 한다.

영구 리다이렉션 - 308

image

  1. 똑같은데 리다이렉트 시 본문을 유지한다.
  2. 이벤트 참여가 등록이 된다.
  • 이게 스펙이기 때문에 설명한 거지 실무에서는 거의 이렇게 안 한다.
  • 일반적으로 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 사용 전

image

  1. 주문 DB에 저장
  2. 새로고침
  3. 마지막 요청인 주문을 다시 한 번 DB에 저장

PRG 사용 후

image

  1. 주문 DB에 저장
  2. GET으로 리다이렉트
  3. 새로고침하면 마지막 요청인 GET 보냄
  4. 주문 중복 저장 안 됨

물론 이런 중복 주문은 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 헤더 필드에 나타내는 것이 바람직하다.

참고