"해당 지역에서 사용할 수없는 서비스"오류에 대한 http 상태 코드는 무엇입니까?


51

우리의 서비스는 현재 5 개 도시에 있습니다. 다른 도시에서 서비스 API를 호출하려고하면이 오류가 발생 Service not available in your area합니다.

문제는이 오류에 적합한 http 코드는 무엇입니까?

  • 503 : 서비스를 사용할 수 없음
  • 403 금지

또는 다른 것?


52
"누군가가 다른 도시에서 우리의 서비스 API를 호출하려고하면"IP 위치 정보는 종종 잘못된 것입니다. IP가 다른 도시에 위치하는 사용자를 금지하면 합법적 인 사용자를 차단할 가능성이 높습니다.
피터 그린

43
다른 도시에있는 사람이 나를 방문하기 위해 공항에 와야하는 아이를 태울 수는 없습니까?
Dawood ibn Kareem

29
이 질문에 대한 답은 아니지만 HTTP 451 (RFC 7725)은이 질문을 찾는 독자에게 유용 할 수 있습니다. 주요 목적은 법적 요청, 조치 또는 제한 (저작권, 법원 명령 등)으로 인해 콘텐츠를 사용할 수 없음을 나타내는 것입니다.
Tyzoid

34
네트워크 연결, 인증, 응용 프로그램 내부에 오류가없고 구문 상 유효한 입력에 문제가없는 경우 오류 메시지가 없어야합니다. "우리는이 영역에서 서비스를 제공하지 않습니다"를 사용하면 기술 문제가 발생하고 비즈니스 문제가 발생했기 때문에 HTTP 오류가 적절한 지 확신 할 수 없습니다. "귀하의 지역에서는 서비스를 이용할 수 없습니다.하지만 아직 확장 중입니다. 2019 년 후반에 다시 확인하십시오!" 또는 마케팅 부서가 제안하는 모든 것.
Ivanivan

7
클라이언트 컴퓨터의 위치 (geo IP?)를 기반으로 API에 대한 모든 액세스를 차단해야하는지 또는 특정 실패한 API 요청에 대한 응답 코드를 요청하는지 여부 (예 : book? address = 123_example_st_london)는 확실하지 않습니다. . 위치가 입력의 일부입니까, 아니면 클라이언트의 위치가 다른 방법입니까?
Ben

답변:


102

모든 HTTP 오류 코드는 부적절합니다. HTTP 관점에서 어떤 종류의 오류나 문제가 없으므로 200 범위에 있어야합니다. 귀하는 일부 사용자에게이를 알리는 문서를 반송하여 서비스를받지 않을 것이라고 정중하게 알립니다. 그리고이 모든 것이 잘 진행됩니다.

사용자는 응용 프로그램 을 사용할 수 없습니다 . 그것은 사고가 아닌 비즈니스 로직에 의해 결정된 의식적인 결정입니다. HTTP 레벨에서는 모든 것이 불쾌합니다.

편집하다

우리가 여기서보고있는 것은 구식 학교와 새로운 학교의 충돌입니다. HTTP를 디자인 할 때 웹 서비스, SOAP, JSON 및 REST 원칙이 없었습니다. TCP 이상의 프로토콜로 이미 애플리케이션 수준에 근접한 것으로 간주되었으며 많은 고급 상태 코드가 정의되었습니다. 웹을보다 풍부하고 높은 수준의 서비스에 사용하기 시작하고 "봉투"를 전송하는 일반적인 수단이 필요했을 때, 디자이너는 HTTP가 어디에나 있기 때문에 새롭고 더 깨끗한 프로토콜을 정의하는 대신 HTTP를 하이재킹했습니다.

따라서 현대 웹 서비스 컨텍스트에서 HTTP는 실제로 단순한 전송 계층에 지나지 않으며 대부분의 코드는 적용되지 않거나 사용되지 않는 것으로 간주 될 수 있습니다. 응용 프로그램 상태에 가깝고 목록에 있기 때문에 한 번 해치지 않을 수도 있지만 잘못된 메시지를 보낼 것이라고 생각합니다. 웹 서비스 컨텍스트에서 HTTP가 해당 조절 역할을 수행하는 것을 원하지 않습니다.


