들어가며
- 이전 포스트에서 HTTP 응답 메시지에 붙는 상태 코드에 대해 300번대 코드까지 알아보았다.
- 이번 포스트에서는 나머지 400, 500번 상태 코드에 대해서 알아본다.
4XX번 상태 코드
- 400번과 500번대 상태 코드는 요청을 제대로 처리하지 못했을 때 전송되는 상태 코드이다.
- 400번대 코드는 다음의 상황에서 사용된다.
- 서버가 요청을 처리하지 못하였고, 그 원인이 서버가 아닌 클라이언트에게 있을 때, 즉 요청에 문제가 있을 때
- 잘못된 요청이 서버로 전달되어 요청 처리에 실패하기 때문에 동일한 요청으로 반복해도 처리가 계속 실패한다.
400 - Bad Request
- 400번 코드는 클라이언트가 잘못된 요청을 보내서 서버가 해당 요청을 처리할 수 없을 때 반환된다.
- 이때 잘못된 요청은 요청 구문 또는 메시지에 오류가 존재하는 요청을 의미한다.
- 예시로는 쿼리 스트링에서 요청 파라미터가 잘못되었거나 API로 통신할 때 잘못된 API 스펙(양식)으로 요청을 전송할 때 이 요청들을 잘못된 요청(Bad Request)라고 한다.
401 - Unauthorized
- 401번은 클라이언트가 해당 리소스에 접근하기 위해 추가적인 인증이 필요할 때 반환된다.
- 말 그대로 클라이언트가 인증되지 않았다는 것이다.
- 이를 위해 401오류가 발생할 시 WWW-Authenticate 헤더에 어떻게 인증을 수행해야 하는지에 대한 방법을 설명한다.
- 이때 401코드의 설명 메시지는 Unauthorized로 되어 있는데 이는 인가를 의미하며 인증과는 의미를 달리한다.
- 인증(Authentication)은 클라이언트 자신이 누구인가를 확인하는 절차이다. 예시로는 로그인이 있다.
- 인가(Authorization)은 해당 클라이언트에게 어떠한 권한을 부여하는 것이다. 즉 A라는 클라이언트에게 ADMIN이라는 권한을 부여하는 것을 인가한다라고 한다.
- 인가의 내용을 보면 클라이언트를 지정하고, 그 이후에 부여할 권한에 대해 설명한다. 즉 클라이언트를 지정하는데 필요한 인증(Authentication)이 먼저 수행되어야 하고, 그 이후 인증된 사용자에 한하여 권한을 인가(Authorization)하는 과정이 수행된다.
403 - Forbidden
- 403번은 서버가 들어온 요청을 이해했으나 승인을 거부하는 상태에서 반환된다.
- 바로 위의 401과 조금 비슷한 상황인데 401은 인증조차 되지 않았으나 403은 인증은 되었으나 해당 리소스에 접근할 권한을 인가받지 못했을 때 반환된다.
- 예시로 클라이언트 A가 C라는 리소스에 접근하려고 하나 C가 ADMIN 등급이 되어야 접근할 수 있는 리소스일 경우 403코드가 반환된다.
404 - Not Found
- 404번은 꽤 친숙한 상태 코드이다. 말 그대로 요청한 리소스가 서버에서 찾을 수 없는 경우(Not Found)에 반환된다.
- 이는 요청 리소스가 서버에 존재하지 않거나, 권한이 부족한 리소스에 접근하려고 하나 서버에서 이를 숨기려고 할 때 사용된다.
- 이는 403을 보면 알 수 있는데 403 에러는 해당 리소스가 존재한다고 서버단에서 인증은 해준다. 단지 클라이언트가 해당 리소스에 접근할 권한이 부족하단 사실을 상태 코드로 표현하는 것이다.
- 404는 해당 리소스를 찾지 못하였기 때문에, 해당 리소스가 존재하지 않는다고 서버에서 숨기면서 클라이언트에게 소위 거짓된 응답을 줄 수 있는 것이다.
5XX번 상태 코드
- 5XX번 코드들은 모두 요청을 처리하지 못했을 때 반환되는 코드이나 이번에는 서버에서 문제가 발생하였을 때 반환된다.
- 서버에 문제가 발생하여 요청을 처리하고 있지 못하는 상태이기 때문에 추후, 문제가 해결되면 동일한 요청이 처리가 될 수도 있다. 물론 요청이 잘못되어있지 않을 때이다.
500 - Internal Server Error
- 해당 코드는 서버에 장애가 생겨 오류가 발생하는 경우에 발송된다.
- 추후에 소개하는 다른 500번대 코드와 연관되어 있지 않고 애매한 경우에 대부분 500번을 반환한다.
503 - Service Unavailable
- 서버가 일시적으로 과부하되었거나, 예정된 작업(배치 프로세스 등)이 존재하여 요청을 현재 처리할 수 없는 경우에 반환되는 코드이다.
- Retry-After 헤더를 통하여 클라이언트에게 서버가 얼마 뒤에 복구되는지에 대한 정보를 넣어 보내줄 수 있다.
- 서버 장애의 경우에 어느 정도의 시간이 소요될 지 일반적으로는 알 수 없기 때문에 내부에서 문제가 발생한 경우에 503 코드를 반환하는 경우는 드물다.
500번대 코드 사용의 신중함
- 500번대 코드(500, 503등)은 말 그대로 서버에 중대한 장애로 인하여 서버가 요청을 받았으나 처리하지 못할 때에 한하여 반환해야 한다.
- 이는 잘못된 요청이 들어와 서버가 해당 요청을 처리할 수 없을 때 서버에서 500 에러를 전송하면 안된다는 것이다.
- 예를 들어 다음과 같은 API를 설계했다고 생각해보자
- 2020 - 2022년 강우량 데이터 반환 API로 2020년 이전의 데이터는 존재하지 않아 반환할 수 없음.
- 이 경우에 2019년 데이터를 GET하기 위해 요청이 들어왔다고 가정해보자. 요청 자체에는 문제가 존재하지 않는것을 유의하자. 요청에 들어 있는 2019년에 포함된 데이터가 존재하지 않는 것이기 때문에 요청 자체는 서버에 잘 들어간다.
- 이것은 서버가 요청을 처리할 수 없지만, 서버 내부에 장애가 있어 요청을 처리할 수 없는 것과는 구분된다. 즉 잘못된 값으로 인하여 요청을 처리할 수 없는 것이다. 따라서 이러한 경우에 500번대 에러를 전송하면 안된다.
- 이는 Spring MVC 또는 여러 프레임워크에서 수행하는 Validation을 사용하여 미리 걸러내는 과정을 통해 방지할 수 있다.
- 예를 들어 다음과 같은 API를 설계했다고 생각해보자
'CS > HTTP' 카테고리의 다른 글
HTTP - HTTP 헤더 정보 - 2. 일반 헤더 - 전송 방식과 여러 가지 정보 (0) | 2023.05.23 |
---|---|
HTTP - HTTP 헤더 정보 - 1. 일반 헤더와 표현(Representation) (0) | 2023.05.22 |
HTTP - HTTP 응답 상태코드 1 (0) | 2023.05.19 |
HTTP - HTTP 메서드 활용 (0) | 2023.05.18 |
HTTP - HTTP 메서드 (0) | 2023.05.17 |