본문 바로가기

study

[Http] 상태 코드 정리

반응형

http 상태 코드 정리

 

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

 

만약 모르는 상태코드 또는 미래에 새로 추가될 상태코드 (ex. 299) 가 온다면 위의 큰 범위로 생각해서 처리하면 된다. 

 

 

1. 1xx (Informational) 

거의 사용하지 않으므로 생략 

 

 

2. 2xx (Successful) 

200 : OK - 주로 get 에 대한 성공적인 결과로 주는 응답 

201 : Created - 주로 post로 등록할 때 서버쪽에서 리소스를 생성한 경우

202 : Accepted - 요청이 접수되었으나 아직 처리 완료되지 않음 (ex. 한 시간 뒤 서버에서 배치 돌릴 때)

204 : No Content - 서버가 요청을 성공적으로 수행했으나 응답 페이로드 본문에 보낼 데이터가 없는 경우 

 

개발할 때 각 팀 내부에서 "성공" 여부의 범위를 보통 잡는다고 한다. 안그러면 너무 많은 상태 코드가 사용됨! 

 

 

3. 3xx (Redirction) 

 

* 리다이렉션이란 ? 

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

1) 영구 리다이렉션 : uri 영구적으로 이동된 경우

2) 일시 리다이렉션 : 일시적인 변경  ex. 주문 완료 후 주문 내역 화면으로 이동

       ex) PRG: Post/Redirect/Get 

       - post로 주문 후에 웹 브라우저를 새로고침하면 ? - 또 요청 보내짐

       - 이를 해결하려면 : (서버에서 한 번 막긴 하지만) 클라이언트 쪽에서 또 막는 방법이 PRG 요고 

       - 주문 결과 화면을 GET 메서드로 리다이렉트 (302 or 303 )----> 새로고침해도 계속 GET 조최 -> 중복 요청 방지 가능 

3) 특수 리다이렉션 : 결과 대신 캐시를 사용 ex. 클라이언트가 캐시 기간이 만료된 것 같아 서버에 만료된거 맞아 ? 서버에 물어보면 서버가 캐시 문제 없어 캐시 다시 조회해~ 라고 응답 보내는 경우 

 

 

300 : Multiple Choices - 거의 안씀

 

301 : Moved Permanently

- 이전 url이야 완전히 안쓰니까 Location에 적은 위치로 가 ! -> 웹 브라우저는 다시 uri요청해야 함 / 리다이렉트 시 요청 매서드가 GET으로 변하고 본문이 제거될 수 있음 (보통) (MAY) => 다시 처음부터 등록하려던 데이터를 시작해야 함 

Client ---- POST 요청 with data -----> Server

Client <--- 301 / Location: /new-uri --- Server

Client ---------  GET 요청 -----------> Server

Client <--------- 200 응답 ------------ Server 

Client ------- POST 요청 with data----> Server

 

302 : Found 

- 리다이렉트 시 요청 메서드가 GET으로 변하고, 본문이 제거될 수 있음 (301과 비슷) 

 

303 : See Other

- 302와 기능이 같음

- 리다이렉트 시 요청 메서드가 GET으로 변경 (명확 MUST)

 

304 : Not Modified 

- 캐시를 목적으로 사용, 굉장히 많이 씀 

- 클라이언트에게 리소스가 수정되지 않았음을 알려준다. -> 그럼 클라이언트는 로컬pc에 저장된 캐시를 재사용한다. ( = 캐시로 리다이렉트)

- 304 응답은 "body"를 포함하면 안된다. (로컬 캐시를 사용할 거니까) 

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

 

307 : Temporary Redirect 

- 302와 기능이 같음

- 리다이렉트 시 요청 메서드와 본문 유지 (요청 메서드를 변경하면 안된다. MUST NOT

 

308 : Permanent Redirect

- 301과 기능은 같음 / 리다이렉트 시 요청 메서드와 본문 유지 

Client ------- Post 요청 with data -------> Server

Client <----- 308 : Location: /new-uri ---> Server

Client ------- Post 요청 with data --------> Server

Client <------------ 200 응답 ------------- Server

 

301 vs 308 실무에서는 보통 301을 사용한다고 한다. uri가 변경되었다는 것은 내부적으로 전달해야 하는 데이터도 많이 바뀌어서 아예 get 요청으로 다시 해줘! 가 낫다고 한다.  

 

302 vs 303 vs 307 중에서는 아직까지 302를 많이 쓰고 있다고 함 

 

 

 

 

4. 4xx (Client Error)

- 클라이언트 오류 

- 클라이언트의 요청에 잘못된 문법 등으로 서버가 요청을 수행할 수 없음 

   ex) 요청 파라미터 실수, API 스펙 안 맞을 때 등

- 계속해서 재시도하더라도 실패함 (왜냐하면 이미 요청 자체에 문제가 있으니)

 

 

401 : Unauthorized 

- 클라이언트가 해당 리소스에 대한 인증이 필요함 (인증관련이지만 Unauthorized 점 주의) 

 

Authentication (인증 : 로그인, 본인이 누구인지 확인) 

Authorization (인가 : 권한부여) 

 

403 : Forbidden 

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

- 인증 자격 증명은 있지만 접근 권한이 불충분 

 

404 : Not Found 

- 요청 리소스를 찾을 수 없음 

- 클라이언트가 권한이 부족한리소스에 접근했을 때 사이트 없다고 숨기고 싶을 때 

 

 

 

 

5. 5xx (Server Error)

- 클라이언트가 똑같은 요청을 보낼 때 언젠가 성공할 가능성이 있음 (서버 내부의 문제가 수정된 경우)

 

500 : Internal Server Error

- 서버 내부 문제로 오류 발생

- 애매하면 500 오류 

 

503 : Service Unavailable 

- 서비스 이용 불가 

- 서버가 일시적인 과부하 또는 예정된 작업으로 잠시 요청을 처리할 수 없을 때 

- Retry-After 헤더 필드로 얼마뒤에 복구되는지 보낼 수 있음 

=> 하지만 예측 불가한게 대부분이라 보통 500으로 함 

 

 

 

Reference : 인프런 <모든 개발자를 위한 http 웹 기본 지식> 

반응형