백엔드 개발을 하면 HTTP 상태 코드에 대해서 많이 접하게 되는데,
HTTP 상태 코드에 대해서 알고 사용하면 더 나은 코드를 작성할 수 있을 것이라고 생각해서 글을 써보았습니다.
(오타 발견시 댓글 부탁드립니다.)
HTTP Status Code
클라이언트가 보낸 HTTP 요청에 대해서 서버의 응답 코드입니다.
상태 코드에 따라 요청의 성공/실패 여부를 세 자릿수로 구분합니다.
대략 적인 구성으로
1XX: 임시 응답으로 현재 클라이언트의 요청까지는 처리되었으니 계속 진행
2XX: 요청 정상 처리
3XX: 요청을 완료하려면 추가 행동이 필요
4XX: 클라이언트 오류, 잘못된 문법 등으로 서버가 요청을 수행할 수 없음
5XX: 서버 오류, 서버가 정상 요청을 처리하지 못함
로 볼 수 있습니다.
이제 상태 코드들에 대해서 자세하게 알아봅시다.
1XX: Informational (정보 제공)
클라이언트의 요청을 받았으며 작업을 계속 진행하고 있다.
1xx 계열의 응답은 HTTP/1.1 클라이언트에게만 보낼 수 있으며 응답은 바디없이 상태 라인, 헤더(생략 가능), 빈 줄로 종료된다.
상태 코드 | 상태 텍스트 | 한국어 뜻 | 서버 측면에서의 의미 |
100 | Continue | 계속 | 계속 진행 클라이언트는 요청 헤더에 'Expect: 100-continue'를 보내고 서버는 이를 처리할 수 있으면 이 코드로 응답 |
101 | Switching Protocols | 프로토콜 전환 | 프로토콜을 전환 프로토콜을 HTTP 1.1에서 업그레이드할 때 Upgrade 응답 헤더에 표시 (현재는 HTTP 1.1이 최신이므로 사용할 일이 없음) |
102 | Processing | 처리중 | (WebDAV) 처리 중 서버가 처리하는 데 오랜 시간이 예상되어 클라이언트에서 타임 아웃이 발생하지 않도록 이 응답 코드를 보냄 |
103 ~ 199 | Unassigned | 현재 할당되지 않은 상태 코드 |
2XX: Success (성공)
클라이언트가 요청한 동작을 수신하여 이해, 승낙하여 성공적으로 처리했다.
상태 코드 | 상태 텍스트 | 한국어 뜻 | 서버 측면에서의 의미 |
200 | OK | 성공 | 클라이언트가 요청한 동작을 수신하여 성공적으로 처리 |
201 | Created | 생성됨 | 요청이 처리되어 새로운 리소스 생성 응답 헤더 Location에 새로운 리소스의 절대 URI를 기록 |
202 | Accepted | 허용됨 | 요청은 접수하였지만, 처리가 완료되지 않음 응답 헤더의 Location, Retry-After를 참고하여 클라이언트는 다시 요청을 보냄 |
203 | Non-Authoritative Information | 신뢰할 수 없는 정보 | 응답 헤더가 오리지널 서버로부터 제공된 것이 아님 프록시 서버가 응답 헤더에 주석을 덧붙인 경우가 하나의 예 |
204 | No Content | 콘텐츠 없음 | 처리를 성공하였지만, 클라이언트에게 돌려줄 컨텐츠가 없음 응답에는 헤더만 있고 바디는 없음 (DELETE 요청에 대한 응답에 많이 사용) |
205 | Reset Content | 콘텐츠 재설정 | 처리를 성공하였고 브라우저의 화면을 리셋하라 (브라우저가 입력 폼을 보여 주고 있을 때 이 응답 코드를 받으면 브라우저는 모든 입력 항목을 리셋하고 재입력할 수 있는 상태가 됨) |
206 | Partial Content | 일부 콘텐츠 | 콘텐츠의 일부만 보냄 응답 헤더의 Content-Range에 응답 컨텐츠의 범위를 기록 (1500 바이트의 리소스 중에서 처음의 500바이트만을 보낼 때 사용할 수 있음) |
207 | Multi-Status | 다중 상태 | (WebDAV) 처리 결과의 Status가 여러 개 207 응답은 성공을 뜻하지만, 각각의 처리 결과가 성공인지는 바디를 봐야 알 수 있음 |
208 ~ 209 | Unassigned | 현재 할당되지 않은 상태 코드 |
3XX: Redirection (리다이렉션)
클라이언트는 요청을 마치기 위해 추가 동작을 취해야 한다.
상태 코드 | 상태 텍스트 | 한국어 뜻 | 서버 측면에서의 의미 |
300 | Multiple Choices | 여러 선택 항목 | 선택 항목이 여러개 있음 지정한 URI에 대해서 콘텐츠 협상을 수행한 결과 서버에서 콘텐츠를 결정하지 못하고 클라이언트에게 복수 개의 링크를 응답할 때 사용 |
301 | Moved Permenently | 영구 이동 | 지정한 리소스가 새로운 URI로 이동 이동할 곳의 새로운 URI는 응답 헤더 Location에 기록 |
302 | Found | 다른 위치 찾음 | 요청한 리소스를 다른 URI에서 찾음 요청한 URI가 없으므로 클라이언트 메서드를 그대로 유치한 채 응답 헤더 Location에 표시된 다른 URI로 요청을 재송신할 필요가 있음. 302의 의미를 정확하게 개선해서 307을 정의하였으므로 이 응답 코드의 사용은 권장하지 않음 |
303 | See Other | 다른 위치 보기 | 다른 위치로 요청하라 요청에 대한 처리 결과를 응답 헤더 Location에 표시된 URI에서 GET으로 취득할 수 있음. 브라우저 폼 요청을 POST로 처리하고 그 결과 화면으로 리다이렉트 시킬 때 자주 사용하는 응답 코드 |
304 | Not Modified | 수정되지 않음 | 마지막 요청 이후 요청한 페이지는 수정되지 않음 If-Modified-Since와 같은 조건부 GET 요청일 때 지정한 리소스가 갱신되지 않았음을 알려줌. 이 응답 코드에는 바디가 없음 |
305 | Use Proxy | 프록시 사용 | 지정한 리소스에 액세스하려면 프록시를 통해야 함 응답 헤더 Location에 프록시의 URI를 기록 |
306 | (Unused) | 예전 버전에서 사용하다가 현재는 사용하지 않는 상태 코드 | |
307 | Temporary Redirect | 임시 리다이렉션 | 임시로 리다이렉션 요청이 필요 요청한 URI가 없으므로 클라이언트 메소드를 그대로 유지한 채 응답 헤더 Location에 표시된 다른 URI로 요청을 재송실할 필요가 있음. 클라이언트는 향후 요청 시 원래 위치를 계속 사용해야 함. 302의 의미를 정확하게 재정의해서 HTTP/1.1의 307 응답으로 추가 |
308 ~ 399 | Unassigned | 현재 할당되지 않은 상태 코드 |
4XX: Client Error (클라이언트 에러)
클라이언트의 요청에 오류가 있다.
상태 코드 | 상태 텍스트 | 한국어 뜻 | 서버 측면에서의 의미 |
400 | Bad Request | 잘못된 요청 | 요청의 구문이 잘못됨 클라이언트가 모르는 4xx 계열 응답 코드가 반환된 경우에도 클라이언트는 400과 동일하게 처리하도록 규정하고 있음 |
401 | Unauthorized | 권한 없음 | 지정한 리소스에 대한 액세스 권한이 없음 응답 헤더 WWW-Authentication에 필요한 인증 방식을 지정 |
403 | Forbidden | 금지됨 | 지정한 리소스에 대한 액세스가 금지됨 401 인증 처리 이외의 사유로 리소스에 대한 액세스가 금지되었음을 의미. 리소스의 존재 자체를 은폐하고 싶은 경우는 404 응답 코드를 사용할 수 있음 |
404 | Not Found | 찾을 수 없음 | 지정한 리소스를 찾을 수 없음 |
405 | Method Not Allowed | 허용되지 않은 메서드 | 요청한 URI가 지정한 메소드를 지원하지 않음 응답 헤더 Allow에 이 URI가 지원하는 메서드 목록을 기록함 |
406 | Not Acceptable | 수용할 수 없음 | 클라이언트가 Accept-* 헤더에 지정한 항목에 관해 처리할 수 없음 응답 바디에는 300 응답처럼 서버가 수용 가능한 다른 선택지 리스트가 기록됨 |
408 | Request Timeout | 요청 시간 초과 | 요청을 기다리다 서버에서 타임아웃 함 |
409 | Conflict | 충돌 | 서버가 요청을 수행하는 중에 충돌이 발생 (사용자명을 new_name으로 변경하려 하였지만, 서버에 이미 new_name이라는 사용자가 존재하는 경우, 응답 헤더 Location에는 충돌이 발생한 리소스의 URI를 기록) |
412 | Precondition Failed | 사전 조건 실패 | If-Match와 같은 조건부 요청에서 지정한 사전 조건이 서버와 맞지 않음 |
413 | Request Entity Too Large | 요청 객체가 너무 큼 | 요청 메시지가 너무 큼 서버는 접속을 끊음 |
429 | Too Many Requests | 너무 많은 요청 | 클라이언트가 주어진 시간 동안 너무 많은 요청을 보냄 요청의 속도를 제한할 때 사용함. 응답의 Retry-After 헤더를 보내 얼마나 기다릴지를 알려 줄 수 있음 |
5XX: Server Error (서버 에러)
상태 코드 | 상태 텍스트 | 한국어 뜻 | 서버 측면에서의 의미 |
500 | Internal Server Error | 내부 서버 오류 | 서버에 에러가 발생 클라이언트가 모르는 5xx 계열의 응답 코드가 반환된 경우에도 클라이언트는 500과 동일하게 처리하도록 규정 |
501 | Not Implemented | 구현되지 않음 | 요청한 URI의 메소드에 대해 서버가 구현하고 있지 않음 |
502 | Bad Gateway | 불량 게이트 웨이 | 게이트웨이 또는 프록시 역할을 하는 서버가 그 뒷단의 서버로부터 잘못된 응답을 받음 |
503 | Service Unavailable | 서비스 제공 불가 | 현재 서버에서 서비스를 제공할 수 없음 보통은 서버의 과부하나 서비스 점검 등 일시적인 상태 |
504 | Gateway Timeout | 게이트웨이 시간 초과 | 게이트웨이 또는 프록시 역할을 하는 서버가 그 뒷단의 서버로부터 응답을 기다리다 타임아웃이 발생 |
505 | HTTP Version Not Supported | HTTP 버전 미지원 | 클라이언트가 요청에 사용한 HTTP 버전을 서버가 지원하지 않음 |
506 | Unassigned | 현재 할당되지 않은 상태 코드 | |
507 | Insufficient Storage | 용량 부족 | (WebDAV) 서버에 저장 공간 부족으로 처리에 실패 |
512 ~ 599 | Unassigned | 현재 할당되지 않은 상태 코드 |
참고
https://velog.io/@sangyeon217/http-status-code
'Back-End' 카테고리의 다른 글
[Spring] Kafka 연동 간단 예제 (1) | 2024.07.24 |
---|---|
멀티 모듈은 뭘까? (0) | 2024.04.22 |
[Spring Boot] 배포 방법 (JAR vs WAR) (0) | 2024.03.21 |
Gradle 의존성 옵션 종류 (0) | 2024.03.20 |
[Spring] 스프링 프레임워크의 MVC 동작원리 (1) | 2024.03.11 |