티스토리 뷰

CS

HTTP 6. HTTP 상태코드

kingsubin 2021. 1. 7. 14:50

1.  HTTP 상태코드 소개

상태코드 ? 

클라이언트가 보낸 요청의 처리 상태를 응답에서 알려주는 기능

 

  • 1xx (Informational): 요청이 수신되어 처리 중
  • 2xx (Successful): 요청 정상 처리
  • 3xx (Redirection): 요청을 완료하려면 추가 행동이 필요
  • 4xx (Client Error): 클라이언트 오류, 잘못된 문법 등으로 서버가 요청을 수행할 수 없음
  • 5xx (Server Error): 서버 오류, 서버가 정상 요청을 처리하지 못함

만약 클라이언트가 인식할 수 없는 상태코드를 서버가 반환한다면 클라이언트는 상위 상태코드로 해석해서 처리한다. 예를 들어 299 ???, 451 ??? -> 이러한 코드는 2xx, 4xx 로 처리한다는 뜻이다.

 

1xx (Informational) : 요청이 수신되어 처리 중 (거의 사용되지 않는다.)

 


2. 2xx (Successful)- 성공 

클라이언트의 요청을 성공적으로 처리

  • 200 OK
  • 201 Created
  • 202 Accepted
  • 204 No Content

 

200 - 요청 성공

201 - 요청 성공해서 새로운 리소스가 생성됨 

  - 새로 생성된 리소스는 응답의 Location 헤더 필드로 식별한다.

202 - 요청이 접수되었으나 처리가 완료되지 않았음

  - 배치 처리 같은 곳에 사용, 예를 들어 요청 접수 후 1시간 뒤에 처리하는 프로세스

204 - 요청을 성공적으로 수행했지만, 응답 페이로드 본문에 보낼 데이터가 없음.

  - 예로 웹 문서 편집기의 save 버튼을 들 수 있다.

  - save 버튼을 누른다고 아무 변화가 없고 같은 화면을 유지함 -> 결과 내용이 없지만 204 만으로 성공을 인식한다.

 

주로 200, 201 을 사용하고 프로젝트 시작 전에 규율을 정하곤 한다.


3. 3xx (Redirection) - 리다이렉션

요청을 완료하기 위해 유저 에이전트의 추가 조치 필요

  • 300 Multiple Choices
  • 301 Moved Permanently
  • 302 Found
  • 303 See Other
  • 304 Not Modified
  • 307 Temporary Redirect
  • 308 Permanent Redirect

 

리다이렉션 ?

웹 브라우저는 3xx 응답의 결과에 Location 헤더가 있으면, Location 위치로 자동 이동한다.

 

리다이렉션의 종류

  • 영구 리다이렉션 - 특정 리소스의 URI 가 영구적으로 이동
    • ex) /members -> /users
    • ex) /event -> /new-event

 

  • 일시 리다이렉션 - 일시적인 변경
    •  주문 완료 후 주문 내역 화면으로 이동
    • PRG : Post / Redirect / Get

 

  • 특수 리다이렉션
    •  결과 대신 캐시를 사용

 

영구 리다이렉션 (301, 308)

  • 리소스의 URI 가 영구적으로 이동
  • 원래의 URI 사용 X, 검색 엔진 등에서도 변경 인지
  • 301 Moved Permanently
    • 리다이렉트시 요청 메시지가 GET 으로 변하고, 본문이 제거될 수 있음 (MAY)

 

  • 308 Permanent Redirect
    • 301 과 기능은 동일
    • 리다이렉트시 요청 메서드와 본문 유지 (ex) POST 를 보내면 리다이렉트 시에도 POST 유지)

 

일시적인 리다이렉션 (302, 307, 303)

  • 리소스의 URI 가 일시적으로 변경
  • 따라서 검색 엔진 등에서 URI 를 변경하면 안 됨
  • 302 Found
    • 리다이렉트시 요청 메시지가 GET 으로 변하고, 본문이 제거될 수 있음 (MAY)

 

  • 307 Temporary Redirect
    • 302 와 기능은 동일
    • 리다이렉트시 요청 메서드와 본문 유지 (MUST)

 

  • 303 See Other
    • 302 와 기능은 동일
    • 리다이렉트시 요청 메서드가 GET 으로 변경

 

