[HTTP] 에러상태코드의 선택

JungChihoon·2020년 8월 4일
6

WEB

목록 보기
8/10

HTTP 응답코드에 대한 참조문서를 보며 API 명세서를 작성하는 중 응답(특히 에러응답)에 대한 의문점이 생겼다.
에러응답에 대한 참조문서(MDN, 기타 등등)을 참조하면서 여러 코드가 나타내는의미가 모호할 때가 있음을 느껴 애매한 코드에 대한 의미에 대해 정리해보려고한다.

400: Bad request

400번은 "잘못된 요청"으로 정의되어 있다.
IETF(국제 인터넷 표준화 기구)에 따르면 400코드는

400 (Bad Request) 상태 코드는 수신된 구문이 유효하지 않거나 비논리적이거나 서버가 처리하려는 내용에 대한 일부 제한을 초과하기 때문에 서버가 요청을 처리할 수 없거나 처리할 수 없음을 나타낸다.

위의 내용은 "잘못된 형식의 구문으로 인해 서버에서 요청을 이해할 수 없습니다"라고 해석할 수 있다. 예를 들면 Content-Type: application/json으로 되어있는데 JSON 타입으로 보내지 않은 요청이거나 JSON으로 요청한 데이터이지만 누락한 값 또는 데이터형식에 맞지않은 정보(number가 들어가는 데이터에 string이 들어가 있다던지..)가 있는 경우 유효하지 않으므로 서버에서 400 코드를 응답하게 된다.

401: Unauthorized

401 코드는 클라이언트의 권한이 없어 작업을 진행할 수 없는 경우의 에러코드이다.
예를 들어 cookie에 sessionId의 유효시간이 만료되어 권한을 상실하게되고 더이상 작업을 진행할 수 없는 경우 401 코드를 응답하게 된다.

403: Forbidden

403 코드는 클라이언트가 권한이 없기 때문에 작업을 진행할 수 없는 경우의 에러코드이다.

403 (Forbidden) 상태 코드는 서버가 요청을 이해했지만 승인을 거부함을 나타낸다. 요청이 금지된 이유를 공개하려는 서버는 응답 페이로드(있는 경우)에 그 이유를 설명할 수 있다.

401 코드의 인증, 403코드의 권한... 헷갈린다.
예를 들어 구분을 하면 로그인여부에 따라 클라이언트의 인증여부를 확인 할 수 있다. 그리고 로그인을 했지만 관리자 권한이 없기 때문에 관리자페이지는 관리자 권한이 있는 사람만 접근 할 수 있다. 이를 403 코드에서의 권한이라고 할 수 있다.

404: Not Found

404 코드는 요청한 자원이 존재하지 않는 경우의 에러코드이다.
클라이언트(브라우저)입장에서 보면 자원이 웹페이지의 경로인데 이 경로가 존재하지 않을 경우에 404 코드를 응답한다.

404(Not Found) 상태 코드는 오리진 서버가 대상 자원에 대한 현재 표현을 찾지 못했거나 해당 자원이 존재한다는 것을 공개하지 않으려 함을 나타낸다.

REST API의 경우 크게 2가지 경우에 404코드를 응답한다.

  1. 경로가 존재하지 않는 경우
  2. 자원이 존재하지 않는 경우

여기서 경로는 ex) GET/users/aaa/bbb (존재하지 않는 임의의 경로라는 가정)와 같이 없는 경로를 뜻하며
자원은 ex) PUT/users/1 (존재하는 경로라는 가정) 의 경우 /users/:id 로 존재하는 경로이다. 이때 *ID값을 1로 가지는 자원이 존재하지 않는 경우 404 코드로 응답해야한다.
*참고 : REST API에서는 URI가 자원이기때문에 경로=자원이다.

405: Method Not Allowed

405 코드는 클라이언트의 요청이 허용되지 않은 메소드(GET, POST, PUT, DELETE)인 경우의 에러코드이다.
즉, 자원은 존재하지만 해당 자원이 지원하지 않는 메소드일 때 응답하는 상태코드이다.

405(Method Not Allow) 상태 코드는 요청 라인에 지정된 METHOD가 오리진 서버에 의해 알려져 있지만 대상 자원에 의해 지원되지 않음을 나타낸다

405 코드는 OPTION 메소드와 HTTP header의 Allow와 연관되어있다.
OPTION은 API가 허용하는 메소드가 어떤 것들이 있는지 확인하는 메소드이다.
405오류를 사전에 방지하기 위한 용도에 주로 쓰인다.
이 때 응답 HTTP header의 Allow에 지원하는 메소드를 나영할여 응답한다.

여기서 users/1자원은 POST메소드를 제공하지 않는다는 정보를 확인 할 수 있다.
405 코드는 API 설계에 따라 404 코드와 혼동될 수 있으므로 규칙을 잘 정해야한다.
위의 사진에서 users/1자원에서 지원하지 않는 POST메소드로 요청하는 경우는 405 코드, users/:id 경로에 ID가 1이라는 자원이 없는 경우에는 404 코드를 응답한다.

406: Not Acceptable

406 코드는 요청은 정상이나 서버에서 받아들일 수 없는 요청일 경우의 에러코드이다.
여기서 서버에서 받아들일 수 없는 경우는 다음과 같다.

1. 클라이언트 요청에 대해 적절한 컨텐츠가 없는 경우
2. 웹 방화벽에 걸리는 경우

406(불허용) 상태 코드는 사전 협상에 따라 대상 자원이 사용자 에이전트가 수용할 수 있는 현재 표현을 가지고 있지 않음을 나타낸다.

409: Conflict

409 코드는 클라이언트의 요청이 서버의 상태와 충돌이 발생한 경우의 에러코드이다.

409(Conflict) 상태 코드는 자원 현황과 상충되어 요청을 완료할 수 없음을 나타낸다. 이 코드는 사용자가 충돌을 해결하고 요청을 다시 제출할 수 있는 상황에서 사용된다. 서버는 사용자가 충돌의 원인을 인식할 수 있는 충분한 정보를 포함하는 페이로드(payload)를 생성해야 한다.
PUT 요청에 따라 충돌이 발생할 가능성이 가장 높다. 예를 들어, 버전 지정이 사용 중이고 PUT라는 표현이 이전(제3자) 요청에 의해 만들어진 리소스와 충돌하는 리소스에 대한 변경을 포함한다면 오리진 서버는 409 응답을 사용하여 요청을 완료할 수 없음을 나타낼 수 있다. 이 경우, 응답 표현은 개정 이력에 기초한 차이를 병합하는 데 유용한 정보를 포함할 가능성이 높다

서버의 충돌이 발생한 경우에 대해 예를 들면

  1. "AA"라는 사용자의 식별자(ID)가 이미 서버(또는 DB)에 존재하고 있는데 회원가입시 같은 ID를 POST로 요청하는 경우
  2. 어떤 사이트에 "사용자의 게시물이 존재하는 경우 사용자를 삭제할 수 없다"라는 정책이 있는 경우 게시물이 있는 상황에서 사용자를 삭제하는 요청을 보내는 경우
    에 409 코드를 반환할 수 있다.

충돌이라는 것이 여러가지가 있을 수 있고 다른에러코드에 해당하는 경우가 있을 수 있으므로 다른 에러코드에 해당하지 않고 서버와의 충돌이 일어난 경우 409 코드를 응답하도록 한다.


참조

profile
주니어 개발자

0개의 댓글