56
이 논리에 따라 모든 응용 프로그램 오류는 200으로 반환되어야합니다. 모든 요청은 POST 여야하며 삭제도 가능해야합니다. 이 방법은 HTTP를 TCP와 같은 불투명 한 전송 프로토콜로 취급합니다. 이것은 웹 서비스 API가 일반적으로 처리되는 방식이 아닙니다. API의 표준 언어 인 HTTP 의미론을 활용하려고합니다. 비표준 사용자 정의 오류 코드로 200을 반환하는 대신 무단으로 401을 반환하는 이유는 무엇입니까?
Avner Shahar-Kashtan

31
이 논리에 의해 응용 프로그램은 400 범위의 응답을 반환하지 않아야합니다. 이것은 정확히 400 가지의 반응 범위에 대한 조건입니다. 또한 첫 번째 문장은 모든 미래의 답변과 귀하의 앞에 게시 된 답변에도 적용됩니까?
Dawood ibn Kareem

31
나는 이것이 200에 불과하다는 것에 동의해야한다. 사용자는 질문을하고, 우리는 그것을 이해하고, 정답을 알고, 그에게 답을 제공했다 ( "아니오"). HTTP 토지에서 모두 잘 지내고 있습니다.
이 다니엘 크로커

8
Hehe ... "실제로 오류가 아닙니다"에서 "아무것도 오류가 없다고 말하는가?"
svidgen

28
이. "존재하지 않는 URL에 액세스하려고했습니다"는 "우리 회사가 해당 지역에서 작동하지 않습니다"와는 매우 다릅니다. 오직 하나만이 HTTP와 관련이 있습니다.
CJ Dennis

88

5xx오류는 서버 오류입니다. 서버에서 문제가 발생했습니다. 특히 503 은 다음을 나타냅니다.

일시적인 과부하 또는 예정된 유지 보수로 인해 서버가 현재 요청을 처리 할 수 ​​없습니다.

4xx오류는 클라이언트 오류입니다. 클라이언트가 서버가 수행 할 수 없거나 이행 할 의사가 없음을 요청하고 있습니다. 특히 403

서버는 요청을 이해했지만 승인을 거부합니다. 요청이 금지 된 이유를 공개하려는 서버는 응답 페이로드에 해당 이유를 설명 할 수 있습니다 (있는 경우). [..] 그러나 자격 증명과 관련이없는 이유로 요청이 금지 될 수 있습니다.

나는 503이것이 일시적인 문제가 아니기 때문에 분명히 틀렸다고 주장 할 것입니다 -당신은 그 지역의 요청을 기간 동안 지원하지 않습니다. 결국이 영역을 지원하기를 희망한다고 주장 할 수 있지만 코드의 의도는 클라이언트가 다시 시도 할 수있는시기를 나타내는 헤더를 포함하는 것입니다. "6 개월 안에"는 의도를 고수하지 않습니다.

403 서비스가 단순히 특정 로케일의 요청을 금지하기 때문에 더 나은 선택입니다.


403은 액세스가 금지되어 있고 클라이언트가 이에 대해 아무것도 할 수없는 경우를위한 것입니다. 그러나이 경우 클라이언트는 (노트북이나 휴대 전화로 차에 타십시오) 403은 부적절합니다.
gnasher729

2
@ gnasher729 4xx 오류는 403을 포함하여 클라이언트가 해결할 수있는 것에 대한 것입니다. (연결된) 사양은 특히 클라이언트가 다른 자격 증명으로 재 시도 할 수 있음을 나타냅니다 (자격 증명에 문제가 있다고 가정).
jaxad0127

22
@ gnasher729 403은 인간이 그것에 대해 아무것도 할 수 없다는 것을 의미하지는 않습니다. 그것은 브라우저가 그것에 대해 아무것도 할 수 없다는 것을 의미합니다. 사람은 항상 비밀번호 재설정을 수행하거나 관리자에게 문의하거나이 경우 다른 도시로 이동할 수 있습니다.
slebetman

1
@ gnasher729 클라이언트가 사용자가 아닙니다.
Captain Man

10
5xx = 죄송합니다. 문제를 해결하는 동안 잠시 기다려주세요. 4xx = 죄송합니다. 현재 정책에 따라 귀하의 요청을 수용 할 수 없습니다. 이유는 ....
candied_orange

46

둘 다 아닙니다.