PRG ?

Post / Redirect / Get

만약 POST 로 주문 후에 웹브라우저를 새로고침 하면 다시 요청이 될 것이고 중복 주문이 발생할 수 있다.

어떻게 해결 ?

POST 로 주문 후에 주문 결과 화면을 GET 메서드로 리다이렉트 한다.

새로고침 한다 해도 결과 화면을 GET 으로 조회하는 것이니 중복 주문이 발생하지 않는다.

 

 

 

 

 

실제로는 어떤 걸 사용하는가 ? 

307, 303 을 권장하지만 현실적으로 이미 많은 애플리케이션 라이브러리들이 302 를 기본값으로 사용

자동 리다이렉션 시 GET 으로 변해도 되면 302 를 사용해도 큰 문제없음

 

기타 리다이렉션

300 Multiple Choices : 사용하지 않음

304 Not Modified 

 - 캐시를 목적으로 사용

 - 클라이언트에게 리소스가 수정되지 않았음을 알려준다. 따라서 클라이언트는 로컬 PC 에 저장된 캐시를 재사용한다. 

    (캐시로 리다이렉트)

  - 304 응답은 메시지 바디를 포함하면 안 된다. (로컬 캐시를 사용해야 하므로)

 - 조건부 GET, HEAD 요청 시 사용

 


4. 4xx (Client Error) - 클라이언트 오류

  • 클라이언트의 요청에 잘못된 문법 등으로 서버가 요청을 수행할 수 없음
  • 오류의 원인은 클라이언트
  • 클라이언트가 이미 잘못된 요청을 하고 있기에 재시도해도 실패한다.

 

400 (Bad Request)

클라이언트가 잘못된 요청을 해서 서버가 요청을 처리할 수 없음

  • 요청 구문, 메시지 등 오류
  • 클라이언트는 요청 내용 다시 검토, 수정후 보내야 함
  • ex) 파라미터가 잘못되거나, API 스펙이 맞지 않을 경우

 

401 (Unauthorized)

클라이언트가 해당 리소스에 대한 인증이 필요함

  • 인증(Authentication) 되지 않음
  • 401 오류 발생 시 응답에 WWW-Authenticate 헤더와 함께 인증 방법을 설명

 

403 (Forbidden)

서버가 요청을 이해했지만 승인을 거부함

  • 주로 인증 자격은 있지만, 접근 권한이 불충분한 경우
  • ex) 어드민 등급이 아닌 사용자가 로그인했지만 어드민 등급의 리소스에 접근하는 경우

 

404 (Not Found)

요청 리소스를 찾을 수 없음

  • 요청 리소스가 서버에 없음
  • 또는 클라이언트가 권한이 부족한 리소스에 접근할 때 해당 리소스를 숨기고 싶을 때

 


5. 5xx (Server Error) - 서버 오류

  • 서버 문제로 오류 발생
  • 서버에 문제가 있기 때문에 재시도 시 성공할 수도 있음 (서버 복구되거나 등)

 

500 (Internal Server Error)

서버 문제로 오류 발생, 애매하면 500 오류

  • 서버 내부 문제로 오류 발생
  • 애매하면 500 오류

 

503 (Service Unavailable)

서비스 이용 불가

  • 서버가 일시적인 과부하 또는 예정된 작업으로 잠시 요청을 처리할 수 없음
  • Retry-After 헤더 필드로 얼마 뒤에 복구되는지 보낼 수 있음

 

* 4xx 에러로 처리할 수 있는 거는 4xx 로 처리하고 최대한 5xx 에러는 보내지 않도록 한다.

 

 

 

 


※ 출처

www.inflearn.com/course/http-%EC%9B%B9-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC/dashboard

'CS' 카테고리의 다른 글

HTTP 8. 캐시와 조건부 요청  (0) 2021.01.08
HTTP 7. HTTP 일반 헤더  (0) 2021.01.07
HTTP 5. HTTP 메서드 활용  (0) 2021.01.06
HTTP 4. HTTP 메서드  (0) 2021.01.05
HTTP 3. HTTP 기본  (0) 2021.01.04