클라이언트에게 세션 시간이 초과되었음을 알리기 위해 어떤 http 상태 코드를 사용해야합니까?


80

웹 페이지에서 YUI 연결 관리자 / 데이터 소스를 사용하여 AJAX 요청을 서버에 보냅니다. 세션 (사용자 인증 여부에 대한 정보 포함)이 이미 시간 초과 된 경우 인증 된 사용자 만 볼 수있는 AJAX 응답 사용자는 http 상태 코드를 반환하여 클라이언트에게 세션이 이미 시간 초과되었음을 알리고 클라이언트는 단순히 로그인 페이지로 리디렉션하거나 세션을 연장 할 것인지 묻습니다.

내 질문은이 상황에서 클라이언트에게 세션이 시간 초과되었음을 알리는 데 가장 적합한 http 상태 코드는 무엇입니까?

Wiki의 HTTP 상태 코드 목록


세션이 만료 될 예정임을 사용자에게 경고하여 사용자가이를 갱신 할 수 있도록 하시겠습니까? 이 경우 서버에서 세션 시간 초과 전에 꺼지는 JavaScript의 타이머에 의해 처리되어야합니다. 서버에서 상태 코드를 보낼 때 이미 만료되었을 것입니다. 페이지를 유휴 상태로두면 자동으로 다른 페이지로 리디렉션하는 경우에도 타이머가 필요합니다.
Jason

8
물론 418 개! 짧고 튼튼한 ...
Tim Post

Vaadin은 410 Gone을 사용하지만 브라우저에서 캐싱 할 수 있기 때문에 권장하지 않습니다
sreg

답변:


66

내가 제안 할 수있는 최선의 방법은 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에 의해 특별히 제재 된 것으로 보이지는 않지만 실제로 금지되어 있다는 것을 알 수 없습니다 (MUST 또는 NOT, SHOULD 또는 SHOULD NOT 조건과 충돌하지 않는 것 같습니다).

시간 초과 및 CSRF 토큰이 유효하지 않은 것과 같은 것에 대한보다 구체적인 HTTP 상태 코드가 있었으면 좋겠습니다.


34

HTTP 401을 권장합니다.

403은 기본적으로 "허용되지 않는다, 떠나고 돌아 오지 마라"라고 말하는 반면, 401은 "당신이 신분증을 가져 오지 않았기 때문에 당신이 허락되는지 아닌지 모른다. 그것을 얻고 다시 시도하십시오. "

Wikipedia의 정의 비교 :

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

HTTP 401-403 금지와 유사하지만 특히 인증이 가능하지만 실패했거나 아직 제공되지 않은 경우에 사용됩니다.


3
401은 HTTP 인증을 위한 것입니다 . RFC 2616은 response MUST include a WWW-Authenticate header field. 따라서 WWW-Authenticate 헤더 필드 없이 해당 코드를 보내는 것은 잘못 되었습니다 .
toxalot

19

419는 어떻습니까-표준은 아니지만 Wikipedia설명은 적합합니다.

419 인증 시간 초과

HTTP 표준의 일부가 아닌 419 인증 시간 초과는 이전에 유효한 인증이 만료되었음을 나타냅니다. 특정 서버 리소스에 대한 액세스가 거부되는 인증 된 클라이언트와 구별하기 위해 401 Unauthorized의 대안으로 사용됩니다.


14
이것이 어디에서 왔는지 (Wikipedia 제외) 알고 있습니까? 공식 RFC에없는 경우 누가 정의 했습니까?
anaximander

5
또한 위키 페이지에서 제거 할 것
살렘 Ouerdani에게

이것은 사양의 일부가 아니며 HttpServletResponse다른 신뢰할 수있는 소스를 알고있는 경우 참조하는 것이 더 나은 Java @John 에서는 사용할 수 없습니다 .
Vishrant

난 단지 PHP Laravel에 사용되는 표시
TroySteven

12

적절한 코드가 403 / 금지 될 것이라고 생각합니다. 세션과 직접적으로 관련된 것은 없습니다.


