HTTP 프로토콜#3 ( 상태코드 )
HTTP 상태 코드를 2xx(성공)·3xx(리다이렉션)·4xx(클라이언트 오류)·5xx(서버 오류)로 분류해 정리한 노트다. 특히 3xx 리다이렉션에서 301/308(영구)과 302/307/303(일시)이 리다이렉트 후 HTTP 메서드와 message body 유지 여부가 서로 다르다는 점, 그리고 POST 재전송 문제(PRG 패턴)를 피하기 위해 현재는 303/307이 권장된다는 점이 핵심이다.
실행 환경
본 문서는 특정 언어/프레임워크 버전에 종속되지 않는 HTTP 프로토콜 자체의 상태 코드 시맨틱을 다루며, 예시의 요청/응답 라인은 HTTP/1.1 메시지 형식을 따른다.
2xx
-
상세설명
- 클라이언트의 요청을 처리함
-
200 (OK)
- 요청 성공
- Response : “HTTP/1.1 200 OK”
HTTP/1.1 200 OK
Content-Type : application/json
Content-Length : 29
{
“name” : “pp”,
“count” : 20
}
- 201 (Created)
- 요청 성공해서 새로운 리소스가 생성됨
HTTP/1.1 201 Created
Content-Type : application/json
Content-Length : 29
Location: /main/100
{
“name” : “pp”,
“count” : 20
}
- 202 (Accepted)
- 요청은 되었으나, 처리가 완료되지 않음
- 204 (No Content)
- 서버가 요청에 성공적으로 수행했지만, 응답 본문에 보낼 데이터가 없음
3xx
- 상세설명
- 리다이렉션 (Location 필드가 있으면, 해당 위치로 자동 이동)
- 요청을 완료하기 위해 추가 조치 필요
- 리다이렉션 종류
- a) 영구 리다이렉션
- 특정 리소스의 URI가 영구적으로 이동
- b) 일시 리다이렉션
- 일시적으로 이동 후 처리가 완료되면 원래 URI로 이동
- c) 특수 리다이렉션
- 결과 대신해서 캐시를 사용
- a) 영구 리다이렉션
a) 영구 리다이렉션 ( 새로고침 -> 리다이렉션된 URL로 이동 )
- 301
- 과정
- 클라이언트 : POST 요청
- 서버: 301 응답
- 클라이언트 : (자동) 해당 LOCATION 으로 이동 ( method : post -> get 으로 변경 )
- 리다이렉션 되는 과정(POST -> GET)에서 처음 POST에 존재하던 message body 내용이 제거 될 수 있음 ( 확정 x )
- 과정
- 308
- 과정
- 클라이언트 : POST 요청
- 서버 : 308 응답
- 클라이언트 : (자동) 해당 LOCATION으로 이동 ( method : post -> post 유지 )
- 리다이렉션 되는 과정에서 message body가 유지됨
- 과정
b) 일시적인 리다이렉션 ( 새로고침 -> 원래 URL로 이동 )
- 302
- 과정
- 클라이언트 : POST 요청
- 서버 : 302 응답
- 클라이언트 : (자동) 일시적으로 해당 LOCATION 으로 요청 ( method : post -> get으로 변경 )
- 리다이렉션 되는 과정에서 message body 날아감 ( 확정 x , 그럴 확률이 있음 )
- 과정
- 307
- 과정
- 클라이언트 : POST 요청
- 서버 : 307 응답
- 클라이언트 : (자동) 일시적으로 해당 LOCATION 으로 요청 ( method : post -> post 유지 )
- 리다이렉션 되는 과정에서 message body 및 요청 method 유지
- 과정
- 303
- 과정
- 클라이언트 : POST 요청
- 서버 : 303 응답
- 클라이언트 : (자동) 일시적으로 해당 LOCATION으로 요청 ( method : post -> get으로 변경 )
- 리다이렉션시, 요청 메서드가 GET으로 변경 (확정)
- 과정
302와 303은 유사하나, 302가 애매한 처리를 보여서 303으로 확실하게 한 것
- 현재 권고되는 응답코드는 “307, 303” 이다.
POST 유지시 문제점
- POST는 멱등이 안되므로, 새로고침시 중복 처리가 일어날 수 있음 (post -> post 유지)
- GET으로 변경하는 부분이 필요 ( PRG -> Post/Redirect/Get)
- 303 또는 301로 사용하는 것이 권장됨
c) 기타 리다이렉션
- 304 (Not Modified)
- 캐시를 목적으로 사용
- 리소스 (자원) 자체가 변경이 없음 ( -> 캐시 이용)
- 304 응답은 message body를 포함하면 안됨 ( 로컬 캐시를 이용하므로 )
- 조건부 -> GET / HEAD 요청시 사용
4xx
-
상세설명
- 오류의 원인이 클라이언트에 있음
-
400 (Bad Request)
- 요청 구문, 메시지 오류
-
401 (Unauthorized)
- 클라이언트가 접근 권한이 없음 (인증되지 않음)
- 로그인 정보가 아닐때 사용됨
-
403 (Forbidden)
- 접근권한이 불충분할 경우 (admin 리소스에 접근)
-
404(Not Found)
- 리소스가 서버에 존재하지 않음
5xx
-
상세설명
- 서버 문제로 오류 발생
-
500 (Internal Server Error)
- 서버 내부 문제로 오류 발생
- 애매할경우 주로 사용됨
-
503 (Service Unavailable)
- 서버가 일시적인 과부하 또는 예정된 작업으로 서버 요청 처리 불가 상태
관련 문서
- (학습/프레임워크/Spring Framework) HTTP 이론 - 핵심 개념 및 특징 정리 — 이 노트의 HTTP 상태코드 내용을 메서드·헤더까지 포함해 한 문서로 종합 정리한 강의 노트