섹션 6. HTTP 상태코드

콜 파머가 될 남자·2023년 3월 25일
0
post-thumbnail

HTTP 상태코드 소개

요청에 대한 응답이 올 때 알려주는 기능

1xx (Informational)
요청이 수신되어 처리중이다
-> 거의 사용하지 않으므로 생략


2xx - 성공

200 OK (가장 대표적)

201 Created

2xx 이므로 일단 성공 했구나!
-> 	2xx 중에서도 201 이므로 자원이 생성되었고 Location 헤더가 있을 수 있겠구나 

202 Accepted (잘 사용하지 않음)

요청이 접수되었으나 처리가 완료되지 않음

204 No Content

서버가 보통 요청을 받으면 응답값을 내보냄
서버가 성공적으로 요청을 받았지만, 응답 페이로드 본문에 보낼 데이터가 없음

예) 웹 문서에서 save 버튼을 누름
-> save 버튼의 결과로 아무 내용이 없음
-> save 버튼을 눌러도 같은 화면을 유지함
-> 결과 내용이 없어도 204 메시지(2xx)만으로도 성공을 인식할 수 있다.


많은 상태코드들이 있지만 그 중 핵심만 사용하는것이 좋음
ex) 성공은 200 or 201 만 사용하자

각 팀 내부에서 범위를 잡고 사용하는 것이 좋음

3xx - 리다이렉션1

요청을 완료하기 위해 유저 에이전트(클라이언트 프로그램 -> 웹브라우저)의 추가 조치가 필요하다

301 ~ 308 까지가 중요하다

웹 브라우저는 3xx 응답의 결과에 Location 헤더가 있으면, Location 위치로 자동 이동한다 (리다이렉트)

영구 리다이렉션 - 특정 리소스의 URI가 영구적으로 이동
301, 308
원래의 URL을 사용X, 검색 엔진 등에서도 변경을 인지한다

301 Moved Permanently
	리다이렉트시 요청 메서드가 GET으로 변하고, 본문이 제거될 수 있다 (MAY)
    
308 Permanent Redirect
	301과 기능은 같음
    리다이렉트시 요청 메서드와 본문 유지 (처음 POST를 보내면 리다이렉트도 POST)
    (301은 POST에서 GET으로 변경됨)

3xx - 리다이렉션2

일시 리다이렉션 - 리소스 URI의 일시적인 변경
302, 307, 303
검색 엔진 등에서 URL을 변경하면 안됨

302
요청 메서드가 GET으로 변하고, 본문이 제거될 수 있다 (MAY)

307 Temporary Redirect
302와 기능은 같음
리다이렉트시 요청 메서드와 본문 유지(MUST NOT)

303 See Other
302와 기능은 같음
리다이렉트시 요청 메서드사 GET으로 변경

PRG: Post/Redirect/Get
POST로 주문후에 웹 브라우저를 새로고침하면?
-> 새로고침은 다시 요청
-> 중복주문이 될 수 있다

_** 정리: 307, 303 을 권장하지만 현실적으로 이미 많은 애플리케이션 라이브러리들이 302를 기본값으로 사용하기 때문에, 자동 리다이렉션시에 GET으로 변해도 되면 그냥 302를 사용해도 큰 문제가 없다 **_

특수(기타) 리다이렉션 - 결과 대신 캐시를 사용

300 Mutiple Choices: 안쓴다.

304 Not Modified
	캐시를 목적으로 사용
    클라이언트에게 리소스가 수정되지 않음을 알려주고 클라이언트는 로컬 PC에 저장된 캐시를 재사용한다 -> 캐시로 리다이렉트한다.
    304 응답은 캐시를 사용하기 때문에 바디를 포함하면 안된다
    조건부 GET, HEAD 요청시 사용하나

4xx - 클라이언트 오류, 5xx - 서버 오류

클라이언트 잘못 -> 4xx 오류
서버 잘못 -> 5xx 오류

4xx 오류는 재요청해도 계속 실패함 (복구불가능)
5xx 오류는 서버가 복구되면 성공할 가능성이 있음

400 Bad Request
요청 구문, 메시지의 오류 -> 클라이언트는 요청 내용을 검토하고 다시 보내야함

401 Unauthorized
클라이언트가 해당 리소스에 대한 인증이 필요하다
인증(Authentication): 본인이 누구인지 확인, (로그인)
인가(Authorization): 권한부여
오류 메시지: Unauthentication 일 것 같지만? Unauthorized 임 (이름이 아쉬움)
"인증이 안됐다, 로그인이 안됐다" 로 이해하자

403 Forbidden
서버가 요청을 이해했지만 승인을 거부함 
접근할 수 없는 리소스에 접근했을경우

404 Not Found
요청 리소스가 서버에 없음
OR 클라이언트가 권한이 없는 리소스에 접근했을때(+ 403을 내기 싫을때)

***

500 Internal Server Error
서버 내부 문제로 오류 발생 -> 애매하면 500 오류

503 Service Unavailable
서비스 이용불가 
일시적진 과부하 또는 예정된 작업으로 요청처리X
Retry-After 헤더 필드로 얼마뒤에 복구되는지 보낼 수 있음

비즈니스로직상 예외인경우 
서버를 닫았다는 전제하에 
Ex) 20세이상 가능한데 15세가 요청한 경우 -> 4xx 오류를 내야함
    예금 인출하는데 잔고가 부족한 경우 -> 4xx 오류
    
서버가 쿼리문제, DB 내려감, NPE 인 경우만 5xx 오류 내야함

Reference
김영한 님 - 모든 개발자를 위한 HTTP 웹 기본 지식

profile
콜 파머가 개발자라면 사회적 인지도는 어느 정도일까

0개의 댓글