2010-05-15 4 views
93

사용자가 로그인하지 않고 로그인이 필요한 페이지에 액세스하려고 시도하면 로그인 페이지로 리디렉션 할 때 올바른 HTTP 상태 코드는 무엇입니까?이로그인 페이지로 리디렉션 할 때 올바른 HTTP 상태 코드는 무엇입니까?

요청 된 자원이 세트 중 하나에 해당

10.3.1 300 Multiple Choices (복수 선택) : 3xx response codes set out by the W3C을 보이는 것도이 요구 사항에 적합하지 있기 때문에

내가 부탁하고 표현은, 는 자신의 특정 위치, 및 나타나 에이전트가 주도하는 협상 정보 ((12))와 각각 프로 중입니다 vided 사용자 (또는 사용자 에이전트 )는 바람직 표현을 선택하고 해당 위치의 요청을 재 지정할 수 있도록. 그것은 HEAD 요청이 아니 었으면

는 응답은 사용자 또는 사용자 에이전트는 가장 적합한 것을 선택할 수 에서 리소스 특성 및 위치 (들)의리스트를 포함하는 엔티티 를 포함해야한다. 엔터티 포맷은 Content-Type 헤더 필드에 주어진 미디어 타입에 의해 지정됩니다. 형식과 기능에 따라

사용자 에이전트는 가장 적합한 선택을 중에서 선택하여 을 자동으로 수행 할 수 있습니다. 그러나이 사양에서는 이러한 자동 선택에 대해 표준을 정의하지 않습니다.

서버가 표현의 , 그것은 위치 필드에서 해당 표현에 대한 특정 URI를 포함해야 선호하는 선택의 여지가있는 경우; 사용자 에이전트는 자동 리다이렉션을 위해 위치 필드 값을 사용할 수있다. 이 응답은 그렇지 않으면 으로 표시하지 않는 한 캐시 할 수 있습니다.

10.3.2 (301)

영구적으로

이전 요청한 리소스가 반환 된 URI 중 하나를 사용하는 것이 좋습니다이 자원 에 새로운 영구 URI 및 미래에 대한 참조를 할당하고있다. 링크 편집 기능이있는 클라이언트 Request-URI에 대한 참조를 이상의 새로운 참조로 자동으로 다시 연결해야 가능한 경우 서버에서 을 반환했습니다. 이 응답은 그렇지 않으면 으로 표시하지 않는 한 캐시 할 수 있습니다.

새로운 영구 URI

은 응답의 Location 필드가 을 부여해야한다. 요청 방법 HEAD, 새 URI (들)에 대한 하이퍼 링크 짧은 하이퍼 텍스트 주석을 함유한다 아니면 응답의 엔터티.그것이 사용자가 확인되지 않는 한 이것은이 변경 될 수 있기 때문에

301 상태 코드가 또는 HEAD를 GET 이외의 요청에 응답 수신되면 사용자 에이전트는 자동으로 요청 을 리디렉션해서는 안 요청이 인 조건.

Note: When automatically redirecting a POST request after 
    receiving a 301 status code, some existing HTTP/1.0 user agents 
    will erroneously change it into a GET request. 

10.3.3 302

발견 요청 된 자원이 일시적으로 다른 URI 상주. 경우에 따라 리디렉션이 으로 변경 될 수 있으므로 클라이언트는 향후 요청에 대해 Request-URI를 계속 사용해야합니다 (SHOULD ). 이 응답은 Cache-Control 또는 Expires 헤더 필드로 표시되는 경우에만 캐시 가능입니다.

임시 URI는 응답의 위치 필드로 지정해야합니다. 요청 방법이 HEAD가 아닌 한, 응답의 엔터티는 에 새로운 URI에 대한 하이퍼 링크가있는 짧은 하이퍼 텍스트 노트를 포함해야합니다. 그것이 사용자가 확인되지 않는 한 이것은이 변경 될 수 있기 때문에

