RESTful 로그인 실패 : 401 또는 사용자 지정 응답 반환


103

이것은 개념적인 질문입니다.

RESTful 웹 서비스에 대한 로그인 작업을 지원해야하는 클라이언트 (모바일) 애플리케이션이 있습니다. 웹 서비스가 RESTful이기 때문에 클라이언트가 사용자의 사용자 이름 / 암호를 수락하고 서비스에서 해당 사용자 이름 / 암호를 확인한 다음 모든 후속 요청과 함께 해당 사용자 이름 / 암호를 보내는 것을 기억하는 것과 같습니다.

이 웹 서비스의 다른 모든 응답은 JSON 형식으로 제공됩니다.

질문은 주어진 사용자 이름 / 암호가 유효한지 확인하기 위해 웹 서비스를 쿼리 할 때 웹 서비스가 항상 성공 또는 실패를 알려주는 JSON 데이터로 응답해야하는지 또는 좋은 자격 증명 및 HTTP에서 HTTP 200을 반환해야하는지입니다. 잘못된 자격 증명에 401.

내가 묻는 이유는 다른 RESTful 서비스가 자격 증명이 유효한지 묻는 경우에도 잘못된 자격 증명에 401을 사용하기 때문입니다. 그러나 401 응답에 대한 나의 이해는 유효한 자격 증명 없이는 액세스 권한이 없어야하는 리소스를 나타냅니다. 그러나 로그인 리소스의 전체 목적은 자격 증명이 유효한지 알려주는 것이기 때문에 로그인 리소스는 누구나 액세스 할 수 있어야합니다.

다르게 말하면 다음과 같은 요청이있는 것 같습니다.

myservice.com/this/is/a/user/action 

잘못된 자격 증명이 제공되면 401을 반환해야합니다. 그러나 다음과 같은 요청 :

myservice.com/are/these/credentials/valid

특정 URL (요청)이 유효한 자격 증명을 사용하거나 사용하지 않고 인증되었으므로 401을 반환해서는 안됩니다.

나는 이것에 대한 정당한 의견을 듣고 싶습니다. 이를 처리하는 표준 방법은 무엇이며이를 논리적으로 처리하는 표준 방법은 무엇입니까?

답변:


128

우선. 401은 로그인 실패가 발생했을 때 보낼 적절한 응답 코드입니다.

401 Unauthorized 403 Forbidden과 유사하지만 특히 인증이 필요하고 실패했거나 아직 제공되지 않은 경우에 사용됩니다. 응답에는 요청 된 리소스에 적용 할 수있는 챌린지를 포함하는 WWW-Authenticate 헤더 필드가 포함되어야합니다.

당신의 혼란, myservice.com/are/these/credentials/valid확인을 할 때 401을 다시 보내는 REST에서 부울 요청을 수행하는 것이 RESTful 제약 조건에 의해 종종 잘못된다는 사실에 근거한 것입니다. 모든 요청은 리소스를 반환해야합니다. RESTful 서비스에서 부울 질문을 수행하는 것은 RPC 로의 미끄러운 슬루프입니다.

지금은 당신이 본 서비스가 어떻게 작동하는지 모르겠습니다. 그러나 이것을 해결하는 좋은 방법은 GET을 시도하는 계정 객체와 같은 것을 갖는 것입니다. 자격 증명이 정확하면 계정 개체를 얻습니다. 대역폭을 "검사"에만 낭비하지 않으려면 동일한 리소스에서 HEAD를 수행 할 수 있습니다.

계정 개체는 개별 리소스를 생성하기 까다로울 수있는 모든 성가신 부울 값을 저장하기에 좋은 장소이기도합니다.


2
자원 반환에 대한 귀하의 요지는 타당 해 보이며 아마도 이것이 올바른 움직임 일 것입니다. 401이 적절한 응답이라고 말하는 것에 관해서는 거기에 몇 가지 설명을 부탁드립니다. 여기에 포함 된대로 HTTP 사양을 읽었지만 저에게는 귀하의 주장에 대한 직접적이고 명백한 확인으로 읽지 않습니다. 즉, 자격 증명의 유효성을 묻는 데 인증이 필요하지 않지만 포함 된 내용은 "특히 인증이 필요할 때 사용하기 위해"라고 말합니다.
매트

