스프링/HTTP 기본 지식

HTTP(4) - HTTP 상태코드

chanhee01 2023. 2. 6. 21:25

HTTP 상태 코드

1xx : 요청이 수신되어 처리 중

2xx : 요청 정상 처리

3xx : 요청을 완료하려면 추가 행동이 필요

4xx : 클라이언트 오류, 잘못된 문법등으로 서버가 요청을 수행할 수 없음 (클라이언트 에러)

5xx : 서버 오류, 서버가 정상 요청을 처리하지 못함 (서버 에러)

 

각각의 특징

 

1. 1xx : 요청이 수신되어 처리 중

- 거의 사용하지않음

 

 

2. 2xx : 클라이언트의 요청을 성공적ㅇ로 처리

  • 200 OK - 요청 성공
  • 201 Created - 요청 성공해서 새로운 리소스가 생성됨
  • 202 Accepted - 요청이 접수되었으나 처리가 완료되지 않았음
  • 204 No Content - 서버가 요청을 성공적으로 수행했지만, 응답 페이로드 본문에 보낼 데이터가 없음

200이랑 201을 거의 많이 사용함.

 

 

3. 3xx : 리다이렉션

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

 

리아이렉트 : 웹 브라우저는 3xx 응답의 결과에 Location 헤더가 있으면, Location 위치로 자동 이동

 

URL: /event가 URL: /new-event로 바뀌었다고 가정을 하자.

 

만약 클라이언트가 이 사실을 인지 못하고

GET /event HTTP/1.1

Host: localhost:8080 을 입력한다면

 

서버는 다음과 같이 응답한다.

HTTP/1.1 301 Moved Permanently

Location:/ new-event

 

그러면 자동 리다이렉트로 인하여 event가 아니라 new-event라고 다시 요청하게 된다.

 

옛날 페이지를 입력했지만 사용자 입장에서는 새로운 페이지를 볼 수 있다.

속도가 빨라서 클라이언트는 잘 인지 못하게 된다.

 

 

 

영구 리다이렉션

301, 308

 

- 리소스의 URI가 영구적으로 이동

- 원래의 URL를 사용 x, 검색 엔진 등에서도 변경 인지

 

 

 

일시적인 리다이렉션

302, 307, 308

 

- 리소스의 URI가 일시적으로 변경

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

307 - 리다이렉트시 요청 메서드와 본문 유지

303 - 리다이렉트시 요청 메서드가 GET으로 변경 (302보다 명확하게 변경됨)

 

상품을 주문한다고 가정을 했을 때 상품 주문 완료 페이지에서 새로고침을 누르면 상품이 재주문 될 수 있다고 생각해보자.

이러한 것을 방지하기 위해 RPG: Post/Redirect/Get을 사용한다. URL이 POST -> GET으로 리다이렉트 됨

 

POST/ order HTTP/1.1

Host: localhost:8080

 

itemId=mouse&count=1

위와 같이 입력을 하면

 

HTTP/1.1 302 Found

Location:/ order-result/19

라고 주문 완료가 뜬다.

 

이때, 자동 리다이렉트로 GET으로 변경이 되고, 새로고침을 하면

GET /order-result/19 HTTP/1.1

Host: localhost:8080

이 요청된다.

 

결국 재주문이 아니라 GET을 통한 완료페이지를 보여주게 된다.

HTTP/1.1 200 OK

<html>주문완료</html>이 응답된다.

 

 

4xx : 클라이언트 오류

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

- 오류의 원인이 클라이언트에 있음

- 클라이언트의 잘못이기에 똑같은 요청을 재시도하면 계속 실패함 -> 복구 불가능

 

 

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

- 클라이언트는 요청 내용을 다시 검토하고 보내야함, 요청 파라미터나 API 스펙이 맞지 않을 때 발생

 

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

- 인증이 되지 않아서 본인이 누구인지 확인하는 인증이 필요함(로그인이 안됨)

 

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

- 로그인은 됐지만 접근할 수 없을 때

 

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

- 요청 리소스가 서버에 없음

- 또는 클라이언트가 권한이 부족한 리소스에 접근할 때 해당 리소스를 숨기고 싶을 때

 

 

5xx : 서버 오류

- 서버에 문제가 있기 때문에 재시도하면 성공할 수도 있음(복구가 되는 경우 등)

 

500 - 서버 문제로 오류 발생

- 애매하면 전부 500 오류로 내보냄

 

503 - 서비스 이용 불가

- 서버가 일시적인 과부하 또는 예정된 작업으로 잠시 요청을 처리할 수 없음(일시적인 장애로 인한 서버 오류)