302 상태 코드가 또는 HEAD를 GET 이외의 요청에 응답 수신되면 사용자 에이전트는 자동으로 요청 을 리디렉션해서는 안 요청이 인 조건.

Note: RFC 1945 and RFC 2068 specify that the client is not allowed 
    to change the method on the redirected request. However, most 
    existing user agent implementations treat 302 as if it 

관계없이 원래 요청 방법을 위치 필드 값에 GET을 수행하는 303 응답했다. 상태 코드 303 및 307에 이 추가되어 클라이언트에 대해 어떤 반응이 예상되는지 명확하게 밝히고 싶습니다.

10.3.4 303 참조 기타

요청에 대한 응답 가 상이한 URI에서 찾을 수 있으며 해당 리소스에 대한 GET 메소드를 사용하여 검색해야한다. 이 방법은 주로 이 존재하므로 POST 활성화 스크립트를 사용하여 사용자 에이전트를 선택한 자원으로 리디렉션 할 수 있습니다. 새 URI는 원래 요청한 리소스에 대한 대체 참조 이 아닙니다. 303 응답을 캐시하면 안됩니다. 두 번째 (리디렉션 됨) 요청에 대한 응답은 캐시 가능 일 수 있습니다.

다른 URI는 응답의 위치 필드로 지정해야합니다. 요청 방법이 HEAD가 아닌 한, 응답의 엔터티는 에 새로운 URI에 대한 하이퍼 링크가있는 짧은 하이퍼 텍스트 노트를 포함해야합니다.

Note: Many pre-HTTP/1.1 user agents do not understand the 303 
    status. When interoperability with such clients is a concern, the 
    302 status code may be used instead, since most user agents react 
    to a 302 response as described here for 303. 

10.3.5 (304)는 ​​서버와 을 응답해야한다, 수정 클라이언트가 조건 적 GET 요구를 실행했고 접근 이 허용되는 경우

를 수정되지하지만 문서가되지 않았습니다 이 상태 코드. 304 응답은 메시지 본문을 포함해서는 안되기 때문에 헤더 필드 뒤에 첫 번째 빈 줄인 으로 끝나는 항상 입니다.

- Date, unless its omission is required by section 14.18.1 If a 

클럭리스 원본 서버가 이러한 규칙을 순종하고, 지정된 이미 프락시와 클라이언트 ( 하나없이받은 응답 자신의 날짜를 추가

응답은 다음 헤더 필드를 포함해야한다 [RFC 2068], 섹션 14.19), 캐시가 올바르게 작동합니다.

- ETag and/or Content-Location, if the header would have been sent 
    in a 200 response to the same request 
    - Expires, Cache-Control, and/or Vary, if the field-value might 
    differ from that sent in any previous response for the same 
    variant If the conditional GET used a strong cache validator (see 

섹션 13.3.3)에 응답 다른 엔티티 헤더를 포함해서는 안된다. 그렇지 않은 경우 (조건부 GET 이 약한 유효성 검사기를 사용함) 응답 은 다른 엔티티 헤더를 포함해서는 안됩니다. 이렇게하면 캐시 된 엔터티 본문과 업데이트 된 헤더간에 불일치가 발생하지 않습니다. 304 응답이 이 현재 캐시되지 않은 엔터티를 표시 할

, 다음 캐시 는 조건없이 요구를 응답을 무시하고 반복해야합니다. 캐시는 캐시 엔트리의 갱신에 수신 된 304 응답을 사용하는 경우

는 캐시는 항목이 응답에 주어진 새로운 필드 값을 반영하기 위해 업데이트해야합니다.

10.3.6 305 프록시 사용

요청한 리소스가 위치 필드에 지정된 프록시를 통해 를 액세스 할 수 있어야한다. 위치 필드 은 프록시의 URI를 제공합니다. 받는 사람은 프록시를 통해이 단일 요청을 반복해야합니다. 305 응답은 발신 서버 에 의해서만 생성되어야합니다.

