HTTP 상태 코드는 서버가 “요청 처리 결과가 지금 어떤 상태인지”를 알려주는 신호다.
프론트/클라이언트 입장에서는 이걸 보고 “다시 요청할지, 로그인 시킬지, 페이지 이동할지” 같은 다음 행동을 정하게 된다.
상태 코드 분류
모르는 상태 코드가 오면?
클라이언트가 모르는 코드가 와도 보통 앞자리 기준으로 해석한다.
→ 그래서 미래에 상태 코드가 늘어나도 클라이언트를 매번 바꿀 필요가 없다.
200 OK
성공. 조회/수정/삭제 등 대부분에 무난하게 쓰인다.
201 Created
새 리소스 생성
그리고 보통 Location 헤더로 생성된 리소스 URI를 알려준다.
202 Accepted
요청은 받았는데 아직 처리 끝은 아니다.
배치 같은 “비동기 처리”에 쓰인다.
204 No Content
성공은 했는데 본문으로 내려줄 게 없다.
3xx가 나오면 브라우저는 보통 Location 헤더를 보고 자동으로 이동한다.
리다이렉션 종류
⸻
“이 URI는 이제 앞으로 계속 여기로 가세요” 느낌.
• 예: /members → /users
301 Moved Permanently
리다이렉트되면서 메서드가 GET으로 바뀔 수도 있고, 바디가 사라질 수도 있다. (MAY)
308 Permanent Redirect
301이랑 비슷한데, 메서드/바디를 그대로 유지한다.
(POST로 보냈으면, 리다이렉트도 POST로 유지)
⸻
URI가 잠깐 바뀐 것뿐이라서 검색엔진 같은 곳에서 URL을 “영구 변경”으로 취급하면 안 된다.
PRG(Post/Redirect/Get)
주문 완료: POST /orders
그 상태에서 새로고침하면?
→ 브라우저가 POST를 다시 날릴 수 있어서 중복 주문 터질 수 있다.
302 Found
리다이렉트 시 GET으로 바뀔 수도 있음(MAY)
현실적으로 라이브러리/브라우저들이 기본값으로 많이 쓴다.
307 Temporary Redirect
302랑 목적은 비슷한데, 메서드가 절대 바뀌면 안된다.(MUST NOT)
즉, POST면 POST 유지.
303 See Other
리다이렉트 시 무조건 GET으로 변경한다.
PRG 패턴에서 의도가 명확해서 깔끔하다.
결론적으로는
⸻
캐시를 위한 상태 코드를 이미한다.
클라이언트 요청 자체가 잘못됐으니, 똑같이 재시도하면 보통 계속 실패한다.
인증(Authentication): 너 누구야? (로그인)
인가(Authorization): 너 이거 할 권한 있어? (ADMIN 같은 권한)
⸻
서버가 터졌거나 처리가 실패했음을 의미한다.
그래서 재시도하면 성공할 수도 있다. (서버가 복구되면)
출처
모든 개발자를 위한 HTTP 웹 기본 지식 (김영한, 인프런, 2020)