3
당신이 보는 방식이 맞습니다. 계정 개체를 요청하기 위해 인증을받을 필요는 없습니다. 그러나 authentication is required and has failed or has not yet been provided자격 증명의 유효성을 요청하지 않고 제공 한 자격 증명을 기반으로하는 특정 리소스에 대해 리소스를받을 수 있으려면 성공적으로 인증해야합니다 .
Cleric

2
나는 당신이 "체크 콜"을하려는 이유를 이해하고 있으며, 호출이 인증을 요구하지 않더라도 실패한 인증에 대한 적절한 응답 코드로 401을 계속 승격시킬 것입니다. 204 No Content도 적합 할 수 있지만 약간 모호하게 느껴집니다.
Cleric

4
기본 또는 다이제스트 인증을 사용하지 않는 한 이것이 어떻게 올바른지 알 수 없습니다. 사양의 인용 된 부분에 따라 : "응답은 WWW 인증을 포함해야합니다"-섹션 14.47을 참조하는 경우 : "HTTP 액세스 인증 프로세스는"HTTP 인증 : 기본 및 다이제스트 액세스 인증 "에 설명되어 있습니다. 일반적인 이메일 / 비밀번호 유효성 검사를 사용하는 경우 401이 적절하지 않다고 생각합니다
Jonah

1
나는 이것이 틀릴 수 있다고 생각하며, 웹과 모바일 모두에서 클라이언트를 구현하고 있으며 401을 가로 채 로그인 화면으로 리디렉션합니다. 그러나 누군가 이미 로그인 화면에 있고 잘못된 자격 증명을 제출하면 응답에도 401이 포함되어 다시 리디렉션을 시도합니다. 명시 적으로 시도 할 때 실패한 인증 시도에 대해 다른 상태 코드가 있어야합니다. 잘못된 요청이나 서버 오류일까요?
Japheth Ongeri-inkalimeva 2018

28

401은 요청에 인증 헤더 필드가 필요하고 인증이 실패한 경우에만 전송되어야합니다. 로그인 API에는 인증이 필요하지 않으므로 401은 제 생각에 잘못된 오류 코드입니다.

여기 표준에 따라 https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

* 10.4.2 401 무단

요청에는 사용자 인증이 필요합니다. 응답은 요청 된 자원에 적용 할 수있는 챌린지를 포함하는 WWW-Authenticate 헤더 필드 (14.47 절)를 포함해야합니다. 클라이언트는 적절한 Authorization 헤더 필드 (섹션 14.8)를 사용하여 요청을 반복 할 수 있습니다. 요청에 이미 인증 자격 증명이 포함 된 경우 401 응답은 해당 자격 증명에 대한 인증이 거부되었음을 나타냅니다. 401 응답에 이전 응답과 동일한 챌린지가 포함되어 있고 사용자 에이전트가 이미 한 번 이상 인증을 시도한 경우 해당 엔티티가 관련 진단 정보를 포함 할 수 있으므로 사용자에게 응답에 제공된 엔티티를 제공해야합니다 (SHOULD). HTTP 액세스 인증은 "HTTP 인증 : 기본 및 다이제스트 액세스 인증"[43]에 설명되어 있습니다. *


8
이에 동의하지만 보낼 대체 응답 상태는 무엇입니까? 나는 웹과 모바일 모두 클라이언트를 구현하고 있으며 로그인 화면으로 리디렉션하기 위해 401을 가로 챕니다. 그러나 누군가 이미 로그인 화면에 있고 잘못된 자격 증명을 제출하면 응답에도 401이 포함되어 다시 리디렉션을 시도합니다. 어떻게 하시겠습니까?
Japheth Ongeri-inkalimeva 2018

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