HTTP 401-적절한 WWW-Authenticate 헤더 값은 무엇입니까?


109

지금 작업중인 응용 프로그램에는 세션 시간 초과 값이 있습니다. 사용자가이 값보다 오랫동안 상호 작용하지 않은 경우 다음 페이지를로드하려고하면 로그인하라는 메시지가 표시됩니다.

모든 요청은 AJAX 호출을 포함하는이 메커니즘을 통해 라우팅됩니다. 원래 우리는 로그인 페이지와 함께 200 헤더를 보내고 있었는데, 이는 200 응답이 전송되면 코드가 실행되기 때문에 AJAX에 몇 가지 문제가 발생하고 이러한 RPC 호출에서 다시 전송되는 대부분의 데이터는 평가되는 JSON 또는 원시 JavaScript입니다. 물어보세요 : |).

우리의 JSON 파서가 HTML 로그인 페이지를 소비하지 않기 때문에 401이 더 낫다고 제안했습니다 .. :)

그러나 spec을 읽을WWW-Authenticate필드도 전송되어야 한다는 것을 알았 습니다.

이 필드에 적합한 값은 무엇입니까? 윌 Application Login충분?

답변:


67

HTTP 기본 인증을 표시 할 때 다음과 같은 내용을 반환합니다.

WWW-Authenticate: Basic realm="myRealm"

반면 Basic에 계획과 나머지는 그 계획에 크게 의존합니다. 이 경우 영역은 사용자 ID와 암호를 묻는 메시지를 표시 할 때 사용자에게 표시 할 수있는 리터럴을 브라우저에 제공합니다.

Basic Auth를 사용할 때 세션 만료 시점이 없기 때문에 분명히 Basic을 사용하고 있지 않습니다. 나는 당신이 어떤 형태의 폼 기반 인증을 사용하고 있다고 가정합니다.

기억하자면 Windows Challenge Response는 다른 체계와 다른 인수를 사용합니다.

트릭은 브라우저가 지원하는 체계와 이에 대응하는 방식을 결정하는 것은 브라우저에 달려 있다는 것입니다.

양식 기반 인증을 사용하는 경우 내 직감은 200 + 다시 로그인 페이지를 유지하지만 브라우저가 무시하지만 AJAX가 식별 할 수있는 사용자 지정 헤더를 추가하는 것입니다.

정말 좋은 User + AJAX 경험을 위해서는 세션이 만료 된 AJAX 요청에 매달리고 팝업을 통해 재 로그인 요청을 실행하고 성공하면 원래 AJAX 요청을 다시 제출하고 정상적으로 계속 진행하는 스크립트를 가져옵니다.

세션 만료 시점을 무너 뜨리는 세션을 유지하기 위해 스크립트가 5 분마다 사이트를 공격하는 치트를 피하십시오.

다른 대안은 AJAX 요청을 태우는 것이지만 사용자 경험이 좋지 않습니다.


2
고마워 친구, 나는 리디렉션이 아니고 문자 그대로 원래 페이지 대신 로그인 양식을 포함하기 때문에 대신 403을 사용하고 있습니다. 또한 W3 사양과 더 잘 일치합니다. 그러나 정보를 주셔서 감사합니다.
Will Morgan

2
HTTP 401을 계속 사용할 수있는 방법에 대한이 답변을 참조하십시오. stackoverflow.com/questions/928874/…
lanoxx

예, WWW-Authenticate 헤더에 아무거나 넣으십시오. 비슷한 맥락의 또 다른 대답은 stackoverflow.com/a/1088127/689161입니다. 아니면 단순히 사양을 위반하고 헤더를 보내지 마세요 (적어도 몇 개의 사이트에서 이렇게합니다). (401)는 여전히 403보다 더 적합합니다
gengkev

요청이 내 ajax 또는 브라우저에 의해 처리되는지 확신 할 수 없기 때문에 WWW-Authenticate 헤더에 "아무것도 넣을"지 확신 할 수 없습니다. 이 질문의 제목 외에도 양식 기반 인증을 제안하는 세부 정보가 주어지면 WWW-Authenticate 헤더를 전혀 보내지 않습니다. 이것은 인증 / 자격 증명 챌린지에 참여하도록 브라우저에 요청하는 것이 아니기 때문입니다. 나는 단지 로그온 양식 인 양식을 보여주기를 원하지만 ajax가 식별하는 데 사용할 수있는 것은 로그온 양식이므로 위와 다르게 처리 할 수 ​​있습니다.
Swanny 2015 년

헤더와 함께 사용할 authn 체계를 구성해야합니다. 그런 다음 브라우저는 스키마를 이해하지 못하기 때문에 관여하지 않습니다. 일부 클라이언트는 헤더를 포함하지 않으면 당황하거나 혼란스러워합니다.
KayEss


-7

사용자 세션이 시간 초과되면 HTTP 204 상태 코드를 다시 보냅니다. HTTP 204 상태에는 콘텐츠가 포함되어 있지 않습니다. 클라이언트 측에서 다음을 수행합니다.

xhr.send(null);
if (xhr.status == 204) 
    Reload();
else 
    dropdown.innerHTML = xhr.responseText;

다음은 Reload () 함수입니다.

function Reload() {
    var oForm = document.createElement("form");
    document.body.appendChild(oForm);
    oForm.submit();
    }

6
HTTP 204를 사용하는 이유는 무엇입니까? developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
윌 모건
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.