source

세션이 타임아웃되었음을 클라이언트에 알리기 위해 어떤 http 상태 코드를 사용해야 합니까?

factcode 2022. 9. 15. 22:47
반응형

세션이 타임아웃되었음을 클라이언트에 알리기 위해 어떤 http 상태 코드를 사용해야 합니까?

웹페이지에서는 YUI 접속 매니저/데이터소스를 사용하여 서버에 AJAX 요구를 송신합니다.세션(사용자가 인증되었는지 여부에 대한 정보가 포함)이 이미 타임아웃된 경우 인증된 사용자만 표시할 수 있는 AJAX 응답은 세션이 이미 종료되었음을 클라이언트에 통지하는http 상태 코드를 반환해야 합니다.타임아웃되면클라이언트는 단순히 로그인 페이지로 리다이렉트 하거나 세션을 연장할지 여부를 묻습니다.

질문은 이 상황에서 세션이 타임아웃되었음을 클라이언트에 알리는 데 가장 적합한http 상태 코드는 무엇입니까?

Wiki의 HTTP 상태 코드 목록

제가 제안할 수 있는 최선의 방법은 WWW-Authenticate 헤더를 가진 HTTP 401 상태 코드입니다.

403 요구의 문제는 RFC 2616의 "Authorization will not help and the request be repeated"(인정 여부에 관계없이 해당 리소스에 액세스할 수 없음)에 있습니다.

401 요청의 문제는 "WW-Authenticate 헤더필드를 포함해야 한다"는 것입니다.지적하신 바와 같이 WWW-Authenticate 헤더에 커스텀 값을 사용하는 것은 사양에 위배되지 않습니다.

RFC 2617에서는 HTTP 401 상태를 커스텀 WWW-Authenticate 헤더와 조합하여 사용할 수 없는 이유를 알 수 없습니다.

WWW-Authenticate: MyAuthScheme realm="http://example.com"

oAuth 사양은 실제로 이것만을 권장하고 있는 것 같습니다(단, RFC에 대해 이상한 해석을 하고 있습니다).

WWW-Authenticate: OAuth realm="http://server.example.com/"

이것은 RFC에 의해 특별히 허가된 것은 아니지만, RFC에 의해 금지되어 있다고는 볼 수 없습니다(MUST, MUST, MUST, MUST, MUST, MUST, MUST, MUST, MUST, MUST, MUST, WOOT, WORT).

타임아웃이나 CSRF 토큰이 무효인 것에 대해 보다 구체적인 HTTP 상태 코드가 있으면 더 명확해질 것입니다.

HTTP 401을 추천합니다.

403은 기본적으로 "사용할 수 없습니다. 가셔서 돌아오지 마십시오."라고 되어 있는 반면, 401은 "당신이 신분증을 가져오지 않았기 때문에 우리는 당신이 허용되는지 알 수 없습니다."라고 되어 있습니다.가서 가져와 다시 시도해봐."

Wikipedia 정의 비교:

HTTP 403 - 요청은 법적 요청이었지만 서버가 응답을 거부하고 있습니다.

HTTP 401 - 403 Forbidden과 비슷하지만 특히 인증이 가능하지만 실패했거나 아직 제공되지 않은 경우에 사용합니다.

419는 어떻습니까?표준은 아니지만 Wikipedia의 설명은 다음과 같습니다.

419 인증 타임아웃

HTTP 표준의 일부가 아닌 419 Authentication Timeout은 이전에 유효한 인증이 만료되었음을 나타냅니다.401 Unauthorized 대신 인증되지 않은 클라이언트가 특정 서버 리소스에 대한 액세스가 거부되는 것과 구별하기 위해 사용됩니다.

적절한 코드는 403/Forbidded가 될 것 같습니다.세션과 직접 관련된 것은 없습니다.

위에서 Bobo에 의해 제공된 Http 상태 코드의 위키피디아 링크에 따르면:

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 사용자 로그인 credential이 잘못된 경우 Unauthorized를 사용할 수 있습니다.또는 헤더에 전달된 인증 토큰이 유효하지 않습니다.

403 금지: 사용자가 요청된 리소스에 대한 특정 권한을 가지고 있지 않은 경우 이 기능을 사용할 수 없습니다.

따라서 440 Login Timeout을 사용해야 한다고 생각합니다.

사실 세션 타임아웃에는 표준 HTTP 상태 코드가 없습니다.세션은 HTTP 트랜스포트 레이어가 아닌 응용 프로그램레이어에 실장됩니다.

Microsoft가 세션타임아웃을 위해 사용하고 있는 커스텀상태 코드가 있습니다.599 또는 5xx 범위의 독자적인 상태 코드를 작성하기만 하면 됩니다.

상태 코드 Wiki에서 다음을 수행합니다.

599 네트워크 연결 타임아웃 오류(알 수 없음)이 상태 코드는 RFC에 지정되어 있지 않지만 Microsoft Corporation에 의해 사용됩니다.HTTP 프록시: 프록시 앞의 클라이언트에 프록시 뒤의 네트워크 연결 타임아웃 신호를 보냅니다.

세션 타임아웃 시 커스텀상태 코드 599를 사용하여 AJAX 응답으로 확인합니다.

엄밀히 말하면 인정된 답변은 물론 정확합니다.요구에 실패하는 것을 이미 알고 있으며 반환할 장애 코드를 묻는 경우 재인증을 촉구하기 위해 HTTP 401 "Unauthorized (Unauthenticated)"가 적절한 코드입니다.

하지만 먼저 자신에게 물어보세요: 요청을 거절해야 합니까?

사용자는 단순히 웹 사이트의 공개 페이지를 방문했을 가능성이 있습니다.이 경우 사용자는 인증 없이 일반적으로 볼 수 있는 페이지를 보기 위해 얼굴을 "Unauthorized!" 메시지로 때리고 재인증을 요구합니다.그건 별로야.

세션 토큰을 알 수 없다는 사실을 무시하고 새 세션토큰을 생성하고 세션 토큰을 위한 새 세션을 만드는 것이 좋습니다.세션의 초기 상태는 물론 "not-yet-authenticated"이므로 사용자가 공개되지 않은 페이지에 액세스하려고 하면 페이지는 HTTP 401 "Unauthorized (Unauthenticated)"를 수신하여 인증해야 함을 인식합니다.그러나 사용자가 공개 페이지에 접속해도 달라진 점은 알아차리지 못합니다.

"/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. "Request timeout"은 완벽해 보입니다.RFC 2616은 다음과 같이 설명하고 있습니다.

서버가 대기할 준비가 된 시간 내에 클라이언트가 요청을 생성하지 않았습니다.

즉, 정확히 필요한 "타임아웃"입니다.

언급URL : https://stackoverflow.com/questions/1653493/what-http-status-code-is-supposed-to-be-used-to-tell-the-client-the-session-has

반응형