본문 바로가기

Web Infra

HTTP 상태코드

728x90

상태코드

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

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

2XX 

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

  • 200 : OK, 요청 성공
  • 201 : Created, 요청 성공해서 새로운 리소스 생성 (POST 명령)
    • 생성된 리소스는 응답의 Location 헤더 필드로 식별

 

  • 202 : Accepted, 요청이 접수되었으나 처리가 완료되지 않았음
    • 배치 처리 같은 곳에서 사용: 요청 접수 후, 특정 시간 후에 배치 프로세스가 요청 처리
  • 204 : No Content, 서버가 요청을 성공적으로 수행했지만, 응답 페이로드 본문에 보낼 데이터가 없음
    • ex) 웹 문서 편집기에서 save 버튼
      • save 버튼의 결과로 아무 내용이 없어도 된다. (같은 화면 유지)
    • 결과 내용이 없어도 204 메시지만으로 성공 인식

3XX 

리다이렉션, 요청을 완료하기 위해 User-Agent(클라이언트)의 추가 조치 필요

  • 300 : Multiple Choices
  • 301 : Moved Permanently (영구 리다이렉션)
  • 302 : Found (일시 리다이렉션)
  • 303 : See Other  (일시 리다이렉션)
  • 304 : Not Modified (특수 리다이렉션)
  • 307 : Temporary Redirect  (일시 리다이렉션)
  • 308 : Permanent Redirect (영구 리다이렉션)

 

리다이렉션의 이해

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



영구 리다이렉션: 301, 308

  • 특정 리소스의 URI가 영구적으로 이동 (위 그림 - 검색 엔진 등에서도 변경 인지, 원래 URL 사용 X)
  • 301 Moved Permanently: 리다이렉트시 요청 메서드가 GET으로 변하고, 본문이 제거될 수 있음 (must X, may O)
  • 308 Permanent Redirect: 301과 기능은 같지만, 리다이렉트시 요청 메서드와 본문 유지 (처음 POST를 보내면 리다이렉트도 POST 유지)

일시 리다이렉션: 302, 307, 303

  • 일시적인 변경 (따라서 검색 엔진 등에서 URL 변경하면 안 됨)
    • 주문 완료 후 주문 내역 화면으로 이동
    • PRG: Post/Redirect/Get
      • POST로 주문 후에 웹 브라우저를 새로고침 하면? 새로고침으로 인해 POST 요청을 다시 하게 되어 중복 주문 발생 가능
      • 이를 방지하기 위해 GET 메서드로 리다이렉트 하도록 함
      • 즉, 새로고침해도 결과 화면을 GET으로 조회하도록 하는 상태코드
  • 302 Found: 리다이렉트시 요청 메서드가 GET으로 변하고, 본문이 제거될 수 있음 (may)
  • 307 Temporary Redirect: 리다이렉트시 요청 메서드와 본문 유지 (요청 메서드를 변경하면 안 된다. MUST NOT)
    • 307은 Method와 Body가 변경되지 않고 리다이렉트 요청을 하도록 보장되지만, 302는 아니다.
  • 303 See Other: 리다이렉트시 요청 메서드가 GET으로 변경


특수 리다이렉션: 304

  • 결과 대신 캐시 사용
  • 304 Not Modified
    • 캐시를 목적으로 사용
    • 클라이언트에게 리소스가 수정되지 않았으니, 클라이언트에게 로컬 PC에 저장된 캐시를 재사용하라는 의미 (캐시로 리다이렉트)
    • 응답에 메시지 바디를 포함하면 안 된다. (로컬 캐시를 사용해야 하므로)
    • 조건부 GET, HEAD 요청 시 사용

4XX 

클라이언트의 오류

  • 클라이언트의 요청에 잘못된 문법 등으로 서버가 요청을 수행할 수 없음
  • 오류의 원인이 클라이언트에 있음
  • 클라이언트가 이미 잘못된 요청, 데이터를 보내고 있기 때문에, 똑같은 재시도가 실패함

종류

  • 400 : Bad Request, 클라이언트가 잘못된 요청을 해서 서버가 요청을 처리할 수 없음
    • 요청 구문, API 스펙 오류
    • 클라이언트는 요청 내용을 다시 검토하고, 보내야 함
  • 401 : Unauthorized, 클라이언트가 해당 리소스에 대한 인증이 필요
    • 인증(Authentication) 되지 않음 (이름은 Unauthorized이지만 인증과 관련된 코드!)
    • 401 오류 발생 시 응답에 WWW-Authenticate 헤더와 함께 인증 방법을 설명
  • 403 : Forbidden, 서버가 요청을 이해했지만 승인을 거부함
    • 주로 인증 자격 증명은 있지만, 접근 권한이 불충분한 경우 (인가 - Authorization 문제)
  • 404 : Not Found, 요청 리소스를 찾을 수 없음
    • 요청 리소스가 서버에 없거나 클라이언트가 권한이 부족한 리소스에 접근할 때 해당 리소스를 숨기고 싶을 경우

5XX 

서버 오류

  • 서버 문제로 오류 발생
  • 서버에 문제가 있으므로 재시도하면 성공할 수도 있다. (복구가 될 경우)

 

종류

  • 500 : Internal Server Error, 서버 문제로 오류 발생 (애매하면 500!!)
  • 503 : Service Unavailable, 서비스 이용 불가 
    • 서버가 일시적 과부하 혹은 예정된 작업으로 잠시 요청 처리 불가
    • Retry-After 헤더 필드로 얼마뒤에 복구되는지 보낼 수 있다.

 


 


[참고자료]

What's the difference between HTTP 301 and 308 status codes? - Stack Overflow

 

What's the difference between HTTP 301 and 308 status codes?

What's the difference between HTTP 301 and 308 status codes? 301 (Moved Permanently): This and all future requests should be directed to the given URI. 308 (Permanent Redirect): The request and all

stackoverflow.com

 

김영한, "모든 개발자를 위한 HTTP 웹 기본 지식", 인프런

728x90
반응형

'Web Infra' 카테고리의 다른 글

Cookie (쿠키)  (0) 2023.12.10
HTTP 헤더 정보  (1) 2023.12.10
HTTP 헤더  (0) 2023.12.10
HTTP 메서드  (1) 2023.12.07
인터넷 프로토콜과 HTTP 개요  (0) 2023.12.07