API가 잘 디자인 된 경우 URL에 도시 이름이 포함됩니다 (예 :

http://example.com/API/Vienna/HailRide

또는

http://example.com/API/HailRide?city=Vienna

IP 위치 정보를 신뢰할 수 없기 때문에 사용자가 VPN을 사용하고있을 수 있으며, 사용자가 다른 사람을 타기를 원할 수도 있습니다. 사용자의 위치를 ​​기반으로 도시를 제안하는 것은 API 클라이언트 의 책임입니다. 일반적으로, 클라이언트는 어쨌든 사용자의 위치 (예를 들어, 모바일 장치의 위치 서비스)를 결정하기위한 훨씬 더 나은 자원을 갖는다.

일단 그렇게하면 정답은

http://example.com/API/SomeUnsupportedCity/HailRide

또는

http://example.com/API/HailRide?city=SomeUnsupportedCity

분명하게하지 : 404 찾을 수 없음 : SomeUnsupportedCity에 타고 존재를 환영하기위한 어떤 자원.


6
API 디자인은 오래된 숫자 코드를 준수하는 것뿐만 아니라 VPN 등에 대한 시나리오는 매우 현실적입니다.
Edoardo

10
나는 이것에 동의하지 않는다. URL에 도시 이름을 포함하면 클라이언트가 위치를 기반으로 도시 이름을 결정하게되어 결과가 마음에 들지 않기 때문에 모든 종류의 문제가 발생할 수 있습니다. 예를 들어 로스 앤젤레스 또는 비벌리 힐스에 있습니까? 런던이나 웨스트 민스터? 클라이언트가 Richardson에 있다고 생각하지만 달라스 지역 전체에 API를 제공하려는 경우 어떻게 되나요? 고객이 픽업 / 드롭 오프 위치 만 제공하는 것이 더 좋습니다. 서버는 서비스 영역 내에 있는지 여부를 확인하고 이에 따라 응답합니다.
Zach Lipton

11
@ZachLipton 도시 이름은 단지 예일 뿐이며 OP의 실제 비즈니스 규칙에 따라 "도시"또는 "위치"를 정의하는 방법에 따라 다릅니다. 좌표 일 수도 있습니다.
Bergi

1
@ZachLipton 아니오, 여기서 요점은 위치를 이해하기 위해 서비스 사용 클라이언트 IP를 가지고 있지 않습니다.
Edoardo

3
@eddyce 나는 클라이언트 IP를 사용하는 것이 여러 가지 이유로 나쁜 생각이라는 데 동의합니다. / API / Vienna / HailRide는 클라이언트가 위치를 도시 이름으로 변환해야하기 때문에 문제가 발생하기 쉬우 며 회사가 비즈니스를 수행하는 영역과 일치하는 일대일 매핑이 아니라고 말합니다.
Zach Lipton

26

이것은 둥근 구멍 / 사각형 못 질문처럼 보입니다. 왜 유일한 응답이 HTTP 코드 여야합니까? HTTP 오류 코드가 모든 사용 사례를 다룰 수는 없습니다.

모든 API 호출에는 추가 메시지 (예 : 작은 JSON 오류 메시지)가 있어야합니다. 403 명 (정말로 위치에 따라 API를 사용할 수있는 권한이 없기 때문에)을 제공하고 제안한대로 추가 정보를 반환합니다.

이 작업을 수행하지 않으면 다음에 사용자가 SUV를 요청했지만 Prius 만 사용할 때 어떤 HTTP 오류 코드를 반환할지 묻습니다.


5
마지막 문장 +1 잘 요약합니다.
LoztInSpace

1
글쎄, 그것은 분명히 어떤 종류의 3xx 리디렉션이어야합니다. ;)
Brandon Mintern

마지막 경우는 일종의 4xx 응답을 보증합니다. 사용자는 서버가 이행 할 수없는 요청을했습니다. 선택이 잘못된 입력의 경우 400이거나 위치 자체가 존재하지 않으면 404입니다. 검색 기준이고 일치하는 항목이 없으면 200이 될 수 있습니다.
jpmc26

11

몇 가지 의미가 있습니다.

403 Eric Stein이 그의 답변에서 언급 한 이유로 금지되었습니다 . 요청에서 제공 한 다양한 정보를 사용하여 클라이언트의 위치와 클라이언트를 파악할 수 있으며 해당 요청에 따라 서버가 응답 할 수 없거나 응답하지 않을 수 있습니다.

그러나 법적 사유로 인해 451 사용할 수 없음을 일부 경우에 가능한 반품 상태로 제시하기도합니다. 이 상태에서는 헤더에 관련 법률에 대한 링크를 포함시킬 것으로 예상됩니다. 클라이언트가 귀하의 리소스에 액세스하는 것이 합법적이지 않은 경우를위한 것이며,보다 일반적인 클라이언트 사례는 지원되지 않는 지역이나 지역에 존재하지 않습니다.

