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


133

사용자가 로그인하지 않고 로그인이 필요한 페이지에 액세스하려고하면 로그인 페이지로 리디렉션하기위한 올바른 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는 클라이언트 / 브라우저와 가장 잘 호환되는 것으로 알려져 있기 때문에 더 좋습니다.


1
나는 절대적으로 책 방식으로 401과 로그인 페이지를 리디렉션없이 반환하는 것이라고 말하고 싶지만 옵션이 무엇인지 잘 모르겠습니다.
Nick Craver

1
@Nick good point, 그러나 고전적인 로그인 시스템을 구축하는 경우 부작용으로 인한 두려움이 있습니다.
Pekka

1
@Pekka-절대적으로 동의합니다. 이것은 어떤 플랫폼이 깔끔하게 처리 될 수 있는지에 달려 있으며 인트라넷 대 인터넷이 작동하는 경우에도 일반적으로 인트라넷에서 다른 방법으로 인증을 수행합니다. 적어도 내 경험으로는.
Nick Craver

@Nick With 401 "응답에는 반드시 WWW-Authenticate 헤더 필드를 포함해야합니다"-이것을 MySQL 데이터베이스와 어떻게 결합 할 수 있습니까? AuthType Basic 및 Digest는 .htpassword 등과 같은 아파치 구성 파일로 제한되지 않습니까?
Vidar Vestnes

사용자 이름과 비밀번호를 묻는 기본 브라우저 대화 상자가 아닌 사용자 정의 로그인 페이지를 원합니다 ...
Vidar Vestnes

답변:


66

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

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

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


4
동의하지만 302 Found는 다른 URL에서 리소스를 찾았 음을 나타냅니다. 전의. "오늘"내 메시지가 "/ logins /"( "/ messages /"대신)에 있기 때문에 / my-messages / 서버 응답을 302로 설정하고 싶습니다. 302를 사용하지만 느낌이 없습니다. 컨텍스트가 100 % 일치합니다. 로그인 페이지는 다른 리소스이므로 요청한 내용과 동일한 내용을 갖지 않기 때문입니다.
Vidar Vestnes

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

1
그러나 303은 "요청에 대한 응답이 다른 URI에서 찾을 수 있습니다"라고 표시되어 있으므로 컨텍스트에 더 잘 맞을 것이라고 생각합니다. 이것은 다른 URI에서 찾을 수있는 리소스 자체가 아니라이 요청에 대한 응답 일 뿐이라고 알려줍니다.
Vidar Vestnes

3
@PHP_Jedi 이것에 많은 시간을 투자 할 가치가 있는지 확실하지 않습니다. 는 HTTP 세계에서 두 클라이언트와 서버가 그래서 당신이 사용 여부를 실제 차이가 없을 것이다, 어쨌든 매우 자유 및 결함 허용해야 302또는 303그 제외하고, 302더 잘 알려져있다. 나는 세부적인 수준의 칭찬을 발견하고 항상 물건을 올바르게 얻는 것이 좋지만,이 특정 영역에서 너무 많은 노력은 쓸모가 없을 수 있습니다.
Pekka

28
참고 : 구글 (302S)를 발행
데이비드 머독

51

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

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

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

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

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

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

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


20
401은 일부 경우 A server generating a 401 (Unauthorized) response MUST send a WWW-Authenticate header field( RFC ) 로 적합하지 않을 수 있으며 모든 로그인 시스템이 해당 헤더를 사용하는 것은 아닙니다.
starbeamrainbowlabs

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

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

4
@EIMEI는 당신의 추론에 따라 다른 언어 나 도서관에서 401을 사용하도록 강요하면 인터넷이 파멸 될 것입니다. 내 요점 : 당신이 말하는 것은 Golang의 문제를 지적합니다 (그러나 401을 보낼 수 없도록 디자인하는 것이 놀랍습니다!)
Greg

2
@starbeamrainbowlabs WWW-Authenticate 헤더에 옵션으로 쿠키 기반 HTTP 인증 초안이 있습니다. 다음을 참조하십시오 : tools.ietf.org/html/draft-broyer-http-cookie-auth-00
aef

12

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

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

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

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

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

또 봐요


20
RFC는 "응답에는 요청 된 자원에 해당하는 챌린지를 포함하는 WWW-Authenticate 헤더 필드 (섹션 14.46)가 포함되어야합니다."라고 말합니다. 401 응답은 실제로 HTTP 인증 체계를 사용할 때만 적용 할 수 있습니다.
bshacklett

4
이 액세스는 단순히 금지 및 권한 부여 헤더 늘 도움이되는 상태 때문에이 경우 (403)는 더 좋을 것이다
olanod

@bshacklett WWW-Authenticate는 많은 인증 체계 (예 : Bearer, OAuth)와 함께 사용할 수 있습니다. 참조 developer.mozilla.org/en-US/docs/Web/HTTP/Headers/...iana.org/assignments/http-authschemes/http-authschemes.xhtml
filip26

WWW-Authenticate 헤더에 옵션으로 쿠키 기반 HTTP 인증 초안이 있습니다. 다음을 참조하십시오 : tools.ietf.org/html/draft-broyer-http-cookie-auth-00
aef
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.