Note: RFC 2068 was not clear that 305 was intended to redirect a 
    single request, and to be generated by origin servers only. Not 
    observing these limitations has significant security consequences. 

10.3.7 306 (미사용)

306 상태 코드 사양의 이전 버전에서 사용 된, 는 더 이상 사용되지 않으며, 코드 소유입니다.

10.3.8 307 임시 리디렉션

요청한 리소스는 임시적으로 다른 URI로 에 있습니다. 경우에 따라 리디렉션을 변경할 수 있으므로 클라이언트는 향후 요청에 대해 Request-URI를 계속 사용해야합니다 (SHOULD ). 이 응답은 Cache-Control 또는 Expires 헤더 필드로 표시되는 경우에만 캐시 가능입니다.

임시 URI는 응답의 위치 필드로 지정해야합니다. 요청 방법은 많은 이전 HTTP/1.1 사용자 에이전트 이후 HEAD, 새로운 URI (들)에 하이퍼 링크와 짧은 하이퍼 텍스트 주석을 포함하고 있어야 응답의 엔티티가 아닌 이상 는 는 307 개 상태를 이해하지 못하는 . 따라서 주에는 사용자에게 필요한 정보가 포함되어 있어야합니다. 은 새로운 URI에서 원래 요청을 반복해야합니다. 그것이 사용자가 확인되지 않는 한 이것은이 변경 될 수 있기 때문에

307 상태 코드가 또는 HEAD를 GET 이외의 요청에 응답 수신되면 사용자 에이전트는 자동으로 요청 을 리디렉션해서는 안 요청이 인 조건.

나는 정답을 찾을 때까지 지금 302를 사용하고 있습니다.

업데이트 & 결론 : (302)는 고객/브라우저와 최고의 호환성을하는 것으로 알려져 있기 때문에 더

HTTP.

+0

내가 절대적으로 책 방법으로는 리디렉션없이 401 로그인 페이지를 반환하는 것입니다 말할 것이다 :

당신은 (302)를 사용하는 경우, 캐싱이 비활성화되어 다시 한 번 확인하는 것을 잊지 마세요 그러나 나는 당신의 선택이 무엇인지 모르겠습니다. –

+0

@ 좋은 지적이지만 고전적인 로그인 시스템을 구축한다면 부작용이 생길 수 있습니다. –

+0

@Pekka - 절대적으로 동의합니다. 인터넷에 기반한 인트라넷과 인터넷에 연결되는 방식에 대해 어떤 플랫폼을 사용하는지에 따라 다릅니다. 인트라넷에서 다른 방식으로 인증을 수행하는 것이 일반적입니다. , 적어도 내 경험에. –

답변

47

나는 303 찾을 다른 (302)를 참조 말하고 싶지만 :

요청 된 자원이 일시적으로 다른 URI에 있습니다. 리디렉션 은 경우에 따라으로 변경 될 수 있기 때문에 클라이언트는 이후 요청에 대해 Request-URI를 계속 사용해야합니다 (SHOULD). 이 응답은 Cache-Control 또는 Expires 헤더 필드로 표시되는 경우에만 캐시 가능합니다.

은 내 생각에 가장 밀접하게 로그인 페이지에 맞습니다. 나는 처음에는 303 see other을 고려했는데, 그것도 잘 작동 할 것이다. 어떤 생각을 한 후에는 인 자원이 있기 때문에 302 Found이 더 적합하다고 말할 수 있습니다. 액세스하기 전에 다른 페이지가 있습니다. 응답은 기본적으로 잘 캐시되지 않으며 괜찮습니다.

+3

동의하지만 302 Found는 리소스가 발견되었음을 나타냅니다. 다른 URL 바로 아래에 있습니다. 전의. "오늘"내 메시지가 "/ login /"("/ messages /"대신에)에 있기 때문에 나는 302 /를 사용하여 se/my-messages/server 응답을 원합니다 ... 나는 302를 사용하지만 느끼지 않습니다. 컨텍스트는 100 % 일치합니다. 로그인 페이지가 다른 자원이고 요청한 것과 동일한 내용을 가지고 있지 않기 때문에. –