5xx 계열의 상태를 피하려고합니다. 이는 종종 서버 측 기술 문제를 나타냅니다. 여기서는 그렇지 않습니다.


아마도이 경우의 이유는 도시에없는 자동차에 대해 사용자에게 알리는 것이 타당하지 않기 때문입니다. 따라서 451
max630

4
@ max630 당신은 질문에서 그것을 추측 할 수 없습니다. 403 금지가 올바른 선택 일 가능성이 높습니다 . 그러나 서비스에 법적 제한이있는 경우보다 구체적인 451을 대신 사용할 수 있습니다. 451은 종종 매우 특정한 사용 사례에 대해보다 구체적인 403 버전으로 간주되므로이를 채택하는 것이 좋습니다.
토마스 오웬스

8
@ max630-여기에 451이 적절할 수도 있습니다. 많은 관할 지역에서는 이러한 종류의 서비스 운영자가 서비스를 제공하기 전에 지역 당국에 등록해야합니다. 실제로 지역 외부에서 시작된 특정 요청을 처리하는 것은 법적으로 금지 될 수 있습니다.
Jules

5

제한이 법적 이유 때문인 경우 적절한 HTTP 오류 코드는 HTTP 451, "법적 이유로 사용할 수 없음"입니다.

이는 일반적으로 괴롭힘 캠페인 등으로 인한 DMCA 소송 또는 소송으로 인해 취소 된 자료의 경우에 사용되지만 응답 정의정신과 서한은 다음과 같습니다.

이 문서는 법적 요구에 따라 리소스 액세스가 거부 될 때 사용할 HTTP (Hypertext Transfer Protocol) 상태 코드를 지정합니다.

코드 자체는 Ray Bradbury의 Fahrenheit 451 에 대한 참조 입니다.


3

사람들은 종종 HTTP 상태 코드가 확장 가능하다는 것을 잊어 버립니다.

HTTP 상태 코드는 확장 가능합니다. HTTP 애플리케이션은 등록 된 모든 상태 코드의 의미를 이해할 필요는 없지만 그러한 이해는 분명히 바람직합니다. 그러나 응용 프로그램은 첫 번째 숫자로 표시된 상태 코드의 클래스를 이해해야하며 인식 할 수없는 응답을 캐시해서는 안된다는 점을 제외하고 인식 할 수없는 응답을 해당 클래스의 x00 상태 코드와 동등한 것으로 처리해야합니다. 예를 들어, 클라이언트가 인식 할 수없는 상태 코드 431을 수신하면 요청에 문제가 있다고 가정하고 응답을 400 상태 코드를 수신 한 것처럼 처리 할 수 ​​있습니다. 그러한 경우, 사용자 에이전트는 엔티티가 응답과 함께 리턴 한 사용자에게 제시해야한다.

https://tools.ietf.org/html/rfc2616#section-6.1.1

API 및 클라이언트 응용 프로그램에서 사용할 수 있도록 400 범위상태 코드를 언제든지 만들 수 있습니다 .


흠 ... 요청에 Expect token;city="Albequerque"헤더가 포함 된 경우 필요하지 않을 수 있습니다 . 그런 다음 가장 적절한 응답은 417이며 예상은 실패했습니다. tools.ietf.org/html/rfc2616#section-10.4.18 물론 이것은 웹 서비스를위한 것이라고 가정합니다.
Berin Loritsch

어쩌면, 오히려 기존의 코드로 상황에 맞게 억지로보다 필요 @BerinLoritsch, 수 있습니다 단지 펀트 및 사용자 정의를 사용하는 것이 더합니다.
RubberDuck

0

처음에는 "서비스를 사용할 수 없음"이라는 설명이 문제와 일치하는 것 같지만 정의를 보면 503은 실제로 서버를 사용할 수 없음에 따라 다릅니다. 그런 다음 더 많은 것을 생각하면 서버 측 문제가 아니라 요청에 문제가 있음을 클라이언트에 알리는 것입니다.

403은 사용자에게 메시지를 수신하고 이해했지만 서버가 메시지를 만족시키지 않는다는 것을 알리기 때문에 더 가깝습니다. 시나리오를 설명하기 위해 텍스트 설명을 추가 할 수 있으므로 혼동 될 수 있습니다. RFC에 따라 404도이 코드를 대신 할 수 있습니다.

