HTTP 상태 코드

Sejun Park·2022년 2월 27일
0

HTTP

목록 보기
5/6
post-thumbnail
post-custom-banner

💡 상태 코드

상태 코드란 클라이언트가 보낸 요청의 처리 상태를 응답에서 알려주는 기능입니다.
FLOW

여기서 세번째 그림을 보면 HTTP/3 버전 이후 상태 코드인 200을 받은 것을 알 수 있습니다.
이처럼 상태코드는 컴퓨터가 알아들으수 있도록 세자리 숫자로 이루어져 있습니다.

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

현재도 상태 코드가 추가 중이며, 만약 모르는 상태코드가 반환이 되었을 때는 세자리 숫자 중 맨 앞의 숫자에 따라 행동을 달리하면 됩니다.


📁 2xx (Successful)

클라이언트의 요청을 성공적으로 처리한 것을 의미합니다.

  • 200(Success) : 요청한 것이 성공적으로 처리되었다 라는 의미입니다.
  • 201(Created) : 요청한 것이 성공해서 새로운 리소스가 생성되었고, Location 헤더에 새로운 리소스를 담아서 리턴합니다.
  • 202(Accepted) : 요청이 접수되었으나 처리가 완료되지 않았음을 의미합니다.
    ex) 요청 후 1시간 뒤에 배치 프로세스가 요청을 처리함
  • 204(No Content) : 서버가 요청을 성공적으로 수행했지만, 응답 페이로드 본문에 보낼 데이터가 없음을 의미합니다. 즉, 어떤 행동을 해도 같은 화면을 유지해야 합니다.
    ex) velog 임시저장, wiki 임시저장

📁 3xx (Redirection)

요청을 완료하기 위해 유저 에이전트의 추가 조치가 필요합니다.
그리고 만약 3xx 응답에 Location 헤더가 있으면, Location 가 지정한 위치로 자동으로 이동(Redirection)됩니다.

📌 그림으로 이해하는 리다이렉션

redirection
위 그림과 같이 요청을 했을때 서버에서는 사이트가 변경되었다고 응답을 주면 클라이언트에서는 Location에 있는 uri로 새로운 요청을 하게 됩니다.

📌 영구 리다이렉션

특정 리소스의 URI가 영구적으로 이동 ex) /members -> /users, /study -> new-study

  • 301(Moved Permanently): 리다이렉트시 요청 메서드가 GET으로 변하고, 본문이 제거될 수 있습니다.
  • 308(Permanent Redirect): 301과 기능은 같으나, 리다이렉트시 요청 메서드와 본문을 유지합니다.(처음 POST 를 보내면 리다이렉트도 보냅니다.)

📌 일시 리다이렉션

리소스의 URI가 일시적으로 변경하는 것입니다. ex) 주문 후 주문 내역 화면으로 이동하는 것

  • 302(found): 리다이렉트시 요청 메서드가 GET으로 변하고, 본문이 제거될 수 있습니다.
  • 307(temporary redirect): 302와 기능은 같으나, 리다이렉트시 요청 메서드와 본문 유지
  • 303(See Other): 302와 기능은 같으나, 리다이렉트 요청시 메서드가 GET으로 변경

307, 303을 권장하지만 현실적으로 많은 애플리케이션이 302를 기본값으로 사용하고 있으며, GET으로 변해도 되면 큰 문제 없습니다.

PRG: Post/Redirect/Get 란
Post 주문 후 웹브라우저를 새로고침하면 재요청이 일어나 중복 주문이 일어날 수 있다.
이럴때 PRG를 사용해야 한다.

POST 주문 후 주문 결과화면을 GET 메서드로 리다이렉트해준다. 따라서 새로고침하더라도 중복 주문이 일어날 수 없고 주문 결과만 다시 불러옵니다.
PRG

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

  • 304(Not Modified): 캐시를 목적으로 사용합니다. 클라이언트에게 리소스가 수정되지 않았음을 알려줌으로써 클라이언트는 캐시를 재사용합니다.(캐시로 리다이렉트)
    • 304 응답은 로컬 캐시를 사용해야 함으로 메세지 바디를 포함하면 안됩니다.
    • 조건부 GET, HEAD 에 사용합니다.

📁 4xx(Client Error)

클라이언트의 요청에 잘못된 문법등으로 서버가 요청할 수 없을때 사용합니다. 클라이언트가 잘못된 요청, 데이터를 보내고 있기때문에, 재시도를 하더라도 실패합니다.

  • 400(Bad Request): 클라이언트가 잘못된 요청을 해서 서버가 요청을 처리할 수 없음.
    ex) 요청 파라미터 오류, api 스펙에 맞지 않음

  • 401(Unauthorized): 인증이 되지 않았음을 의미합니다. 401 오류 발생시 응답에 WWW-Authenticate 헤더와 함께 인증방법을 설명해야합니다.

    • 인증(Authentication): 본인이 누구인지 확인(로그인)
    • 인가(Authorization): 권한 부여(ADMIN 권한처럼 특정 리소스에 접근할수 있는 권한, 인증에 있어야 인가가 있음)
  • 403(Forbidden): 서버가 요청을 이해했지만 승인을 거부함, 주로 인증 자격은 있지만, 접근 권한이 불충분한 경우
    ex) 어드민 등급이 아닌 사용자가 로그인은 했지만, 어드민 등급의 리소스에 접근하는 경우

  • 404(Not Fount): 요청 리소스가 서버에 없음 또는 클라이언트가 권한이 부족한 리소스에 접근할 때 해당 리소스를 숨기고 싶을때 사용합니다.


📁 5xx(Server Error)

서버 오류가 발생했을 때 사용하며, 재시도 할 경우 성공할 수도 있습니다.(복구가 됐을때)

  • 503(Service Unavailable): 서비스 이용 불가를 의미하며, 서버가 일시적인 과부하 또는 예정된 작업으로 잠시 요청을 처리할수 없을때 사용합니다.
    • Retry-After 헤더 필드로 얼마뒤에 복구되는지 보낼 수 있습니다.
      ex) 서버 점검 시간

언제 5xx 에러를 사용해야 하나요?

  • 서버가 내부적으로 문제가 있을때만 사용하도록 하도록 해야합니다.
    ex) null 에러, 디비 다운

💡 Reference

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

profile
백엔드 개발자
post-custom-banner

0개의 댓글