이 글은 김영한님의 인프런 강의인 모든 개발자를 위한 HTTP 웹 기본 지식 강의를 요약한 것입니다.
1. 상태 코드 종류
상태 코드는 클라이언트 요청의 처리 상태를 응답에서 알려주는 기능을 한다.
- 1xx(informational): 요청이 수신돼 처리 중(거의 사용하지 않음)
- 2xx(successful): 요청 정상 처리됨
- 3xx(redirection): 요청을 완료하려면 추가적인 처리가 필요함
- 4xx(client error): 클라이언트 오류. 잘못된 문법 등으로 인해 서버가 요청을 수행할 수 없음
- 5xx(server error): 서버 오류. 서버가 정상적인 요청을 처리하지 못함
클라이언트가 인식할 수 없는 상태 코드를 서버가 반환한다면 클라이언트는 상위 상태 코드로 해석한다. 예를 들어 클라이언트가 해석하지 못하는 451이라는 상태 코드를 서버가 반환하면, 클라이언트는 4xx이라는 상태 코드로 해석한다.
2. 2xx 상태 코드(successful)
200번대 상태 코드
주요 200번대 상태 코드에는 아래와 같은 것들이 있다.
- 200 OK
- 201 Created
- 요청 성공으로 새로운 리소스가 생성됨.
- 생성된 리소스는 응답 헤더 중
Location
으로 식별한다.
- 예:
Location: /members/100
- 202 Accepted
- 요청이 접수되었지만 처리가 완료되지 않음
- 배치 처리에서 사용
- 예: 요청 접수 후 1시간 뒤에 배치 프로세스가 요청을 처리
- 204 No Content
- 서버가 요청을 성공적으로 수행했지만 응답 페이로드에 보낼 데이터가 없음
- 예: 웹 문서 편집기에서의 save 버튼. save 버튼을 누를 시 저장만 되면 될 뿐 그 결과 내용을 알 필요가 없을 수 있음
3. 3xx 상태 코드(redirection)
리다이렉션의 이해
웹 브라우저는 3xx 응답 결과에 location 헤더가 있으면, location 위치로 자동 이동하는 특성이 있다. 이를 리다이렉트라고 한다. 3xx 상태 코드에서 말하는 리다이렉션은 클라이언트 요청을 완료하기 위해서 유저 에이전트의 추가 조치가 필요함을 말한다.
리다이렉션의 종류
- 영구 리다이렉션(잘 사용하지 않음)
- 특정 리소스의 URI가 영구적으로 이동하는 것
- 검색 엔진 등에서 URL이 변경됨
- /members -> /posts
- 301, 308 상태 코드
- 일시 리다이렉션(주로 사용됨)
- 검색 엔진 등에서 URL을 변경하면 안됨
- 주문 완료 후 주문 내역 화면으로 잠깐 이동하는 것(예시)
PRG
(Post/Redirect/Get)
- POST로 주문 후에 브라우저를 새로고침하면, 새로고침은 다시 POST로 요청해 중복 주문이 이뤄질 수 있음.
- 이를 해결하려면 POST 주문 후 주문 결과 화면을
GET
메서드로 리다이렉트 해야한다. 추가적으로 서버에서도 주문 번호로 중복 주문을 막아야 한다.
- 특수 리다이렉션
300번대 상태 코드
주요 300번대 상태 코드에는 아래와 같은 것들이 있다.
- 300 Multiple Choices
- 301 Moved Permanently(영구)
- 리소스의 URI가 영구적으로 이동
- 리다이렉트 시 요청 메서드가 GET으로 변경. 메시지 본문이 제거될 수 있음
POST /event
요청 시 응답 Location
의 URI로 재요청 시 메서드가 GET으로 변경
- 302 Found(일시)
- 리다이렉트 시 요청 메서드를 대부분 GET으로 변경(브라우저 마다 다름). 메시지 본문이 제거될 수 있음
- 303, 307을 권장. 하지만 302를 기본 값으로 사용하느 곳이 많음. GET으로 메서드가 변해도 되면 302를 사용해도 큰 문제는 없음
- 303 See Other(일시)
- 302와 기능 같음
- 리다이렉트 시 요청 메서드가 GET으로 변경
- 304 Not Modified
- 캐시를 목적으로 사용, 캐시로 리다이렉트.
- 클라이언트에게 리소스가 수정되지 않았음을 알려줌. 따라서 캐시를 재사용하도록 유도.
- 이 응답에 메시지 본문을 포함하면 안된다.
- 조건부 GET, HEAD 요청 시 사용
- 307 Temporary Redirect(일시)
- 302와 기능 같음
- 리다이렉트 시 요청 메서드와 본문 유지
- 308 Permanet Redirect(영구)
- 리소스의 URI가 영구적으로 이동(301과 동일)
- 리다이렉트 시 요청 메서드와 메시지 본문이 유지
POST /event
요청 시 응답 Location
의 URI로 재요청 시 메서드가 POST로 유지
4. 4xx 상태 코드(client error)
400번대 상태 코드는 클라이언트가 잘못 요청하는 것에서 발생하는 것으로서, 똑같이 재요청해도 동일하게 요청이 실패한다. API 스펙에 맞지 않은 요청 구문, 메시지 등이 잘못되었을 때.
400번대 상태 코드
- 401 Unauthorized
- 클라이언트가 해당 리소스에 대한 인증이 필요함
- 응답에 WWW-Authenticate 헤더와 함께 인증 방법을 설명한다
- 참고) 인증(Authentication): 본인이 누구인지 확인 필요(로그인), 인가(Authorization): 권한 부여(특정 리소스에 접근할 수 있는 권한). 네이밍이 아쉬움
- 403 Forbidden
- 인증 자격 증명은 있지만, 권한이 충분하지 않은 경우
- 404 Not Found
- 요청 리소스가 서버에 없음.
- 클라이언트가 권한이 부족한 리소스에 접근했는데, 해당 리소스를 숨기고 싶을 때
5. 5xx 상태 코드(server error)
500번대 상태 코드는 서버 문제로 발생한 것. 서버에 문제가 있으므로 클라이언트가 재요청하면 성공할 수 있음(서버가 복구되면).
500번대 상태 코드
- 500 Internal Server Error
- 503 Service Unavailable
- 서버가 일시적인 과부하나 예정된 작업으로 인해 잠시 요청을 처리할 수 없음
Retry-After
헤더 필드로 얼마 뒤 복구되는지 보낼 수 있음