누군가가 이것을 위해 새로운 코드를 꿈꾸지 않는 한, 403 또는 404가 가장 가까운 것 같습니다.


확실히 5xx 코드는 아닙니다. 왜냐하면 정확히 동일한 요청을 나중에 시도하면 성공할 수 있기 때문입니다. 4xx 코드는 적어도 일부 요청 (이 경우 "서비스 위치"필드)을 변경하지 않고 클라이언트가 다시 시도하지 않도록 지시합니다.
Toby Speight

0

제공하는 코드와 오류 설명을 일치시켜야합니다.

  • 당신이 말하면 Service not available in your area.당신은 404서비스를 사용할 수 없다고 주장하기 때문에 제공해야 합니다 .

  • 당신이 말하면 You are not authorized for this service in your area.당신은 403발신자가 권한 이 없다고 주장하기 때문에 제공해야합니다 .

나는 두 번째 갈 것입니다.


6
404는 가용성 에 관한 것이 아니라 존재 에 관한 것 입니다. 어떤 상황에서는 서비스를 사용할 수 없기 때문에 사람들이 전혀 존재하지 않는다고 믿지 않으려면 404 응답을 제공해서는 안됩니다. 이 상황에서는 404 응답이 의미가 없습니다.
Jules

@jules 403 (오래되었을 수 있음)의 스펙에 따르면 : "서버가 클라이언트에이 정보를 제공하지 않으려면 상태 코드 404 (찾을 수 없음)를 대신 사용할 수 있습니다. " 따라서 403이 정상이면 404도 가능하지만 반드시 주어진 이유는 아닙니다.
JimmyJames

@JimmyJames-예, 그것은 사양 내에 있지만 디버깅 문제를 극도로 어렵게 만들기 때문에 정말 나쁜 생각 입니다. API에서 원하는 것이 아닙니다.
Jules

3
@Jules이 서비스는 일부 지역에 존재 하지 않습니다 . 우리 도시에만 존재하는 작은 상점들이 많기 때문에 다른 도시에 주소를 물어 보면 "존재하지 않습니다"라는 정답이 있습니다.
Andy

ehmm은 서비스 URL 경로에 대한 "존재"에 대해 이야기하는 것이 가장 적습니다. 철학은 명확합니다. 일단 경로를 게시하면 답을 제공해야합니다. 403은 이러한 경우에 대한 구두 설명과 함께 그 상황.
Edoardo

0

법적 근거로 HTTP 451 사용 불가능 상태에 대한 수정을 제안 하는 최신 인터넷 초안 (2018 년 12 월 31 일에 만료 예정)이 있습니다. 이 초안은 451 응답에 "[ISO.3166-1]에 정의 된 쉼표로 구분 된 알파 -2 국가 코드 목록에 해당하는"헤더를 포함해야한다고 제안합니다 . 그러나이 초안은 또한 "사업자에 의해 법적 요구가 제기되는 것과는 대조적으로"운영자가 규정 한 정책에 기초하여 운영자가 자원에 대한 액세스를 거부하기 위해 코드 451을 사용해서는 안된다고 명시하고있다.geo-scope-block

따라서 지오 블록에 대한 법적 요구가 없다고 가정하면 451은 올바른 코드가 아닙니다. 그렇다면 올바른 코드는 무엇입니까? 글쎄, 다른 많은 답변이 이미 403 Forbidden을 제안 했지만 모두 "의견 기반"인 것처럼 보이므로 다른 사람들이하는 일을 보자.

따라서 보편적 인 해결책은 없습니다. 자신의 상황에 가장 잘 맞는 것을 선택해야합니다. 그러나 어느 쪽을 선택하든 응답 본문에서 실제 문제설명 해야합니다 .

RubberDuck이 이미 응답 한 것처럼 사용자 지정 HTTP 상태 코드를 지정하는 데 아무런 문제가 없다고 말하고 싶습니다 . 400 범위의 사용자 지정 상태 코드는 실제로 "HTTP 상태 499"와 같은 것을 볼 경우 개발자의 관심을 끌기 때문에 실제로는 꽤 좋은 호출 일 수 있습니다. "403"은 " 확인하기에 암호가 잘못되었으므로 다른 것을 시도해 보자 "로 전달하기가 너무 쉬워서 시간이 낭비됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.