http : 6 - by 김영한님 강의

꾸준하게 달리기~·2023년 6월 26일
0

cs

목록 보기
6/16
post-thumbnail

HTTP 상태코드

클라이언트가 보낸 요청의 처리 상태를 응답을 통해 알려주는 기능.
크게 다섯가지로 나뉨.

인식할 수 없는 상태코드를 반환한다면?
-> 클라이언트는 상위 상태코드로 해석해서 처리한다.
(ex) 286 ???과 같은 인식할 수 없는 상태코드가 반환되면,
2xx (Successful) 과 같은 방식으로 반환한다.



1XX (Informational)

거의 사용되지 않는다.

2xx (Successful)

대표적으로,

  • 200 OK (결과를 정상적으로 반환했을 때)

  • 201 Created (POST 요청과 같이 새로운 리소스 생성할 때)

  • 202 Accepted (요청 접수했으나 완료되지 않았을 때)

  • 204 No Content (성공적으로 수행했지만, 응답에 보낼 데이터가 없을 때)
    그럼, 언제 사용하나..?
    예를 들어, save 버튼 (결과로 아무 내용이 없어도 되고, 같은 화면을 유지해야 할 때)

보통은 너무 중구난방으로 숫자를 응답하면, 어떤 상태인지 헷갈리니까,
범위를 잡고 사용함.


3xx (Redirection) 리다이렉션

요청을 완료하기 위해 추가적인 조치가 필요하다!
를 위해 보내는 상태코드

3xx의 결과에 location 헤더가 있으면,
웹 브라우저는 해당 location 위치로 자동으로 이동한다.

위의 예시를 통해 설명하자면,
1번의 /event는 지금은 사용하지 않는 예전의 이벤트 경로,
4번의 /new-event 지금 사용하는 이벤트 경로라고 하자.
그러면 예전에 이벤트 페이지를 북마크나 즐겨찾기를 통해 기록해놓은 분들이 있을것이다.
해당 북마크나 즐겨찾기를 통해 접속한다면, (1번)
응답으로 3xx 상태코드를 보내며 location 헤더를 보낸다. (2번)
그러면 자동으로 해당 location으로 redirect한다. (3, 4번)
해당 location으로 이동 후 성공의 의미로 2xx 상태코드를 반환받는다. (5번)

  • 301, 308 영구 리다이렉션 (와 같이 영구적으로 URL이 바뀐 상황)
    301과 308의 차이는,
    redirect 요청시
    POST요청 그대로 HTTP매서드가 변하지 않고,
    1번의 name=hello&age=20 의 본문이 유지될수 있다 없다
    정도의 차이이다. (308이 매서드와 본문 둘 다 유지됨)
    그렇기 때문에,
    301은 이전 정보(본문)를 유지하지 않으므로,
    다시 정보를 전달해주어야 한다.
    아래는, 301의 예시이다.
    (본문 사라지고, POST 매서드에서 GET매서드로 바뀜.)


  • 302, 307, 303 일시적인 리다이렉션 (리소스의 URI가 일시적으로 변경된 상황.)
    일시적 변경은 언제 사용할까?
    POST 후 200 OK 코드를 받고
    새로고침을 하면,
    다시 또 POST 요청이 서버에 들어가게 된다.
    서버에 다시 똑같은 POST 요청이 들어가지 않게 하도록,
    POST 후 300 redirect 코드를 받는것이다.
    그렇게 설정하면,
    POST 후 300 redirect를 받고,
    결과 화면을 GET 매서드로 redirect 한다.

    마지막줄의 핵심 내용이 아래 그림의 8번이다.

    위의 내용은 실무에서 사용성이 높다.


    본문이 name=hello&age=20 일때,
    302는 redirect시 HTTP매서드 GET으로 변하고 본문 제거된다.
    307은 302와 기능은 같지만, 매서드(POST)와 본문은 유지된다.
    303은 302와 기능은 같고, 매서드(POST->GET)가 변경된다.

  • 304 기타 redirection
    캐시를 목적으로 이용한다.
    쉽게 말해서 클라이언트에게,
    야! 너 캐시 메모리 뒤져봐라 아마 이 정보 있을걸?
    이라는 정보를 전달하기 위해 사용한다.
    그래서 로컬 캐시를 사용해야 하므로, 응답에 메시지 바디를 포함하면 안된다

4xx (Client Error) 클라이언트 오류

쉽게 말해서, 잘못된 문법 등으로 인해 클라이언트가 잘못했을때.
그렇기에, 서버 문제가 아니기 때문에
똑같은 시도를 하면 계속해서 실패한다.

  • 400 Bad Request
    위 언급대로 문법, 파라미터, 자료형, API스펙 등이 맞지 않을때.
    해결을 위해서 클라이언트가 다시 검토하고 보내야함.
    아래는 자료형의 스펙이 맞지 않을때 400 에러의 예시이다.
//서버가 원하는것
{
	"name" : "이인건"
}

//내가 보낸것
{
	"name": 1
}

  • 401 Unauthorized
    인증에 관한 느낌의 오류이다.
    글씨에서 읽을 수 있듯, 인증되지 않았을 때,
    쉽게 말해 로그인되지 않았을 때
    생기는 오류이다.
  • 403 Forbidden
    인가에 관한 느낌의 오류이다.
    여기서 잠깐!
    인증 - 검증된 사용자인지
    인가 - 검증된 사용자가 어디까지의 권한을 가지고 있는지
    정도의 느낌이다.


    위와 같은 방식으로 ROLE을 부여했을때, 객체가 가지고 있는 ROLE에 따라 권한이 다른데,
    내가 가진 권한으로 사용할 수 없는 메서드를 사용하려고 한다면,
    보내줄 수 있는 상태코드이다.

  • 404 Not Found
    요청받은 리소스 자체를 찾을 수 없을때의 오류이다.

5xx (Server Error) 서버오류

이름 그대로 서버 문제로 오류가 발생했을때의 코드이다.
클라이언트 에러와 다르게,
서버가 복구되면 똑같은 요청으로 성공될 수도 있다.

  • 500 Internal Server Error
    서버 내부 문제, 애매하면 500오류를 사용한다.

  • 503 Service Unavailable
    일시적 과부화 or 예정된 작업으로 잠시 요청을 처리할 수 없을떄
    사용한다.

그림 출처 : 김영한님 pdf, 코드는 내거

profile
반갑습니다~! 좋은하루 보내세요 :)

0개의 댓글