상태 코드
클라이언트가 보낸 요청의 처리 상태를 응답에서 알려주는 기능
- 1xx (Informational) : 요청이 수신되어 처리 중 (거의 사용하지 않는다.)
- 2xx (Successful) : 요청 정상 처리
- 3xx (Redirection) : 요청을 완료하려면 추가 행동 필요
- 4xx (Client Error) : 클라이언트 오류, 잘못된 문법등으로 서버가 요청을 수행할 수 없음
- 5xx (Server Error) : 서버 오류, 서버가 정상 요청을 처리하지 못함
만약 모르는 상태 코드가 나타나면?
- 클라이언트가 인식할 수 없는 상태코드를 서버가 반환하면 어떻게 이해해야 할까?
- 클라이언트는 상위 상태코드로 해석하면 된다.
- 미래에 새로운 상태 코드가 추가되어도 클라이언트는 변경 작업을 수행할 필요가 없다
예)
- 299??? -> 2xx (Successful)로 해석
- 451??? -> 4xx (Client Error)로 해석
- 599??? -> 5xx (Server Error)로 해석
2xx - 성공
클라이언트의 요청을 성공적으로 처리했다는 의미이다.
- 200 Ok
- 201 Created
- 202 Accepted
- 204 No Content
200 OK
요청 성공을 의미한다.
201 Created
클라이언트의 등록 요청으로 새로운 리소스가 성공적으로 생성됨을 의미한다.
202 Accepted
요청이 접수되었으나 처리가 완료되지 않았음을 의미한다.
- 배치 처리 같은 곳에서 사용
- 예) 요청 접수 후 1시간 뒤에 배치 프로세스가 요청 처리
204 No Content
서버가 요청을 성공적으로 수행했지만, 응답 본문에 보낼 데이터가 없음을 의미한다.
- 예) 웹 문서 편집기에서 저장 버튼
- 저장 버튼의 결과로 아무 내용이 없어도 된다.
- 저장 버튼을 눌러도 같은 화면을 유지해야 한다.
- 결과 내용이 없어도 204만으로 성공을 인식할 수 있다.
2xx 마무리
2xx 상태 코드는 거의 200만 사용하는 경우가 많다.
팀에서 내부적으로 범위를 잡고 사용하는 것이 좋다
3xx - 리다이렉션
요청을 완료하기 위해 클라이언트의 추가 작업이 필요하다는 것을 의미한다.
- 301 Moved Permanently
- 302 Found
- 303 See Other
- 304 Not Modified
- 307 Temporary Redirect
- 308 Permanent Redirect
리다이렉션이란?
웹 브라우저는 3xx 응답의 결과에 Location 헤더가 있으면, Location 위치로 자동으로 이동한다.
- 클라이언트가 event 경로로 접속을 요청했지만 해당 URI는 더 이상 사용하지 않는 URI이다.
- 서버에서 새로운 URI를 Location 헤더에 담아 클라이언트에게 전달한다.
- 브라우저는 3xx 상태 코드를 인식하고 Location의 헤더에 담긴 URI로 리다이렉션 한다.
리다이렉션 종류
- 영구 리다이렉션 - 특정 리소스의 URI가 영구적으로 이동
- /members URI가 -> /users로 영구적으로 변경
- 일시 리다이렉션 - 일시적인 변경
- 주문 완료 후 주문 내역 화면으로 이동 (PRG 패턴)
- PRG : Post -> Redirect -> Get 순서로 자주 사용하는 패턴이다.
- 특수 리다이렉션 - 결과 대신 캐시를 사용
영구 리다이렉션 - 301, 308
- 리소스의 URI가 영구적으로 이동했음을 의미한다.
- 원래의 URL 사용하지 않는다.
- 검색 엔진 등에서도 변경을 인지한다.
301 Moved Permanently
- 리다이렉트시 요청 메서드가 GET으로 변하고, 본문이 제거될 수 있다.
- 클라이언트가 더 이상 사용되지 않은 URI로 요청을 보냄
- 서버에서는 301 코드와 새로운 URI 응답
- 브라우저가 301 코드를 인지하고 리다이렉션 (이 과정에서 기존 Post 요청이 사라짐)
간단히 말하면 이렇다.
내가 블로그 글을 열심히 작성한 후 게시 버튼을 눌렀는데 URI가 변경되어 301 코드를 받게 되었다.
새로운 URI로 이동하며 그동안 작성한 글이 날아간 것이다.
308 Permanent Redirect
- 301과 기능은 같다.
- 리다이렉트시 요청 메서드와 본문을 유지한다. (301과의 차이점)
- 클라이언트가 더 이상 사용되지 않은 URI로 요청을 보냄
- 서버에서는 308 코드와 새로운 URI 응답
- 브라우저가 308 코드를 인지하고 리다이렉션과 동시에 기존 요청을 서버에 전송한다. (301과의 차이)
하지만 보통 경로가 변경되면 내부구조도 변경되기에 잘 사용하지 않는다.
일시적인 리다이렉션 - 302, 303, 307
- 리소스의 URI가 일시적으로 변경된 것을 의미한다.
- 따라서 검색 엔진 등에서 URL를 변경하면 안 된다.
- 301, 308보다 이걸 더 자주 사용한다.
302 Found
- 리다이렉트시 요청 메서드가 GET으로 변할 수 있으며, 본문이 제거될 수 있다.
- 301과 유사하지만 영구적인 것이 아닌 일시적으로 다른 URI로 리다이렉션 된다.
307 Temporary Redirect
- 302와 기능은 같다.
- 리다이렉트시 요청 메서드와 본문을 유지한다.
- 308과 유사하지만 308은 API 경로 변경, URI 영구 이동 등에 사용되고 307은 로그인을 위해 로그인 페이지로 이동한 후 다시 원래 페이지로 이동하는 경우에 사용한다.
303 See Other
- 302와 기능은 같다.
- 리다이렉트시 요청 메서드가 GET으로 변경된다.
- 302와 유사하지만 302는 임시 위치로 이동하는 것이라면 303은 다른 위치에서 결과를 확인하는 목적으로 사용한다.
- 302는 메서드를 변경할 수도 안 할 수도 있기 때문에 303을 사용하는 것을 권장한다.
PRG : Post/Redirect/Get
POST로 주문 후에 웹 브라우저를 새로고침한다면?
새로고침은 재요청을 의미하고 이는 중복 주문이 될 수 있다.
PRG 사용 전
주문 요청이 처리된 후 새로고침을 하면 해당 요청이 다시 보내지게 된다.
사용자는 1개의 마우스만 구매하려 했지만 2개의 마우스가 주문되는 것이다.
그렇다면 어떻게 해결해야 할까?
POST로 주문 후에 새로 고침으로 인한 중복 주문을 방지해야 한다.
POST로 주문 후 주문 결과 화면을 GET 메서드로 리다이렉트 한다. (마지막 요청을 GET으로 변경)
새로고침을 해도 최종 요청인 GET 메서드만 실행된다.
이처럼 PRG 패턴을 적용하면 주문 후 리다이렉션으로 인해 메서드가 GET으로 바뀌었기 때문에 새로고침을 해도 GET 메서드만 실행되는 것이다.
그래서 무엇을 써야 할까?
역사
- 처음 302 스펙의 의도는 HTTP 메서드를 유지하는 것이었다.
- 하지만 웹 브라우저들이 대부분 GET으로 바꾸거나 일부 다르게 동작했다.
- 이를 해결하기 위해 모호한 302를 대신하는 명확한 307, 303이 등장하게 되었다.( 301 대응으로 308도 등장)
현실
- 308,303을 권장하지만 현실적으로 이미 많은 애플리케이션 라이브러리들이 302를 기본값으로 사용하고 있다.
- 자동 리다이렉션시에 GET으로 변해도 문제가 없다면 302를 그냥 사용해도 큰 문제가 없다.
기타 리다이렉션 - 303, 304
303 - multiple choices : 안 쓴다
304 Not Modified
- 캐시를 목적으로 사용한다.
- 조건부 GET, HEAD 요청 시 사용한다.
- 클라이언트에게 리소스가 수정되지 않았음을 알려준다. 따라서 클라이언트는 로컬에 저장된 캐시를 재사용한다. (캐시로 리다이렉트)
- 로컬 캐시를 사용해야 하므로 304 응답은 메시지 바디를 포함하면 안 된다.
4xx - Client Error
- 클라이언트의 요청에 잘못된 문법 등으로 서버가 요청을 수행할 수 없음을 의미한다.
- 오류의 원인은 클라이언트에게 있다.
- 중요! 클라이언트가 이미 잘못된 요청, 데이터를 보내고 있기에 재시도하여도 실패하게 된다.
400 Bad Request
클라이언트의 잘못된 요청으로 서버가 요청을 처리할 수 없음을 의미한다.
- 요청 구문, 메시지 등의 오류이다.
- 클라이언트는 요청 내용을 다시 검토하고 보내야 한다.
- 예) 요청 파라미터가 잘못되었거나 API 스펙이 맞지 않을 때
401 Unauthorized
클라이언트가 해당 리소스에 대한 인증이 필요함을 의미한다.
- 인증되지 않았음을 의미한다.
- 401 오류 발생 시 응답에 WWW-Authenticate 헤더와 함께 인증 방법을 설명해 준다.
403 Forbidden
서버가 요청을 이해했지만 승인을 거부했을 때를 의미한다.
- 주로 인증 자격은 있지만, 접근 권한이 불충분할 경우 발생한다.
- 예) 관리자 등급이 아닌 사용자가 로그인하여 관리자 리소스에 접근하는 경우
404 Not Found
요청 리소스를 찾을 수 없음을 의미한다.
- 요청 리소스가 서버에 없음을 의미한다.
- 또는 클라이언트가 권한이 부족한 리소스에 접근할 때 해당 리소스를 숨기는 경우 발생한다.
5xx - Server Error
- 서버 문제로 오류가 발생했음을 의미한다.
- 서버에 문제가 있기 때문에 4xx와 달리 재시도하면 성공할 수도 있음
서버에서는 5xx 상태 코드를 웬만하면 만들면 안 된다.
500 Internal Server Error
서버 문제로 오류 발생 발생을 의미한다.
503 Service Unavailable
서비스 이용 불가를 의미한다.
- 서버가 일시적인 과부하 또는 예정된 작업(서버 점검)으로 잠시 요청을 처리할 수 없음을 의미한다.
- Retry-After 헤더 필드로 얼마 뒤에 복구되는지 보낼 수 있다.
'CS' 카테고리의 다른 글
HTTP 헤더, 캐시와 조건부 요청 (0) | 2025.04.07 |
---|---|
HTTP 헤더, 쿠키에 대해서 (0) | 2025.04.07 |
HTTP 메서드 활용 (0) | 2025.04.03 |
[ 프로그래머스,bfs ] 네트워크.python (0) | 2025.04.03 |
HTTP 메서드에 대해 (0) | 2025.04.03 |