HTTP 상태 코드
1xx
주로 클라이언트와 서버 간의 초기 단계 통신에 사용되며, ‘클라이언트가 요청을 계속 진행하게 하기 위한 임시 응답’ 이라는 의미를 갖는다.
2xx
‘클라이언트의 요청이 성공적으로 처리되었음’ 이라는 의미.
-
200(OK): 수행 결과에 대한 리소스가 응답 메시지 바디에 포함됨 -
201(Created): 요청에 따라 새로운 리소스가 생성됨. (POST 의 응답.)
3xx
‘클라이언트의 요청에 대한 응답을 찾아서 성공적으로 응답하기는 하지만, 사실 클라이언트가 요청한 그 리소스는 요청을 받은 그 URI가 갖고 있는 것과 정확히 일치하지는 않으며, 이를 찾으려면 서버는 추가 동작을 수행해야 함(=리다이렉트 해야 함)’ 이라는 의미.
-
300(Multiple Choices): 요청에 대한 응답이 여럿일 수 있다는 의미. (그 중 하나일 뿐이라는 뜻도 되고, 서버는 여럿을 함께 보낼 수도 있다.) -
301(Moved Permanently): 요청한 리소스가 영구적으로 다른 URI로 이동했음을 의미. 이를 응답 받은 브라우저는 새로운 URI로 자동으로 이동. 근데 이때 POST 요청이 GET으로 변환될 수 있다. (보안 이슈나 사용자경험 등 이슈 때문.)-
다음과 같은 상황에서 표준 동작으로 쓰인다.
- 도메인 주소가 변경되었고, 예전 도메인 주소로 접속
- URL 구조가 변경되었고, 예전 URL 형식으로 접속
- HTTPS 접속이 지원되게 됐고, HTTP로 접속
- 여러 서브도메인(
www등)이 지원되었다가, 하나로 리다이렉트하도록 변경됨
-
검색엔진이 크롤링 목적으로 요청했을 때 요청받은 주소가 변경되었을 때에도 표준 응답 코드로 널리 쓰이며, 검색엔진은
301을 응답 받으면 그에 따라 자신이 갖고 있던 그 리소스에 관한 page rank 등 정보를 최신 URL로 이전한다.
-
-
302(Found): 요청한 리소스가 일시적으로 다른 URI로 이동했음을 의미. 이를 응답 받은 브라우저는 새로운 URI로 자동으로 이동. 근데 이때 POST 요청이 GET으로 변환될 수 있다. 메소드 변경이 일어나기 때문에 최근에는307로 대체되는 경향이 있다. -
307(Temporary Redirect): 요청한 리소스가 일시적으로 이동했음을 알리되 클라이언트가 메소드 변경 없도록 하는 응답. -
308(Permanent Redirect): 요청한 리소스가 영구적으로 다른 URI로 이동했음을 의미. 이를 응답 받은 브라우저는 새로운 URI로 자동으로 이동. 근데 301과 달리 이때 HTTP 메소드가 변경되지 않는다. 301도 여전히 많이 쓰이지만, 보다 다양한 웹앱에서 308을 사용.
4xx
‘클라이언트의 요청이 부적절해 성공적으로 처리할 수 없음(=클라이언트측 문제)’ 이라는 의미.
-
400(Bad Request): 요청 메시지를 서버가 이해할 수 없음 -
401(Unauthorized): 클라이언트가 서버에 대해 인증을 거치지 않았음. (클라이언트가 서버에 의해 식별되지 않았음. 그래서 사실 Unauthenticated가 맞음.)-
서버에 인증 정보를 전송했는데 틀렸을 때, 인증 토큰이 만료됐거나 틀렸거나 누락됐는데 인증 필요한 리소스를 요청할 때 등 상황에서
401이 리턴된다. -
고도로 보안이 필요해서 요청 URI 에 대한 리소스의 존재 자체를 은폐하기 위해
404를 리턴하는 경우도 있으나, 일반적인 시나리오에서는401를 리턴한다.
-
-
403(Forbidden): 클라이언트의 요청이 권한 없는 요청임.-
예를 들어 클라이언트가 유효한 인증토큰을 전송했으나 권한 없는 리소스에 요청을 한 경우에
403이 리턴된다. -
인증 절차와 무관하게 권한 없는 요청에 대해 표준 응답으로 널리 쓰인다. 예를 들어 NGINX에 룰 기반으로 특정 클라이언트 IP 영역이 차단됐는데 그 영역에서 요청이 들어오는 상황에서도
403을 리턴한다.
-
-
404(Not Found): 클라이언트가 서버에 없는 리소스에 대해 요청하고 있음. -
408(Request Timeout): 클라이언트가 요청을 시작한지 오래됐으나 서버가 정한 타임아웃 내에 요청이 완성되지 않았을 때. -
429(Too Many Requests): 클라이언트의 요청이 짧은 시간 동안 너무 많이 반복적으로 들어왔을 때 보내는 응답.
5xx
‘클라이언트의 요청을 처리하는 중 서버 내부 이슈가 생겨 적절한 응답 메시지를 만들 수 없음(=서버측 문제)’ 이라는 의미.
-
500(Internal Server Error): 서버가 클라이언트 요청을 처리하는 과정에서 오류가 발생하여 처리를 완료할 수 없음- 예를 들어, 서버 내 코드에서 예상치 못한 지점에서 exception 이 일어난다면, 서버는 다른 특별한 경우가 아니라면 보통
500을 리턴한다.
- 예를 들어, 서버 내 코드에서 예상치 못한 지점에서 exception 이 일어난다면, 서버는 다른 특별한 경우가 아니라면 보통
-
501(Not Implemented): 클라이언트가 적절한 요청을 했으나 아직 그에 대한 서버 내부 구현이 없음 -
502(Bad Gateway): 이 요청을 받은 서버가 리버스 프록시 서버(or 게이트웨이)인데. 내부 서버에 요청을 내부 룰에 따라 적절히 포워딩했으나 그에 대한 응답이 내부 서버로부터 적절히 내려오지 않았음. -
503(Service Unavailable): 서버가 요청을 받았으나, 현재는 그에 대한 응답을 내려줄 수 없는 상태임. (과부하 상태거나, 유지보수 등 이슈가 있어503만 내려줄 수 있는 상태로 돼있다거나 등등.)- 서버에서 요청에 응답할 리소스를 찾는 데 시간이 너무 오래 걸리는 경우에
503이 리턴될 수 있다.
- 서버에서 요청에 응답할 리소스를 찾는 데 시간이 너무 오래 걸리는 경우에
-
504(Gateway Timeout): 이 요청을 받은 서버가 리버스 프록시 서버(or 게이트웨이)인데. 내부 서버에 요청을 내부 룰에 따라 적절히 포워딩했으나 그에 대한 응답이 시간초과로 내려오지 않음.