1
물론 이것은 정답입니다. 세션 시간이 초과되었으므로 요청이 금지되므로 이것이 최선의 선택입니다.
marcc

3
403은 클라이언트에게 (기본적으로) "요청을 수정하지 않는 한 다시 수행하지 마십시오"라고 알려 주지만 세션이 설정된 경우 수정이 필요하지 않습니다. 또한 대부분의 경우 세션을 다시 설정하기 위해 (현재) 요청에 대해 아무것도 할 수 없습니다.
Tim Post

1
바로 그거죠! 401이 더 좋을 것 같지만 HTTP 인증이 필요합니다. 나는 이것이 401 + 303 (분명히 704) 라인을 따라 새로운 지위를 요구한다고 생각한다. 이것은 "승인되지 않음, 승인을 얻기 위해 다른 사람을 참조"를 의미한다. 의미 적으로 더 정확할뿐만 아니라, 트램폴린 리디렉션을위한 HTTP 솔루션이 될 수도 있습니다. 기본적으로 "여기로 이동하세요. 돌아 오면 다시 시도해 보겠습니다."로그인 페이지가 다음과 관련하여 불가지론적일 수 있습니다. 목적지.
Anthony

5
나는 이것에 동의 할 수 없다. RFC 2616은 클라이언트가 403 응답을 "반복하지 말아야한다"는 요청과 "승인이 도움이되지 않을 것"이라고 명시 적으로 명시하고있다.
Iain Collins

5
authorization will not help-HTTP 인증 이 도움이되지 않는다는 의미 입니다. 맞습니다. Authorization 헤더를 보내도 아무것도 변경되지 않습니다. 어느 쪽도 401도 403 이상은 없지만, 나는 403이 생각 보다 이상 401 (401)가 잘못된 RFC 2616는 명시 적으로 언급하기 때문에 세션 시간 초과 client MAY repeat the request with a suitable Authorization header field. 그러나이 경우 클라이언트 요청을 반복 해서는 안됩니다 (적어도 중간 단계 없이는 안 됨). 불행히도 우리는 상태 코드로 후반부를 전달할 수 없습니다.
toxalot

11

사실, 세션 시간 초과에 대한 표준 HTTP 상태 코드가 없습니다. 세션은 HTTP 전송 계층이 아닌 애플리케이션 계층에서 구현됩니다.

Microsoft가 세션 시간 제한에 대해 사용했던 사용자 지정 상태 코드 : 599 또는 5xx 범위에서 사용자 고유의 상태 코드를 구성하십시오.

상태 코드 위키에서 :

599 네트워크 연결 시간 초과 오류 (알 수 없음)이 상태 코드는 RFC에 지정되어 있지 않지만 Microsoft Corp. HTTP 프록시에서 프록시 뒤의 네트워크 연결 시간 초과를 프록시 앞의 클라이언트에 알리는 데 사용됩니다.

세션 시간 제한에 사용자 지정 상태 코드 599를 사용한 다음 AJAX 응답에서 확인합니다.


3
네트워크 연결 시간 초과는 세션 시간 초과와 매우 다릅니다. 당신이 마이크로 소프트의 확장에서 코드를 사용하려는 경우, 왜 사용하지 440 Login Timeout (Microsoft)에 따라 파이 MQ의 대답
toxalot

599에 대한 Wikipedia 페이지는 잘못되었으며 인용이 없었습니다. Microsoft 프록시가 네트워크 시간 초과시 599를 올린다고 말했지만 그 증거도 찾을 수 없었습니다.
Gareth Davidson


9

링크를 게시 할 때 해당 링크에서이 HTTP 상태 코드 440을 찾았습니다 . 세션 만료에 대해 440 HTTP 상태 코드를 사용할 수 있습니다.

440 로그인 시간 초과

 The client's session has expired and must log in again.

401 Unauthorized 사용자 로그인 자격 증명이 잘못되었을 때 사용할 수 있습니다. 또는 헤더에 전달 된 인증 토큰이 잘못되었습니다.

