반응형
HTTP 상태코드
http 상태코드는 http 프로토콜을 통해 웹 브라우저와 웹 서버 간의 통신 중에 전달된다. 상태코드의 역할은 클라이언트에게 요청한 결과의 응답 상태를 알려주는 데 사용된다.
상태 코드
- 1xx(Informational) : 요청은 수신되었고 처리 중을 나타낸다 (사용될 일이 거의 없는 상태코드)
- 2xx(Successful) : 요청이 성공적으로 처리됨을 나타낸다.
- 3xx(Redirection) : 요청을 완료하려면 추가 동작이 필요함을 나타낸다.
- 4xx(Client Error) : 클라이언트의 요청에 오류가 있음을 나타낸다.
- 5xx(Server Error) : 서버가 요청을 처리하는 도중 서버 측의 오류로 요청을 정삭적으로 처리하지 못함을 나타낸다.
*참고* 클라이언트가 인식할 수 없는 상태코드, (예: 들어 299, 451 등)즉, 처음보는 형태의 코드가 나타나도 첫 번째 자리 숫자만으로 해석해서 처리 할 것.
- 예를들어 299는 2xx이므로, 성공을 나타내고 451은 4xx이므로 클라이언트 오류를 나타내는 것으로 인식하면 된다.
- 첫 번째, 자릿수는 상태코드의 범주를 나타낸다.
- 두 번째, 자릿수는 상세 상태를 나타낸다.
- 세 번째, 자릿수는 세부 사항을 나타낸다.
일반적으로 사용되는 HTTP 상태코드
1xx
잘 사용되지 않음.
2xx (ㅇ)
- 200 OK : 요청이 성공적으로 처리됨
- 201 Created : 사용자 요청에 따라 서버 측에서 무엇인가 생성이 성공했다는 의미
- 202 Accepted : 클라이언트 요청이 서버에 의해 받아들여졌으나, 요청이 아직 처리 중이거나 처리가 완료되지 않았음을 나타낸다.
- 보통 배치 처리 같은 곳에서 사용된다.
- 예를 들어, 요청 접수 후 1시간 뒤에 배치 프로세스가 요청을 처리함.
- 204 No Content: 요청은 성공적으로 처리되었으나 응답 페이로드 본문에 보낼 데이터가 없음
- 예를들어 웹 문서 편집기에서 save 버튼
- save 버튼의 결과로 아무 내용이 없어도 되며, 같은 화면을 유지해야 한다.
3xx - 리다이렉션
- 리다이렉션 이해: 웹 브라우저는 3xx 응답 결과에 Location 헤더가 있으면, Location 위치로 자동 이동(리다이렉트)
종류
- 영구 리다이렉션 : 상태코드 301 또는 308을 사용하여 클러이언트의 요청을 새로운 URL로 영구적으로 리다이렉트 하는 동작을 가리킴
- 예) /members -> / users
- 특정 리소스의 URI가 영구적으로 이동 (아예 경로 자체가 변경됐을 때 사용)
- 301 (Moved Permanently): 클라이언트에게 리소스의 URL이 영구적으로 변경 되었음을 알림. 브라우저와 검색 엔진에게 이전 URL을 다시 방문하지 않도록 알려주는 역할도함.
- 308과는 다르게 본문이 제거될 수도 있으며, 요청 메서드가 GET으로 변한다.
- 308 (Permanent Redirect) : 301과 유사하지만, 클라이언트가 원래 HTTP 메서드와 본문을 유지한 채 리다이렉션을 따라가야 함을 나타낸다.
- 즉, 본문을 유지한채로 리다이렉트
- 일시 리다이렉션 : 일시적인 변경
- 리소스의 URI가 일시적으로 변경
- 즉, 클라이언트에게 요청한 리소스가 일시적으로 다른 위치에 있음을 알리는 방법
- 예1) 주문 완료 후 주문 내역 화면으로 이동
- 예2) 사용자가 로그인 후 원래 페이지나 홈페이지로 리다이렉션 되는 경우
- 예3) 특정 조건을 충족 시에 리다이렉션을 수행 (예: 국가나 언어에 따른 리다이렉션)
-
사용하는 HTTP 상태 코드: 302, 307, 303
- 302 Found: 원래의 요청 방법(POST, PUT 등)이 GET으로 변경되고 본문이 제거될 수 있다.
- 307 Temporary Redirect: 원래의 요청 방법이 유지되고, 본문 또한 유지된다.
- 303 See Other: 302와 기능은 같고, 요청 메서드가 GET으로 변경
- 작동 흐름
-
- 클라이언트 요청: 클라이언트가 특정 URL로 요청.
- 서버 응답: 서버는 일시적인 리다이렉션 상태 코드(302, 307, 303)와 함께 새 'Location'헤더를 응답
- 클라이언트 리다이렉트 : 클라이언트는 응답 메세지 헤더에 포함된 'Location'으로 다시 요청을 보냄
-
- 리소스의 URI가 일시적으로 변경
- PRG 패턴
- HTTP POST 요청 후 일시적인 리다이렉션을 통해 GET 요청으로 변경하는 방법을 의미
- POST로 주문후에 새로 고침으로 인한 중복 주문을 방지한다.
- 새로고침해도 결과 화면을 GET으로 조회
- 중복 주문 대신에 결과 화면만 GET으로 다시 요청
- 흐름 정리
-
- 클라이언트가 서버에 POST 요청
- 서버에서 POST 데이터를 처리 후, 클라이언트에게 새 위치 302 상태코드와 함께 리다이렉트
- 클라이언트는 리다이렉트된 위치로 GET 요청을 보냄
- 서버는 GET 요청에 대한 응답을 반환
-
// Java Spring에서 PRG 패턴
@PostMapping("/sub1")
public String method1(RedirectAttributes rttr){
// form 데이터 처리
// 리다이렉션 후에 보여줄 메시지 설정
rttr.addFlashAttribute("message", "주문이 성공했습니다.");
// 리다이렉션
return "redirect:/sub2";
}
일시 리다이렉트 정리
- 302 Found -> GET으로 변할 수 있고, 본문이 제거될 수 있음
- 307 Temporary Redirect -> 메서드가 변하면 안됨.
- 303 See Other -> 메서드가 GET으로 변경
기타 리다이렉션
- 300 Multiple Choices : 잘 사용되지 않음
- 304 Not Modified
- 캐시를 목적으로 사용
- 클라이언트에게 리소스가 수정되지 않았음을 알려줌.
- 따라서 클라이언트는 로컬PC에 저장된 캐시를 재사용한다. (캐시로 리다이렉트)
- 304응답은 응답에 메세지 바디를 포함하면 안됨. 로컬 캐시를 사용해야 하기 때문에.
4xx - 클라이언트 오류
- 4xx는 클라이언트 측에서 발생한 오류를 나타냄
- 클라이언트의 요청에 잘못된 문법등으로 서버가 요청을 수행할 수 없음을 말함.
- 종류
- 400 Bad Request: 요청 구문, 메시지 등등 오류, 클라이언트는 요청 내용을 재검토 후 다시 요청해야함.
- 401 Unauthorized: 클라이언트가 인증되지 않았거나 인증에 실패한 경우에 사용
- 즉, 이 상태 코드는 인증이 필요한 페이지나 리소스에 접근하려고 할 때 주로 발생
- 403 Forbidden: 클라이언트가 리소스에 접근할 권한이 없는 경우에 발생. 401과 다르게, 클라이언트의 신원 확인이 필요없거나, 확인됐으나 권한이 없는 경우에 사용된다.
- 404 Not Found: 요청 리소스가 서버에 없는 경우에 발생.
- 잘못된 URL 입력 또는 삭제 페이지에 접근 시 발생 (또는 권한 부족이나 리소스가 숨겨져 있는 경우도 있음)
5xx - 서버 오류
- 서버 측에서 발생한 오류를 나타내는 상태 코드.
- 서버의 일시적인 문제로 재시도하면 성공할 수 있음(복구 등등)
- 종류
- 500 Internal Server Error: 서버에서 알 수 없는 이유로 요청을 처리하지 못한 경우, 이는 일반적으로 서버 코드의 버그나 설정 문제 등에 의해 발생
- 5xx 상태코드가 애매할 경우, 500 오류를 사용
- 503 Service Unavailable: 서버가 일시적으로 요청을 처리할 수 없는 상태에 발생
- 일반적으로 서버가 과부하 상태 또는 유지 보수 중일 때 사용
- Retry-After 헤더 필드로 얼마뒤에 복구되는지 보낼 수도 있다.
- 500 Internal Server Error: 서버에서 알 수 없는 이유로 요청을 처리하지 못한 경우, 이는 일반적으로 서버 코드의 버그나 설정 문제 등에 의해 발생
반응형
'HTTP' 카테고리의 다른 글
http method (0) | 2023.11.10 |
---|---|
인터넷 네트워크 통신, TCP/IP패킷 (0) | 2023.10.27 |
웹 브라우저 요청 흐름 (간략) (0) | 2023.10.27 |
URI(Uniform Resource Identifier)란? (0) | 2023.10.26 |
HTTP (Hyper Text Transfer Protocol), HTTP 메시지 (1) | 2023.10.26 |