클라이언트에게 세션 시간이 초과되었음을 알리기 위해 어떤 http 상태 코드를 사용해야합니까?
웹 페이지에서 YUI 연결 관리자 / 데이터 소스를 사용하여 AJAX 요청을 서버에 보냅니다. 세션 (사용자 인증 여부에 대한 정보 포함)이 이미 시간 초과 된 경우 인증 된 사용자 만 볼 수있는 AJAX 응답 사용자는 http 상태 코드를 반환하여 클라이언트에게 세션이 이미 시간 초과되었음을 알리고 클라이언트는 단순히 로그인 페이지로 리디렉션하거나 세션을 연장 할 것인지 묻습니다.
내 질문은이 상황에서 클라이언트에게 세션 시간이 초과되었음을 알리는 데 가장 적합한 http 상태 코드는 무엇입니까?
내가 제안 할 수있는 최선의 방법은 WWW-Authenticate 헤더가있는 HTTP 401 상태 코드입니다.
403 요청 의 문제 는 RFC 2616 에 "승인이 도움이되지 않으며 요청이 반복되지 않아야합니다."라는 것입니다. (즉, 인증 여부는 중요하지 않습니다. 해당 리소스에 액세스 할 수 없습니다.)
401 요청 의 문제점 은 "WWW-Authenticate 헤더 필드를 포함해야합니다"라는 것입니다. 마찬가지로 누군가가 언급 한 WWW 인증 헤더에 사용자 정의 값을 사용할 수있는 사양을 위반 한 것으로 표시되지 않습니다.
RFC 2617 에서 HTTP 401 상태가 사용자 지정 WWW-Authenticate 헤더와 결합 된 상태 가 좋지 않은 이유를 알 수 없습니다 .
WWW-Authenticate: MyAuthScheme realm="http://example.com"
의 OAuth 스펙 (그들은 내 마음은 RFC의 이상한 해석이 있지만) 그들이이 추천으로 실제로, 다만이 작업을 수행 할 것 같다 :
WWW-Authenticate: OAuth realm="http://server.example.com/"
이것은 RFC에 의해 특별히 제재 된 것으로 보이지는 않지만 실제로 금지되어 있다는 것을 알 수 없습니다 (조건을 지정해야하거나하지 말아야 함, 조건을 지정하지 말아야하거나 안해야하는 것과 충돌하지 않는 것 같습니다).
시간 초과 및 CSRF 토큰이 유효하지 않은 것과 같은 것에 대한보다 구체적인 HTTP 상태 코드가 있었으면 좋겠습니다.
HTTP 401을 권장합니다.
403은 기본적으로 "허용되지 않는다, 떠나고 돌아 오지 마라"라고 말하는 반면, 401은 "당신이 신분증을 가져 오지 않았기 때문에 당신이 허락되는지 아닌지 모른다. 그것을 얻고 다시 시도하십시오. "
Wikipedia의 정의 비교 :
HTTP 403- 요청이 합법적 인 요청 이었지만 서버가 응답을 거부하고 있습니다.
HTTP 401-403 Forbidden과 유사하지만 특히 인증이 가능하지만 실패했거나 아직 제공되지 않은 경우 사용합니다.
419는 어떻습니까-표준은 아니지만 Wikipedia 의 설명은 적합합니다.
419 인증 시간 초과
HTTP 표준의 일부가 아닌 419 인증 시간 초과는 이전에 유효한 인증이 만료되었음을 나타냅니다. 특정 서버 리소스에 대한 액세스가 거부되는 인증 된 클라이언트와 구별하기 위해 401 Unauthorized의 대안으로 사용됩니다.
적절한 코드는 403 / Forbidden이 될 것이라고 생각합니다. 세션과 직접적으로 관련된 것은 없습니다.
사실, 세션 시간 초과에 대한 표준 HTTP 상태 코드가 없습니다. 세션은 HTTP 전송 계층이 아닌 애플리케이션 계층에서 구현됩니다.
Microsoft가 세션 시간 제한에 사용했던 사용자 지정 상태 코드 : 599 또는 5xx 범위에서 사용자 고유의 상태 코드를 구성하십시오.
상태 코드 위키에서 :
599 네트워크 연결 시간 초과 오류 (알 수 없음)이 상태 코드는 RFC에 지정되어 있지 않지만 Microsoft Corp. HTTP 프록시에서 프록시 뒤의 네트워크 연결 시간 초과를 프록시 앞의 클라이언트에 알리는 데 사용됩니다.
세션 시간 제한에 사용자 지정 상태 코드 599를 사용한 다음 AJAX 응답에서 확인합니다.
Bobo가 위에서 제공 한 Http 상태 코드 의 Wikipedia 링크에 따라 :
440 Login Timeout (Microsoft)
A Microsoft extension. Indicates that your session has expired.
링크를 게시 할 때 해당 링크에서이 HTTP 상태 코드 440을 찾았습니다 . 세션 만료에 대해 440 HTTP 상태 코드를 사용할 수 있습니다.
440 로그인 시간 초과
The client's session has expired and must log in again.
401 Unauthorized 사용자 로그인 자격 증명이 잘못되었을 때 사용할 수 있습니다. 또는 헤더에 전달 된 인증 토큰이 잘못되었습니다.
403 금지됨 사용자에게 요청 된 리소스에 대한 특정 권한이 없을 때 사용할 수 있습니다.
그래서 제 생각에는 440 Login Time-out을 사용해야 합니다 .
기술적으로 허용되는 대답은 정확합니다. 요청에 실패 할 것이라는 것을 이미 알고 있고 반환 할 실패 코드를 묻는 경우 HTTP 401 "Unauthorized (Unauthenticated)"가 적절한 것이므로 재 인증을 요구합니다.
그러나 우선 스스로에게 물어보십시오. 요청을 실패해야합니까?
사용자가 단순히 귀하의 웹 사이트의 공개 페이지를 방문하고있을 수 있으며,이 경우 "승인되지 않았습니다!"라는 메시지가 표시됩니다. 일반적으로 인증없이 볼 수있는 페이지를보기 위해 재 인증을 요구합니다. 멋지지 않습니다.
내 조언은 세션 토큰을 알 수 없다는 사실을 무시하고 단순히 새 세션 토큰을 생성하고 새 세션을 생성하는 것입니다. 세션의 초기 상태는 물론 "아직 인증되지 않음"이므로 사용자가 비공개 페이지에 액세스하려는 경우 페이지는 HTTP 401 "인증되지 않음 (인증되지 않음)"을 수신하는 것으로 간주합니다. "이며 인증해야합니다. 그러나 사용자가 공개 페이지에 도달하면 다른 것을 알아 차리지 못할 것입니다.
"/ auth-required"와 같은 리소스 경로를 가리키는 "Location"헤더와 함께 302 리디렉션 응답을 사용합니다.
클라이언트는 로그인 / 비밀번호 양식을 사용하여 리소스 경로를 모달로 라우팅하여 사용자를 다른 페이지로 이동시키는 것을 방지 할 수 있습니다.
Ajax가 아닌 요청의 경우 302 리디렉션을 사용합니다.
Ajax 요청의 경우 알려진 오류에 200을 사용 합니다. 그렇게하면 데이터 개체를 활용할 수 있습니다. 정보를 위해 jqXHR을 구문 분석하는 것보다 데이터 객체를 사용하기가 더 쉽습니다. 그런 다음 내 상황에 맞게 용도 를 변경 하기 위해 어떤 HTTP 상태 코드에 대해 걱정할 필요가 없습니다 .
jQuery 예 :
$.ajax({
//send data to server
})
.done(function(data, textStatus, jqXHR) {
if (data.success) {
//then process return data
}
else {
//get error type or message from data object
//could use custom error codes
}
})
.fail(function(jqXHR, textStatus, errorThrown) {
//handle unknown errors
});
코드 408. "요청 시간 초과", 완벽 해 보임 -RFC 2616에서 설명
클라이언트는 서버가 대기 할 준비가 된 시간 내에 요청을 생성하지 않았습니다.
i.e., exactly a "time-out", just as you require!
'Nice programing' 카테고리의 다른 글
Facebook 로그인 "애플리케이션 구성에서 허용되지 않는 URL 제공" (0) | 2020.10.27 |
---|---|
Objective-C에서 프로토콜 / 델리게이트를 확장하는 방법 (0) | 2020.10.26 |
어떤 단위 테스트 프레임 워크? (0) | 2020.10.26 |
git 저장소에서 파일을 완전히 제거하려면 어떻게해야합니까? (0) | 2020.10.26 |
izip 대신 zip을 사용하는 것이 더 좋은 때는 언제입니까? (0) | 2020.10.26 |