web-dev-qa-db-ja.com

401 Unauthorized vs 403 Forbidden:ユーザーがログインしていない場合の正しいステータスコードはどれですか?

多くのグーグルとStackoverflowingの後、多くの記事と質問/回答があまりにも一般的であったため、それはまだ明確ではありません( 403 Forbidden vs 401 Unauthorized HTTP response これは私のユースケース専用ではありませんでした)。

質問:ユーザーがログインしておらず、ログインしているユーザーにのみ表示する必要があるページの表示を要求した場合、適切なHTTPステータスコードとは何ですか?

18
Mohammad Naji

私が見つけた正確な満足の一度限りの答えは次のとおりです。

簡潔な答え:

401不正


説明:

最初に知っているのはauthentication(ユーザーがいるlogged-inor not?)そして、authorizationに進みます(必要なものはありますかprivilegeor not?)、しかし、ここで私たちが間違いを犯すキーがあります:

しかし、認証ではなく「401 Unauthorized」ではありませんか?

HTTP仕様(RFC 2616)が書かれたとき、2つの単語は明確に区別されるほど広く理解されていなかったかもしれません。説明やその他の補足テキストから、401が認証に関するものであることは明らかです。

From HTTPステータスコード401 Unauthorizedおよび403 Forbidden for Authentication and Authorization(and OAuth)

だから、もし私たちが標準を書き直したいなら!各単語に十分に焦点を当てて、次の表を参照できます。

Status Code | Old foggy naming | New clear naming | Use case
+++++++++++ | ++++++++++++++++ | ++++++++++++++++ | ++++++++++++++++++++++++++++++++++
401         | Unauthorized     | Unauthenticated  | User has not logged-in
403         | Forbidden        | Unauthorized     | User doesn't have enough privilege
27
Mohammad Naji

ログインの実行に使用するメカニズムによって異なります。

403 Forbidden の仕様は次のとおりです。

403(禁止)ステータスコードは、サーバーがリクエストを理解したが、承認を拒否したことを示します。リクエストが禁止されている理由を公開したいサーバーは、応答ペイロード(もしあれば)にその理由を記述することができます。

認証資格情報が要求で提供された場合、サーバーはアクセスを許可するには不十分であると見なします。クライアントは、同じ資格情報でリクエストを自動的に繰り返すべきではありません。 クライアントは、新しい資格情報または異なる資格情報を使用してリクエストを繰り返すことができます。ただし、資格情報とは無関係の理由でリクエストが禁止される場合があります。

401 Unauthorized はメインのHTTPステータスコード仕様では定義されていませんが、 HTTP認証仕様 にあり、次のように記述されています。

401(Unauthorized)ステータスコードは、ターゲットリソースの有効な認証資格情報がないため、リクエストが適用されていないことを示します。 401応答を生成するサーバーは、ターゲットリソースに適用可能な少なくとも1つのチャレンジを含むWWW-Authenticateヘッダーフィールド(セクション4.1)を送信する必要があります。


したがって、認証メカニズムとしてWWW-AuthenticateおよびAuthorizationヘッダーを使用している場合は401を使用します。他の方法を使用している場合は403を使用します。

6
Quentin

IMOクエリしようとしているリソースの種類によって異なります。そのように論理的に聞こえます。 ForbiddenはWebサイトのファイルやフォルダ、または一般的なリソースを指しますが、Unauthorizedは、何らかの種類の実行、ページスクリプトなどが必要な場合に使用する方が論理的です。

0
Merak Marey