[네트워크] HTTP 상태 코드에 대한 나름의 이해

2023. 11. 3. 19:56네트워크

HTTP 상태 코드는 Response message의 내용으로 요청에 대한 처리 상태를 의미한다.
다음의 것들이 있다.
 
1xx(Informational): 요청이 처리되고 있다는 뜻으로 거의 사용되지 않는다.
2xx(Successful): 요청이 성공적으로 처리되었다.
3xx(Redirection): 요청을 처리하려면 추가적인 행동이 필요하다. 
4xx(Client error): 클라이언트 오류, 잘못된 문법 등으로 서버에서 처리할 수 없다.
5xx(Server error): 서버의 내부적 문제로 제대로 처리하지 못했다.
 
상태코드는 세자리 수이지만 앞자리가 전부이다.
조금씩 메시지는 다를 수는 있지만 큰 골자에서는 내용은 같다.
따라서 클라이언트 측에서는 앞자리만 가지고 설계를 하면 된다.
이러면 미래의 상태 코드에 변화가 있어도 상위 상태코드만 해석하면 된다.
 
2xx: 성공코드이다. 많이 쓰이는 것들로 다음과 같은 것들이 있다.
200(OK): 요청이 성공적으로 처리됐다.
201(Created): 요청한 리소스가 생성되었다.(header에 Location 필드로 URI를 넣어준다)
202(Accepted): 요청을 성공적으로 받았으나 처리가 완료되지는 않았다.(배치 처리할 때 사용) 
204(No content): 요청을 성공적으로 처리했으나 보낼 데이터가 없다(웹문서 save에서 사용. save를 해도 따로 보낼 게 없다)
 
3xx: 리다이렉션 코드이다. 크게 두가지로 나눌 수 있다.
영구적 리다이렉션, 일시적 리다이렉션
영구적 리다이렉션: 영구적으로 URI 값이 바꼈을 때 사용한다.
301(Moved Permanently): Location 헤더 URI로 이동하고 GET METHOD로 요청할 수 있다. 즉 POST로 보내도 GET으로 바꾸는 것이다. 대부분의 브라우저는 GET으로 바꾼다.
308(Permanent Redirect): Location 헤더 URI로 이동하고 원래의 메소드를 요청한다. 즉 POST로 보내면 POST를 유지하는 것이다. 
영구적으로 바뀐다는 것은 서버에서 받아야 하는 데이터의 형식이 바뀔 가능성이 높기 때문에 301이 권장된다.
 
일시적 리다이렉션: 일시적으로 URI 값을 바꿀 때 사용한다.
일시적 리다이렉션을 사용하는 이유는 POST 요청 후 새로고침 때문이다.
새로고침은 이전 요청을 다시 요청한다. 즉 POST를 다시 요청한다.
주문 요청이었다면 주문을 다시 요청한다. 중복 주문이 되는 것이다.
서버에서 잘 처리할 필요도 있지만 리다이렉션을 통해 해결할 수 있다. 사용성도 높일 수 있다.
POST로 보내면 서버측에서 응답메시지를 줄 때 302번과 주문이 처리된 페이지를 헤더 로케이션에 담아 주는 것이다. 그러면 브라우저는 GET 요청을 날리게 된다.
이 상태에서 새로고침을 하면 이전 요청은 GET이기 때문에 중복 요청 문제가 해결이 된다.
이러한 프로세스를 PRG(POST REDIRECTION GET)이라고 한다.
 
302(Found): Location 헤더 URI로 이동하고 GET METHOD로 요청할 수 있다(MAY). 대부분의 브라우저가 이렇게 구현했다.
307(Temporary Redirect): 무조건 메소드를 유지한다.
303(See Other): 무조건 GET으로 요청한다.
대부분의 애플리케이션은 302를 쓴다. 그리고 대부분의 브라우저는 302에서 GET으로 바꾸기 때문에 302를 사용하면 된다.
 
4xx: 클라이언트 오류 코드이다. 클라이언트측에서 잘못된 요청을 한 것이다.
400(Bad Request): 요청 파라미터가 잘못되거나 API 스펙이 잘못되었다.
401(Unauthorized): 인증이 되지 않았다. 인증은 내가 누구인지를 확인하는 것이다. 인가는 내가 특정 리소스에 접근 권한이 있는가이다. WWW-Authenticate와 함께 인증방법을 알려준다.
403(Forbidden): 서버가 요청을 이해했지만 승인을 거부한다. 인증은 되었지만 특정 리소스에 접근할 권한이 없는 것이다.
404(Not Found): 해당하는 리소스가 없을때이다. 하지만 서버 측에서 리소스는 있지만 권한이 없을때 리소스를 숨기기 위해서도 사용한다.
 
5xx: 서버 오류 코드이다. 서버에 문제가 있기 때문에 재시도를 하면 성공할 수 있다. 하지만 클라이언트 오류는 이게 안된다.
500(Internal Server Error): 서버 내부 오류로 발생한다. 애매하면 500 오류이다.
503(Service Unavailable): 서비스를 이용 불가하다. 서비스가 일시적인 과부하나 예정된 작업으로 잠시 사용할 수 없다. 언제 복구될지 알려준다. 그런데 대부분의 서비스 장애는 예측 불가하다. 그래서 500을 사용하라.
 
서버 오류 코드를 할당할 때는 이게 클라이언트 오류가 아닌지 주의하라.
로직 상 에러가 나는 것이라면 클라이언트 오류가 맞다.
서버 오류는 쿼리가 잘못되거나 NPE나 DB 문제 등 진짜 서버에 문제가 생길 때만 사용하라.
 
Reference


https://www.inflearn.com/course/lecture?courseSlug=http-%EC%9B%B9-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC&unitId=61373

학습 페이지

www.inflearn.com