+2

@PHP_Jedi 사실입니다. 303 그 관점에서 더 적절할 수 있습니다. 그러나 302는 클라이언트 호환성 측면에서보다 안정적입니다. –

+1

네, "요청에 대한 응답이 다른 URI에서 발견 될 수 있기 때문에 303이 상황에 더 잘 어울릴 것이라고 생각합니다." 이것은 다른 URI에서 찾을 수있는 리소스 자체가 아니라이 요청에 대한 응답 일 뿐이라는 것을 알려줍니다. –

8

적절한 해결책은 HTTP 401 (Not Authorized) 헤더라고 생각합니다.

http://en.wikipedia.org/wiki/HTTP_codes#4xx_Client_Error

이 헤더의 목적은 바로 이것이다.하지만 로그인 페이지로 리디렉션하는 대신 올바른 프로세스는 다음과 같습니다.

  • 사용자가 로그인하지 못했습니다. 로그인 제한 페이지에 액세스하려고 시도합니다.
  • 시스템이 사용자를 기록하지 않습니다.
  • 시스템은 HTTP 401 헤더를 반환하고 동일한 응답 (리디렉션이 아님)으로 로그인 양식을 표시합니다.

유용한 404 페이지 제공, 사이트 맵 링크 및 검색 양식 제공과 같은 좋은 방법입니다.

만나요.

+18

RFC 상태 : "응답에는 요청 된 자원에 적용 할 수있는 챌린지가 들어있는 WWW-Authenticate 헤더 필드 (14.46 절)가 포함되어야합니다." 401 응답은 실제로 HTTP 인증 구성표를 사용할 때만 적용됩니다. – bshacklett

+4

그럴 경우 액세스가 단순히 금지되고 승인 헤더가 도움이되지 않는다고 말하면서 403이 더 나을 것입니다. – olanod

37

이것은 HTTP 리디렉션 메커니즘의 오용입니다. 사용자가 승인되지 않은 경우 앱은 401 Unauthorized을 반환해야합니다. 사용자에게 권한이 있지만 요청한 리소스에 대한 액세스 권한이없는 경우 403 Forbidden을 반환해야합니다.

리디렉션은 클라이언트 측에서 수행해야합니다 (예 : 자바 스크립트에 의해. 필요한 승인이 존재하지 않기 때문에 리디렉션의 상태 코드. 30x를 사용하는 것은 HTTP를 따르지 않습니다.

+16

401은 (승인되지 않은) 응답을 생성하는 서버가 WWW-Authenticate 헤더 필드'([RFC] (http://tools.ietf.org/html/rfc7235#section-4.1)), 모든 로그인 시스템이 해당 헤더를 사용하는 것은 아닙니다. – starbeamrainbowlabs

+4

보호 된 페이지를 새로 고치는 경우를 가정 해보십시오. 클라이언트 측 자바 스크립트는 호출 할 변경이 없으며 브라우저는 사용자를 로그인 페이지로 리디렉션하지 않고 로그인 윈도우를 팝업하므로 유일한 방법은 30x 코드를 사용하는 것입니다. –

+0

Golang은 리디렉션에 401을 사용할 수 없습니다. 즉, 리디렉션에 30 *을 사용해야합니다. – EIMEI

-1

Firefox 브라우저가 302 리디렉션을 캐싱하는 경우가 드뭅니다. 그것이 제가 로그인 페이지에 307을 사용하는 이유입니다. 최신 기사/게시/댓글/등으로 리디렉션합니다.

header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); 
header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT'); 
header('Cache-Control: no-cache'); 
header('Pragma: no-cache'); 
header('Cache-Control: post-check=0, pre-check=0', false); 
관련 문제