[HTTP] http 상태코드

이건회·2022년 5월 6일
0

HTTP

목록 보기
14/16

  • http 상태코드는 클라이언트의 요청이 어떻게 처리되었는지를 응답해주는 기능이다
  • 100대는 요청이 처리중, 200대는 요청 정상 처리, 300대는 요청 완료를 위해 추가 행동이 필요하다는 뜻이다.
  • 400,500대는 무언가 문제가 있다는 것이다. 400대는 클라이언트의 오류, 500대는 서버의 오류다.

  • 따라서 253, 451처럼 애매한 상태코드가 내려오면 그냥 200대, 400대를 보고 해석하면 된다.
  • 미래에 새로운 상태 코드가 추가되도 이처럼 상위레벨로 해결하면 되므로 클라이언트를 변경할 필요가 없다.

  • 100대는 요청이 처리중이라는 뜻이다. 거의 사용하지 않는다.

  • 200대는 클라이언트의 요청이 성공된 것이다.

  • 200 ok가 성공적 처리의 대표격이다.
  • 201은 요청의 성공으로 무언가가 생성된 것이다. 만약 post로 위와 같은 새 회원을 생성할 시 응답 코드를 201로 생성한 후 헤더에 location을 통해 새로 생성된 리소스의 uri를 보내준다. 클라이언트는 200대를 받으며 요청이 성공함과 로케이션을 통해 무언가 생성됐음을 알 수 있다.

  • 202는 요청이 접수되었으나 처리가 아직 되지 않은 것이다.
  • 204는 서버가 성공적으로 요청을 수행했지만 응답 페이로드 본문에 보낼 데이터가 없는 경우다. 웹 문서에 저장 버튼을 눌러도 데이터베이스에 저장만 하지 새로운 창을 띄울 필요가 없을 때 이런 경우가 있다. 결과 내용이 없어도 204 메세지만으로 성공을 인식할 수 있다.

  • 300대는 리다이렉션으로 클라이언트가 요청을 하면 서버가 요청 완료를 위해 클라이언트에 추가적 정보를 요청하는 것이다.

  • 웹 브라우저는 300대 응답의 결과에 로케이션 헤더가 있을 경우, 로케이션 위치로 자동 이동한다.
  • 예를들어 이벤트 페이지에서 기존에 쓰던 /event 가 아닌 /new-event 라는 페이지를 사용할 경우, /event를 사용하던 사용자들이 요청을 보낼 경우 서버는 301 응답을 보내며 로케이션으로 /new-event를 보내준다. 그러면 웹 브라이저 스스로 /new-event로 경로를 바꾸고 다시 새 페이지로 요청을 보내 서버가 200으로 응답한다.

  • 리다이렉션의 종류가 세 가지 있다.
  • 영구 리다이렉션은 uri가 영구적으로 이동한 것이다.
  • 일시 리다이렉션은 주문 완료 후 주문 내역 화면으로 일시적 이동하는 것처럼 일시적인 변경의 경우다.
  • 특수 리다이렉션은 클라이언트의 캐시가 만료된 것 같은 경우 클라이언트가 결과 대신 캐시 정보를 서버에 넘겨준다. 이때 서버가 캐시가 이상이 없으면 다시 응답을 하는 것이 특수 리다이렉션이다.

  • 영구 리다이렉션은 원래의 url이 사용되면 안된다. 그래야 검색 엔진이 변경을 인지할 수 있다.
  • 301은 리다이렉트 요청 시 요청 메소드가 post여도 get으로 바뀌고 본문이 제거될 수 있다.
  • 308은 301과 기능은 같으나 요청 메소드와 본문이 유지된다.

  • 301의 동작 예시다
  • 사용자가 post로 이전 url로 서버에 생성 메세지를 전송한다. 서버는 301로 로케이션을 포함해 응답한다. 클라이언트는 새로운 url로 요청을 보내는데 get으로 보낸다. 그러나 이때 메세지 바디부분이 사라진다. 그러면 본인이 등록해야 하는 내용을 다시 등록해야한다.
  • 그러나 301이라고 무조건 변경되고 무조건 본문이 제거되는 것은 아니다.

  • 308은 301과 반대로 다시 클라이언트에서 서버로 요청을 보낼때 포스트를 유지하므로 메세지 본문이 유지된다. 따라서 바로 이벤트 참여가 된다.

  • 일시적 리다이렉션은 리소스의 uri가 일시적으로 변경되는 것이다. 따라서 검색 엔진에서 url을 변경하면 안된다.
  • 리다이렉션의 종류는 302 307 303이 있다. 기능은 모두 같으나 살짝 다르다.
  • 302는 요청 메세지가 get으로 변하고 본문이 제거 될 수 있다.(MAY)
  • 307은 리다이렉트시 요청 메소드와 본문을 유지해야 한다.
  • 303은 리다이렉트시 요청 메소드가 get으로 변경된다.(반드시)

  • 일시적인 리다이렉트는 언제 쓸까?
  • prg(post/redirect/get)가 일시적인 리다이렉션이 일어나는 경우다.
  • post로 주문을 한 후 웹 브라우저를 새로고침하면 post로 다시 요청이 된다. 따라서 중복 주문이 될 수 있다.

  • 만약 /order로 id가 1인 post 주문을 보낼 때 서버는 주문 데이터를 보내고 ok를 응답한다.
  • 만약 실수로 새로고침을 보내면 다시 post로 새 요청을 보낸다. 이 경우 주문 데이터가 한 번 더 들어오게 되어 중복이 된다.

  • 이를 방지하게 위해 post 주문 후에 주문 결과 화면을 get 메소드로 리다이렉트 하는 것이다.
  • 새로고침을 해서 결과 화면이 get으로 조회되니 결과 화면만 get으로 요청하는 것이다.

  • 첫 과정은 위와 같으나 주문에 대한 결과를 302로 준다. 로케이션 정보는 주문번호로 준다.
  • 클라이언트가 302가 왔으므로 리다이렉트를 한다. 따라서 get으로 요청을 바꾸고 19번 주문정보를 조회하는 요청을 보낸다. 따라서 실수로 새로고침을 해도 get 요청이 들어간다.

  • 따라서 get으로 조회하면 오류가 줄어들어 사용성이 높아진다.

  • 요청이 명확한 302,303을 권장하지만 이미 많은 애플리케이션 라이브러리가 302를 사용하므로 302를 사용해도 문제가 없다.

  • 300과 304라는 리다이렉션도 있다. 300은 쓰지 않고, 304는 캐시의 만료 여부를 확인하는 목적으로 사용된다. 304는 응답에 메세지 바디를 포함하면 안된다.

  • 클라이언트 오류인 400대와 서버오류인 500대를 알아보겠다.
  • 400대의 오류는 클라이언트가 원인이므로 서버가 요청을 수행할 수 없다.
  • 500대와의 중요한 차이는 500대는 나중에 데이터베이스를 복구하고 재시도를 하면 성공할 가능성이 있지만 400대는 애초에 잘못된 요청을 보내므로 같은 재시도를 하면 실패한다.

  • 400 오류는 클라이언트의 잘못된 요청을 의미한다. 따라서 이 응답이 오면 클라이언트는 요청 내용을 다시 검토하고 보내야 한다.

  • 401 오류는 클라이언트가 해당 리소스에 대한 인증이 필요한 것이다.
  • 인증(Authentication)은 로그인처럼 본인이 누구인지 확인하는 것이고, 인가(Authorization)는 권한 레벨을 부여하는 것이다.

  • 403은 서버가 요청을 이해했지만 접근 권한 불충분 등의 이유로 승인을 거부한 것이다.

  • 404는 요청 리소스를 찾을 수 없어 서버가 제공할 수 없는 것이다.

  • 500대 오류는 서버의 문제므로 복구 후 재시도시 성공할 수 있다.
  • 웬만하면 서버에서 500대 오류가 발생하지 않도록 설계해야 한다.

  • 500오류는 서버 내부 문제를 나타내는 대표격 오류다

  • 503 오류는 서버가 일시적 과부하 혹은 예정된 작업 떄문에 잠시 요청을 처리할 수 없는 경우다.
profile
하마드

0개의 댓글