HTTP 상태코드

2025. 1. 3. 17:20
728x90

1. 상태 코드

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

- 만약 모르는 상태 코드가 나타나면 (클라이언트가 인식할 수 없는 상태코드)? : 상위 상태코드로 해석해서 처리. 몇백대 상태코드인지를 확인하면 된다.

 

1) 1xx (Informational)

: 요청이 수신되어 처리중 (거의 사용하지 않음)

2) 2xx (Successful)

: 요청 정상 처리 (클라이언트의 요청을 성공적으로 처리)

 

- 200 OK : 요청 성공

GET 요청을 하면 결과를 정상적으로 처리하고 응답할 때 200 OK를 응답.

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

POST 요청을 하면 새로운 리소스를 생성하고 응답을 201 Created로 응답. Location 헤더도 포함해준다.

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

  • 배치 처리 같은 곳에서 사용 (ex. 요청 접수 후 1시간 뒤에 배치 프로세스가 요청을 처리함)

 

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

  • ex) 웹 문서 편집기에서 save 버튼. -> 결과로 아무 내용이 없어도 된다. save 버튼을 눌러도 같은 화면을 유지해야한다. 
  • 결과 내용이 없어도 204 메시지 만으로 성공을 인식할 수 있다.

 

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 위치로 자동 이동. 

/event 페이지를 쓰다가 /new-event로 바뀌었을 때 자동 리다이렉트 설정하여 바뀌는 것.

 

- 영구 리다이렉션 (301, 308) : 특정 리소스의 URI가 영구적으로 이동

  • 원래의 URL을 사용하지 않음. 검색 엔진 등에서도 변경 인지.
  • 301 Moved Permanently : 리다이렉트시 요청 메서드가 GET으로 변하고, 본문이 제거될 수도 있음.
  • 308 Permanent Redirect : 301과 기능은 같음. 리다이렉트시 요청 메서드와 본문 유지 

301은 GET으로 변경되었고, 308은 POST가 유지된다. 301은 메시지가 존재했어도 GET으로 바뀌면서 메시지가 제거된다. 308은 메시지도 유지

(cf) 사실 실무에서는 308을 거의 사용하지 않음. 왜냐면 페이지가 바뀌면 내부적으로 전달해야 하는 데이터 자체가 바뀌게 되는 경우가 많기 때문...)

 

 

- 일시 리다이렉션 (302, 307, 303) : 일시적인 변경 (ex. 주문 완료 후 주문 내역 화면으로 이동)

  • 리소스의 URI가 일시적으로 변경. 따라서 검색 엔진 등에서 URL을 변경하면 안됨
  • 302 Found : 리다이렉트시 요청 메서드가 GET으로 변하고, 본문이 제거될 수 있음 
  • 307 Temporary Redirect : 302와 기능은 같음. 리다이렉트시 요청 메서드와 본문 유지. (요청 메서드를 변경하면 안됨!!)
  • 303 See Other : 302와 기능은 같음. 리다이렉트시 요청 메서드가 GET으로 변경
  • 301, 307을 권장하지만 현실적으로 이미 많은 애플리케이션 라이브러리들이 302를 기본값으로 사용한다.. (자동 리다이렉션시 GET으로 변해도 되면 그냥 302를 사용해도 괜찮다.)

** 예시 : PRG (Post/Redirect/Get) **

- POST로 주문 후에 웹 브라우저를 새로고침하면? 중복 주문이 될 수 있다. 

- 이를 방지하기 위해 >> POST로 주문 후 주문 결과 화면을 GET 메서드로 리다이렉트. 

- 새로고침해도 결과 화면을 GET으로 조회하게 된다. 

PRG 사용하지 않는 경우 200OK 반환하고, 새로고침 시 주문이 두 번 완료된다.
PRG 사용시 302 Found로 응답하며 Location 설정해주어 이후 자동 리다이렉트 되도록 한다. 새로고침한다면 GET 요청이 계속 나가게 된다.

 

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

  • 304 Not Modified : 캐시를 목적으로 사용. 클라이언트에게 리소스가 수정되지 않았음을 알려준다. 따라서 클라이언트는 로컬 PC에 저장된 캐시를 재사용한다. 
  • 로컬 캐시를 사용해야 하므로 응답에 메시지 바디를 포함하면 안된다. 
  • 조건부 GET, HEAD 요청시 사용.

 

4) 4xx (Client Error)

: 클라이언트 오류, 잘못된 문법 등으로 서버가 요청을 수행할 수 없음. <오류의 원인이 클라이언트에 있음!!!>

- 중요! 클라이언트가 이미 잘못된 요청, 데이터를 보내고 있기 때문에,,,, 똑같은 재시도가 실패함. (5xx에러는 재시도 했을 때 성공할 수도 있음)

- 400 Bad Request : 클라이언트가 잘못된 요청을 해서 서버가 요청을 처리할 수 없음.

  • 요청 구문, 메시지 등등 오류
  • 클라이언트는 요청 내용을 다시 검토하고 보내야함. (서버 개발 시 철저하게 validation 해야함)
  • ex) 요청 파라미터가 잘못되거나, API 스펙이 맞지 않을 때

- 401 Unauthorized : 클라이언트가 해당 리소스에 대한 인증이 필요함. 

  • 401 오류 발생 시 응답에 WWW-Authenticate 헤더와 함께 인증 방법을 설명.
  • 해당 오류 메시지는 Unauthorized라고 나와있지만, 사실상 인증(Authentication)이 안된 상태임!!! 주의~~~~!

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

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

- 404 Not Found : 요청 리소스를 찾을 수 없음

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

 

5) 5xx (Server Error)

: 서버 오류, 서버가 정상 요청을 처리하지 못함 (서버에 문제가 있기 때문에 재시도 하면 성공할 수도 있음.)

- 500 Internal Server Error : 서버 문제로 오류 발생. 애매하면 500 오류

- 503 Service Unavailable : 서비스 이용 불가

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

 

 

 

 


** 해당 내용은 김영한님의 강의를 수강하며 정리한 것입니다.

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

 

모든 개발자를 위한 HTTP 웹 기본 지식 강의 | 김영한 - 인프런

김영한 | 실무에 꼭 필요한 HTTP 핵심 기능과 올바른 HTTP API 설계 방법을 학습합니다., [사진] 📣 확인해주세요!본 강의는 자바 스프링 완전 정복 시리즈의 세 번째 강의입니다. 우아한형제들 최연

www.inflearn.com

 

728x90

'Programming > Network' 카테고리의 다른 글

HTTP 헤더2 - 캐시와 조건부 요청  (0) 2025.01.15
HTTP 헤더 1 - 일반 헤더  (0) 2025.01.12
HTTP 메서드 활용  (0) 2025.01.01
HTTP API  (2) 2024.12.31
HTTP  (2) 2024.11.29

BELATED ARTICLES

more