HTTP 웹 기본 지식 step-5 HTTP 상태 코드

배인성·2022년 5월 12일
0

HTTP

목록 보기
5/7

HTTP 상태코드란??

클라이언트가 서버로 요청을 보내면 요청이 잘 처리가 됐는지 문제가 있는지 서버에서 response를 보낼때 알려주는 기능이다.

크게 다섯가지로 나뉜다

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

음.. 지금 당장에도 내가 이클립스 기반 Spring MVC 프로젝트 환경 구축을 거의 완료하긴했는데, 잘 뜨던 home.jsp가 갑자기

이렇게 된다.. 404라는 상태코드가 눈에 보이는데 클라이언트 측에서 오류라는 것을 알 수 있다.

이처럼 웹 개발중에 상태코드는 앞으로도 계에에에에속 보게 될 것이며 정말 필수적인 지식?? 이전에 그냥 상식으로 알고있어야 할 것이다.

그래서 거의 쓰이지 않는 1xx 상태코드를 제외한 나머지 상태코드를 대략적으로 알아보도록 하겠다.

2xx 상태 코드

기본적으로 2xx는 클라이언트의 요청을 정상적으로 처리했다는 아주 기분좋은 상태 코드다.

  • 200 OK (요청 성공!)
  • 201 Created (요청이 성공적으로 이루어져서 새로운 리소스가 생성됨!)
  • 202 Accepted (요청은 접수되었지만, 처리는 이따가 해줌!)
  • 204 No Content (요청 성공! 하긴 했지만 기능상 클라에 보낼 데이터는 없음)

그냥 웹 개발하다가 상태코드 앞자리에 2가 적혀있으면 성공했다고 생각하고 넘어가면 되겠다.

3xx 상태 코드

3xx는 리다이렉션으로 요청을 완료하기 위해서 클라이언트의 추가적인 조치가 필요하다는 코드다.

리다이렉션 자체가 클라이언트 요청 -> 서버 리다이렉션 (3xx) -> 클라이언트 재요청 -> 서버 응답 식으로 이루어 지는것이라서 클라가 리다이렉션을 해야하는 이유에 따라 상태 코드가 나뉜다.

  • 영구 리다이렉션
  • 일시 리다이렉션
  • 특수 리다이렉션

이렇게 나뉜다고한다.

(3xx) 영구 리다이렉션

어떤 리소스의 URI가 영구적으로 이동되었을때 사용한다.

예를 들어, /members로부터 위치하고 있던 URI가 갑자기 /users로 바뀌었거나 /event에서 새로운 이벤트로 바뀌어 /new-event로 바뀌었는데

기존의 URI로 요청이 들어왔을 때 서버는 해당 URI는 영구적으로 바뀌었다고 클라에다가 3xx로 알려준다.

이때 사용되는 상태코드에는 301과 308이 있다.

  • 301 (Moved Permanently) : 301을 받은 클라의 요청은 GET으로 변하고 메세지 바디가 제거될 수 있다.
  • 308 (Permanent Redirect) : 301과 기능은 같지만, 리다이렉트시 요청 메서드와 메세지 바디를 유지한다. (처음 POST 였다면 리다이렉트로 인한 재요청도 POST 유지)

(3xx) 일시 리다이렉션

리소스의 URI가 일시적으로 변경되었을때 사용된다는데 대표적인 예시가 하나 있다.

아마 이 팝업 많이 봤을 것이다. 해커톤때, 이걸 해결할려고 애썼던 기억이 난다 ㅋㅋㅋ

이 경고창?은 어떤 페이지에서 POST 요청을 보내고나서 그 창을 새로고침하게 되면 브라우저에서 저런 팝업창을 볼 수 있다.

저기서 계속 버튼을 누르면 방금전 보냈던 POST 요청을 똑같이 다시 보내게되는 치명적인 에러가 발생한다.

그럼 방금전에 했던 충전은 다시 충전되고, 주문은 다시 주문되는 엄청난... 재앙이다.

나는 당시 같이 백엔드 작업을 함께하던 분이 아예 그 창에서 새로고침을 막아버리는 방법으로 해결했었다 ㅋㅋㅋㅋ

여튼 이걸 해결하는 방법은 여러가지가 있지만 현업에서는 이를 PRG 패턴으로 해결한다고 한다.

PRG란 Post/Redirect/Get으로, 주문이나 충전같은 POST 요청을 하면 사용자가 자신의 주문정보나 충전정보를 보게끔 Get 요청을 위한 리다이렉션을 해버리는것이다.

이게 기능 시나리오상 더 깔끔하고 저런 에러를 막을 수 있는 이쁜 방법이라고 한다.

일시 리다이렉션의 상태 코드는 302, 307, 303이 있다.

  • 302 (Found) : 리다이렉트시 요청 메서드가 GET으로 변하고, 메세지 바디가 제거될 수 있다.
  • 307 (Temporary Redirect) : 302와 같지만, 리다이렉트시 요청 메서드와 본문은 유지해야한다!!
  • 303 (See Other) : 302와 같지만 리다이렉트시 요청 메서드가 GET으로 변경된다.

(3xx) 기타 리다이렉션

이것은 캐시를 목적으로 사용한다. 캐시란 쉽게 말해서 어떤 페이지를 요청할 때마다 이미지 파일을 계속 내려받을 수는 없다.

이렇게 되면 속도도 속도지만, 이미지를 계속 내려받는 메모리도 고생한다.

그래서 브라우저에는 캐시 저장소나 쿠키 저장소와 같은 저장소가 있는데, 방금 요청했던것이면 굳이 서버에서 내려받는게 아니라 그냥 아까 쓰던거 써라! 같은 개념이다.

이를 알려주기 위해 300, 304 와 같은 상태 코드가 있는데, 300은 안쓴다고 한다.

  • 304 (Not Modified) : 리소스가 안바뀌었으니 니 캐시에 있는 리소스 그대로 쓰면 된다.

라고 한다!

4xx 상태 코드

4xx는 클라이언트의 오류로써, 클라측에서 문법이 잘못되었거나 요청이 잘못되었을때 발생하는 에러다.

400, 401, 403, 404 등이 있다.

  • 400 (Bad Request) : 요청 구문, 메시지 등의 오류다. 클라는 요청 내용을 재검토하고 보내야한다.
  • 401 (Unauthorized) : 인증이 되지 않았을때 뜨는 코드
  • 403 (Forbidden) : 서버가 요청을 이해했지만 승인을 거부했다. 주로 접근 권한이 충분하지 않을때 뜨는 코드
  • 404 (Not Found) : 정말 많이 마주했던 코드다 ㅋㅋ 요청했던 리소스(주로 html이었음)가 서버에 없음!

5xx 상태 코드

5xx는 서버의 오류로 인해 발생하는 코드라고 한다.

클라이언트의 오류는 클라이언트가 요청을 제대로 고쳐먹어야지만 다른 결과를 기대할 수 있지만 서버측의 오류는 계속 같은 요청으로 재시도하면 성공할 수 있다. (서버 복구시)

서버측의 오류에는 500, 503등의 코드가 있다.

  • 500 (Internal Server Error) : 서버 내부 문제로인한 오류다. 애매하면 500 오류라고 한다.
  • 503 (Service Unavailable) : 서비스 이용 불가를 의미하는 코드!

이렇게 에세이로 쭈우우욱 적어보니 복습도 되고 좋은 것 같다.

이제 다와간다!! 파이팅

profile
부지런히 살자!!

0개의 댓글