본문 바로가기

네트워크/영한님 강의 - HTTP 웹 기본 지식

HTTP 상태 코드들에 대해 알아보자!

현재 포스팅은 영한님의 HTTP 강의를 바탕으로 작성한 포스팅입니다 :)

 

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


HTTP 상태코드

상태 코드란 클라이언트가 보낸 요청의 처리 상태를 응답에서 알려주는 기능을 하는 코드로, 숫자의 첫번째 자리에 따라 5개의 범주로 나눌 수 있습니다.

 

  • 1xx(informational) : 요청이 수신되어 처리중
  • 2xx(Successful) : 요청 정상 처리
  • 3xx(Redirection) : 요청을 완료하려면 추가 행동이 필요
  • 4xx(Client Error) : 클라이언트 요청에 오류가 있음
  • 5xx(Server Error) : 서버 오류, 서버가 정상 요청을 처리하지 못하는 경우

2xx - 성공

이 범주의 상태 코드는 요청이 성공적으로 처리되었음을 나타냅니다

  • 200 OK
  • 201 Created (Post로 뭔가를 등록한 경우)
  • 202 Accepted
  • 204 No Content

202 Accepted요청이 접수되었으나, 처리가 완료되지 않았음을 나타내며 배치 처리 같은 곳에서 주로 사용합니다.(ex: 요청 접수 후 1시간 뒤에 배치 프로세스가 요청을 처리함)

 

204 No Content는 서버가 요청을 성공적으로 수행했지만, 응답 페이로드 본문에 보낼 데이터가 없는 경우를 의미합니다.


3xx - 리다이렉션

이 범주는 클라이언트에게 다른 위치로의 리다이렉션 또는 추가 동작이 필요함을 알립니다.

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

웹 브라우저는 3xx 응답의 결과의 Location 헤더가 있으면, 해당 Location 위치로 자동으로 이동하게 됩니다!

 

이러한 리다이렉션에는 크게 3가지로 나뉩니다.

 

  • 영구 리다이렉션 : 특정 리소스의 URI가 영구적으로 이동 (ex: /members -> /users)
  • 일시 리다이렉션 : 일시적인 변경 (ex: 주문 완료 후 주문 내역 화면으로 이동), PRG(Post/Redirect/Get)
  • 특수 리다이렉션 : 결과 대신 캐시를 사용

영구 리다이렉션(301, 308)의 경우 리소스의 URI가 영구적으로 이동한 경우로, 원래의 URL을 사용하지 않으며 검색 엔진 등에서도 변경을 인지하게 됩니다.

 

301의 경우 리다이렉트 시 요청 메서드가 GET으로 변하고, 본문이 제거될 수 있습니다.

308일 경우 POST를 유지시키고 메세지 본문도 유지됩니다.

 

일시적 리다이렉션(302,307,303)의 경우엔 리소스의 URI가 일시적으로 변경한 것으로, 검색 엔진등에서 URL을 변경하면 안된다는 특징이 있습니다.

 

이러한 일시적 리다이렉션은 보통 PRG(Post/Redirect/Get)방식을 많이 사용합니다.

 

예를들어 상품 주문을 위해 Form에 값을 입력한 후 주문하기 버튼을 눌렀다고 가정해보겠습니다. 이때 POST로 데이터가 넘어가겠죠?? 

 

근데 이때 유의해야할 점은, 이 상태에서(결과가 남아 있는 시점) 웹브라우저를 새로고침하면 POST 데이터가 한번 더 들어갈 수 있습니다. 즉 새로고침을 통해 주문이 다시 요청되면서, 중복 주문이 될 수 있는 것이죠

 

만약 상품 주문 상황에서 PRG 패턴을 적용하면 다음과 같은 흐름이 됩니다.

 

사용자가 폼 작성 후 주문하기 버튼을 누르면, 서버는 이 POST 요청을 받아 상품 주문을 처리합니다. 처리가 완료된 후, 서버는 주문 완료 페이지로 리다이렉션을 합니다. 이때 상태코드와 함께 새로운 URL이 응답에 포함되어 전달됩니다.

 

웹 브라우저는 이 리다이렉션 응답을 받아 해당 URL로 GET 요청을 보냅니다. 이제, 사용자가 웹 브라우저의 새로고침 버튼을 누르더라도, 마지막 요청이 GET이였기에 리다이렉션된 주문 완료 페이지만 다시 로드되며, 중복으로 POST 요청이 전송되는 일은 없습니다.

 

304 Not Modified의 클라이언트의 캐시된 버전이 여전히 유효한 경우 서버가 반환하는 HTTP 상태 코드입니다.

 

클라이언트가 웹 페이지나 이미지와 같은 리소스를 처음 요청할 때, 서버는 해당 리소스와 함께 Last-Modified와 같이 특정 헤더를 포함한 응답을 보냅니다. 클라이언트가 같은 리소스를 다시 요청할때, 이전에 받았던 Last-Modified 값을 요청 헤더에 포함시켜 보냅니다. 

 

서버는 리소스가 변경되지 않았다면, 서버는 304 Not Modified 상태 코드와 함께 본문 없는 응답을 보냅니다. 이는 클라이언트에게 현재 가지고 있는 캐시된 버전을 계속 사용하라는 의미입니다. 만약 리소스가 변경되었다면, 서버는 새로운 버전의 리소스와 함께 200OK 상태 코드를 반환합니다.


4xx - 클라이언트 오류

4xx 상태 코드는 클라이언트에서 발생한 오류를 나타냅니다. 이때 클라이언트는 이미 잘못된 요청, 데이터를 보내고 있기에 똑같이 재시도를 해도 실패한다는 특징을 가집니다.

 

400 Bad Request는 클라이언트가 잘못된 요청을 해서 서버가 요청을 처리할 수 없을때 발생합니다.(ex: 잘못된 요청 파라미터, API 스펙과 불일치)

 

401 Unauthorized는 클라이언트가 해당 리소스에 대한 인증이 필요할때 발생합니다. 401 오류 발생 시에는 응답에 WWW-Authenticate 헤더와 함께 인증 방법을 설명해줍니다.

 

403 Forbidden은 서버가 요청을 했지만 승인을 거부할때 발생합니다. 주로 인증 자격 증명은 있지만, 접근 권한이 불충분한 경우 발생합니다. 예를 들어 어드민 등급이 아닌 사용자가 로그인은 했지만, 어드민 등급의 리소스에 접근하는 경우가 있습니다.

 

404 Not Found은 서버가 요청한 리소스를 찾을 수 없을때 발생합니다. 이는 리소스가 서버에 존재하지 않거나, 권한 문제로 해당 리소스에 대한 정보를 숨기려 할때 발생할 수 있습니다.


5xx - 서버 오류

5xx 상태 코드는 서버 내부의 오류를 나타내며, 4xx와 다르게 재시도를 통해 문제를 해결할 수 있을 가능성이 있습니다.

 

500 Internal Server Error는 서버 내부에 문제가 발생했을때 반환되는 일반적인 오류 코드로, 발생 원인이 애매할 경우 주로 이 오류 코드가 반환됩니다.

 

503 Service Unavailable은 서버가 일시적인 과부하나 예정된 작업으로 인해 요청을 처리할 수 없을때 발생합니다. Retry-After 헤더를 통해 서비스 복구 예상 시간을 알릴 수 있습니다.

 

서버 오류는 극히 드문 상황이나, 실제 서버 문제가 발생했을 때만 사용해야 합니다. 예를 들어, "잔액 부족"과 같은 경우에는 500번대 오류를 사용하면 안됩니다 !!