403 금지됨 사용자에게 요청 된 리소스에 대한 특정 권한이 없을 때 사용할 수 있습니다.

그래서 제 생각에는 440 Login Time-out을 사용해야 합니다 .


2

기술적으로 허용되는 대답은 물론 정확합니다. 요청에 실패 할 것이라는 것을 이미 알고 있고 반환 할 실패 코드를 묻는 경우 HTTP 401 "Unauthorized (Unauthenticated)"가 적절한 것입니다. 재 인증을 요청합니다.

그러나 우선 스스로에게 물어보십시오. 요청을 실패해야합니까?

사용자가 단순히 귀하의 웹 사이트의 공개 페이지를 방문하고있을 ​​수 있으며,이 경우 "승인되지 않았습니다!"라는 메시지가 표시됩니다. 일반적으로 인증없이 볼 수있는 페이지를보기 위해 재 인증을 요구합니다. 멋지지 않습니다.

내 조언은 세션 토큰을 알 수 없다는 사실을 무시하고 단순히 새 세션 토큰을 생성하고 새 세션을 생성하는 것입니다. 세션의 초기 상태는 물론 "아직 인증되지 않음"이므로 사용자가 비공개 페이지에 액세스하려고하면 페이지는 HTTP 401 "인증되지 않음 (인증되지 않음)"을 수신하는 것으로 간주합니다. "이며 인증해야합니다. 그러나 사용자가 공개 페이지에 도달하면 다른 것을 알아 차리지 못할 것입니다.


0

"/ auth-required"와 같은 리소스 경로를 가리키는 "Location"헤더와 함께 302 리디렉션 응답을 사용합니다.

클라이언트는 로그인 / 비밀번호 양식을 사용하여 리소스 경로를 모달로 라우팅하여 사용자를 다른 페이지로 이동시키는 것을 방지 할 수 있습니다.


-3

비 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
});

6
응답을 구문 분석하고 싶지 않은 것은 특히 JSON.parse (responseText) 만 할 수있는 경우 HTTP 사양에서 벗어나는 좋은 이유가 아닙니다.
David Nelson

요청이 전송 계층에서 기술적 으로 성공 했기 때문에 200 응답 코드를 사용하는 것이이 경우 HTTP 사양에서 벗어나는 것으로 생각하지 않습니다 . 나에게 세션 시간 초과는 사용자에게 친숙한 오류 메시지를 반환하는 양식 오류와 유사합니다. 이 질문에 대한 답변에 표현 된 불일치는 HTTP 사양이 세션 시간 초과에 대해 업계에서 인정하는 응답 코드를 제공 하지 않음을 분명히 나타냅니다 . 존재하지 않는 사양에서 어떻게 벗어날 수 있습니까?
toxalot 2010 년

-4

코드 408. "요청 시간 초과", 완벽 해 보임 -RFC 2616에서 설명

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

즉, 정확히 "시간 제한"이 필요합니다.


4
아, 그러나 나머지 정의를 살펴보십시오. "클라이언트는 나중에 수정없이 요청을 반복 할 수 있습니다." "수정없이"는 단순히 요청을 다시로드 / 새로 고침하여 새 세션을 만들 수 있음을 의미합니다. 대부분의 경우 인증을 사용할 때 사용자는 먼저 다시 로그인해야합니다.
AJ.

@AJ, 물론 반복 된 요청은 인증 챌린지 (HTTP 코드 401)에 도달 할 수 있습니다. HTTP 사양에서이를 금지 하는 내용이 보이지 않습니다. 어떤 것을 가리킬 수 있습니까?
Alex Martelli

5
408은 클라이언트에게 요청을있는 그대로 다시 제출해야한다고 알려줍니다. 세션이 시간 초과되면 분명히 작동하지 않습니다.
Tim Post

4
408은 세션 시간 초과가 아닌 '요청'시간 초과입니다. 즉, 소켓이 설정되었지만 너무 오래 걸립니다. 이 사이트는 그것을 잘 설명하고 있습니다 : checkupdown.com/status/E408.html
Brad Cupit 2011
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.