[http] 로그인 페이지로 리디렉션 할 때 올바른 HTTP 상태 코드는 무엇입니까?

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

W3C에 의해 설정된 3xx 응답 코드 중 어느 것도 요구 사항에 맞지 않는 것 같습니다 .

10.3.1 300 객관식

요청 된 자원은 각각 고유 한 위치를 가진 일련의 표현 중 하나에 해당하며, 사용자 중심 (또는 사용자 대리인)이 선호하는 표현을 선택하고 경로를 재 지정할 수 있도록 상담원 주도 협상 정보 (섹션 12)가 제공됩니다. 해당 위치에 요청하십시오.

HEAD 요청이 아닌 한, 응답은 사용자 또는 사용자 에이전트가 가장 적합한 것을 선택할 수있는 자원 특성 및 위치 목록을 포함하는 엔티티를 포함해야한다. 엔터티 형식은 내용 형식 헤더 필드에 지정된 미디어 유형으로 지정됩니다. 형식과 기능에 따라

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

서버가 선호하는 표현 방식을 선택한다면 Location 필드에 해당 표현에 대한 특정 URI를 포함해야합니다. 사용자 에이전트는 자동 리디렉션을 위해 위치 필드 값을 사용할 수 있습니다. 달리 명시하지 않는 한이 응답은 캐시 가능합니다.

10.3.2 301 영구적으로 이동

요청 된 리소스에 새로운 영구 URI가 할당되었으며이 리소스에 대한 이후의 참조는 반환 된 URI 중 하나를 사용해야합니다. 링크 편집 기능이있는 클라이언트는 요청 URI에 대한 참조를 가능한 경우 서버가 리턴 한 하나 이상의 새 참조에 자동으로 다시 링크해야합니다. 달리 명시하지 않는 한이 응답은 캐시 가능합니다.

새로운 영구 URI는 응답의 Location 필드에서 제공해야합니다. 요청 방법이 HEAD가 아닌 한, 응답 엔티티는 새로운 URI에 대한 하이퍼 링크와 함께 짧은 하이퍼 텍스트 노트를 포함해야한다.

GET 또는 HEAD 이외의 요청에 대한 응답으로 301 상태 코드가 수신되면, 사용자 에이전트는 요청이 발행 된 조건을 변경할 수 있으므로 사용자가 확인할 수없는 경우 요청을 자동으로 리디렉션해서는 안됩니다.

  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를 사용해야합니다. 이 응답은 Cache-Control 또는 Expires 헤더 필드로 표시된 경우에만 캐시 가능합니다.

임시 URI는 응답의 Location 필드에서 제공해야합니다. 요청 방법이 HEAD가 아닌 한, 응답 엔티티는 새로운 URI에 대한 하이퍼 링크와 함께 짧은 하이퍼 텍스트 노트를 포함해야한다.

GET 또는 HEAD 이외의 요청에 대한 응답으로 302 상태 코드가 수신되면, 사용자 에이전트는 요청이 발행 된 조건을 변경할 수 있으므로 사용자가 확인할 수없는 경우 요청을 자동으로 리디렉션해서는 안됩니다.

  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

원래 요청 방법에 관계없이 Location 필드 값에 대해 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 프록시 사용

요청 된 리소스는 Location 필드에서 제공 한 프록시를 통해 액세스해야합니다. 위치 필드는 프록시의 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를 사용해야합니다. 이 응답은 Cache-Control 또는 Expires 헤더 필드로 표시된 경우에만 캐시 가능합니다.

임시 URI는 응답의 Location 필드에서 제공해야합니다. 요청 방법이 HEAD가 아닌 한, 응답의 엔티티는 많은 HTTP / 1.1 사용자 에이전트가 307 상태를 이해하지 못하기 때문에 새로운 URI에 대한 하이퍼 링크와 함께 짧은 하이퍼 텍스트 노트를 포함해야한다 (SHOULD). 따라서, 노트는 사용자가 새로운 URI에 대한 원래 요청을 반복하는데 필요한 정보를 포함해야한다.

GET 또는 HEAD 이외의 요청에 대한 응답으로 307 상태 코드가 수신되면, 사용자 에이전트는 요청이 발행 된 조건을 변경할 수 있으므로 사용자가 확인할 수없는 경우 요청을 자동으로 리디렉션해서는 안됩니다.

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

업데이트 및 결론 :

HTTP 302는 클라이언트 / 브라우저와 가장 잘 호환되는 것으로 알려져 있기 때문에 더 좋습니다.



답변

나는 303이 다른 302 Found를 본다고 말하고 싶다 .

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

내 의견으로는 로그인 페이지에 가장 가깝습니다. 나는 처음에 303 see other어느 것이 잘 작동하는지 고려했다 . 몇 가지 생각을 한 후에 302 Found요청 된 리소스 찾았 기 때문에 더 적합 하다고 말하고 액세스하기 전에 다른 페이지가 있습니다. 응답은 기본적으로 캐시되지 않으므로 괜찮습니다.

a


답변

이것은 HTTP 리디렉션 메커니즘의 오용입니다. 사용자에게 권한이 없으면 앱이를 반환해야합니다 401 Unauthorized. 사용자에게 권한이 부여되었지만 요청 된 리소스에 대한 액세스 권한이없는 경우403 Forbidden 반환해야합니다.

클라이언트 측에서 리디렉션을 수행해야합니다 (예 : javascript). 필요한 권한이 없기 때문에 리디렉션 상태 코드입니다 . 이를 위해 30x를 사용하는 것은 HTTP를 준수하지 않습니다.

Mark Nottingham의 HTTP 상태 코드에 대해 생각하는 방법

401 Unauthorized는 HTTP 요청 인증 메커니즘을 트리거합니다.

401 Unauthorized상태 코드에는 WWW-Authenticate다양한 인증 유형을 지원 하는 헤더가 있어야합니다.

WWW 인증 : <type> realm = <realm>

무기명, OAuth, 기본, 다이제스트, 쿠키 등


답변

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

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

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

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

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

또 봐요


답변