403 Forbidden vs 401 Unauthorized HTTPレスポンス


2785

存在するが、ユーザーに十分な権限がない(ログインしていない、または適切なユーザーグループに属していない)Webページの場合、適切なHTTP応答は何ですか?

401 Unauthorized
403 Forbidden
他に何か?

これまでにそれぞれについて読んだことは、2つの違いについてはあまり明確ではありません。各応答に適切なユースケースは何ですか?


358
401 'Unauthorized'は401 'Unauthenticated'である必要があり、問題は解決しました!
Christophe Roussy、2016年

47
私と私の同僚がこの質問のために何回スタックオーバーフローに戻ってきたか覚えていません。たぶん、HTTP規格は、401と403の名前または説明を変更することを検討すべきである
神経突起

実際、このエラーの別のバージョンが表示されます。「os_authTypeは 'any'で、無効なCookieが送信されました」のようになります。だからそれを解決する方法を理解することができません。多くの時間をGoogleで検索しましたが、理由はわかりましたが、解決策がありませんでした。
Sandeep Anand

@Qwertyいいえ、新しいRFC7231はRFC2616を廃止します。403は現在、別の意味を持っています。
フィッシュボーン2018

1
@fishboneあなたはまた、ステータスコード401がそのRFCから削除されたことに
気付かなかった

回答:


4115

Daniel Irvineからの明確な説明:

認証エラーのHTTPステータスコードである401 Unauthorizedに問題があります。そして、それだけです。認証ではなく、承認のためです。401応答を受信すると、サーバーから「認証されていません-まったく認証されていないか、正しく認証されていません-再認証して、もう一度お試しください。」と通知されます。あなたを助けるために、それは常に認証する方法を説明するWWW-Authenticateヘッダーを含みます。

これは通常、Webアプリケーションではなく、Webサーバーによって返される応答です。

また、これは非常に一時的なものです。サーバーは再試行を要求しています。

したがって、承認には403 Forbidden応答を使用します。これは永続的で、私のアプリケーションロジックに関連付けられており、401よりも具体的な応答です。

サーバーが403応答を受信すると、「ごめんなさい。私はあなたが誰であるかを知っています–あなたがあなたが誰であるかを信じています–しかし、あなたにはこのリソースにアクセスする許可がありません たぶん、システム管理者にきちんと尋ねれば許可を得るでしょう。しかし、あなたの苦境が変わるまで、再度私を悩ませないでください。」

要約すると、401 Unauthorized応答は、認証の欠落または不良に使用する必要があり、403 Forbidden応答は、ユーザーが認証されているが、特定のリソースで要求された操作を実行する権限がない場合に使用する必要があります。

httpステータスコードを使用する方法のもう1つの素晴らしい画像形式

ここに画像の説明を入力してください


43
デフォルトのIIS 403メッセージは「これは一般的な403エラーであり、認証されたユーザーがページを表示することを承認されていないことを意味します」であり、これは同意するようです。
Ben Challenor、2011

333
@JPReddy正解です。ただし、401は「Unauthenticated」、403は「Unauthorized」という名前になると思います。認証に関連する401のテキストに "Unauthorized"というテキストが付いているのは非常に混乱しています。私が英語が得意でない場合(かなり可能性があります)。
p.matsinopoulos 2012年

64
@ ZaidMasud、RFCによると、この解釈は正しくありません。クンバヤの答えはそれを正しくしました。401は、「正しい権限がありません」という意味です。これは、「必要な場合は、自分を認証しようとする可能性がある」ことを意味します。したがって、自分自身を正しく認証しなかったクライアントと、適切に認証されたクライアントが許可を失ったクライアントの両方が401を取得します。403は、「誰にでも、これには答えません」という意味です。RFCは、403の場合は「承認しませんヘルプ」thath明記
ダヴィデR.

84
401は認証エラー、403は承認エラーです。そのような単純な。
Shahriyar Imanov 2013年

30
彼のブログ投稿からコピーすると、「まあ、それはとにかくそれについての私の見解です:)」を省いて、残念ながら彼の見解は間違っています。他の人が述べたように、403は、認証された人物に関係なく、リソースにアクセスできないことを意味します。通常、このステータスコードは、直接アクセスしたくない(つまり、スクリプトがそれらを処理する必要がある)WebルートのIPアドレス範囲またはファイルによってロックダウンされているリソースに使用します。
カイル2013年

403

RFC2616を参照してください。

401無許可:

要求にすでに認証資格情報が含まれている場合、401応答は、それらの資格情報の認証が拒否されたことを示します。

403禁止します:

サーバーはリクエストを理解しましたが、リクエストの実行を拒否しています。

更新

ユースケースから、ユーザーは認証されていないようです。401を返します。


編集:RFC2616は廃止されました。RFC7231およびRFC7235を参照してください。


21
ありがとう、それは私にとってそれを明確にするのに役立ちました。私は両方を使用しています-非認証ユーザーには401、権限が不十分な認証ユーザーには403を使用しています。
VirtuosiMedia 2010

52
私は反対票を投じなかったが、この答えはかなり誤解を招くと思う。403 forbiddenは、提供されないコンテンツ(asp.netの.configファイルなど)でより適切に使用されます。それか404のどちらかです。imho、アクセスできるものに対して403を返すのは適切ではありませんが、正しい資格情報を持っていませんでした。私の解決策は、資格情報を変更する方法を備えたアクセス拒否メッセージを提供することです。そのまたは401
メル

27
「応答には、要求されたリソースに適用可能なチャレンジを含むWWW-Authenticateヘッダーフィールド(セクション14.47)を含める必要があります。」HTTPスタイルの認証を使用したくない場合は、401応答コードは適切ではないようです。
ブリリアン

8
私はここにビリアンを送ります。ステートメントは「リクエストにすでに認証情報が含まれている場合」です。これは、これが資格情報を提供した要求からの応答(たとえば、RFC2617認証試行からの応答)である場合を意味します。それは本質的にサーバーが「悪いアカウント/パスワードのペア、再試行してください」と言うことを可能にすることです。提示された質問では、ユーザーはおそらく認証されていますが、承認されていません。401は、これらの状況に対して適切な応答になることはありません。
ldrut 2013

6
Brilliandは正解です。401はHTTP認証にのみ適しています。
ジュアンピ2013年

296

他の答えが欠けているのは、RFC 2616のコンテキストでの認証と承認がRFC 2617のHTTP認証プロトコルのみを参照することを理解する必要があることです。RFC2617以外のスキームによる認証は、HTTPステータスコードではサポートされておらず、考慮されません。 401と403のどちらを使用するかを決定するとき。

簡潔で簡潔

無許可は、クライアントがRFC2617認証されておらず、サーバーが認証プロセスを開始していることを示します。Forbiddenは、クライアントがRFC2617で認証され、承認されていないか、サーバーが要求されたリソースのRFC2617をサポートしていないことを示します。

独自のロール独自のログインプロセスがあり、HTTP認証を使用しない場合、403は常に適切な応答であり、401は使用しないでください。

詳細かつ詳細

RFC2616から

10.4.2 401無許可

リクエストにはユーザー認証が必要です。応答には、要求されたリソースに適用可能なチャレンジを含むWWW-Authenticateヘッダーフィールド(セクション14.47)を含める必要があります。クライアントは適切なAuthorizationヘッダーフィールド(セクション14.8)を使用してリクエストを繰り返すことができます(MAY)。

そして

10.4.4 403 Forbiddenサーバーは要求を理解しましたが、要求の実行を拒否しています。承認は役に立たず、リクエストは繰り返されるべきではありません。

最初に覚えておかなければならないのは、このドキュメントのコンテキストでの「認証」と「承認」は、RFC 2617のHTTP認証プロトコルを特に指しているということです。これらは、作成した独自のロール認証プロトコルを指すものではありません。ログインページなどを使用します。RFC2617以外の方法による認証と承認を参照するには、「ログイン」を使用します。

したがって、本当の違いは問題が何であるか、または解決策がある場合でもです。違いは、サーバーがクライアントに次に行うことを期待していることです。

401は、リソースを提供できないことを示しますが、サーバーは、クライアントがHTTP認証を介してログインし、プロセスを開始するための応答ヘッダーを送信したことを要求しています。おそらく、リソースへのアクセスを許可する承認があるかもしれませんが、そうでないかもしれませんが、試してみて何が起こるか見てみましょう。

403は、リソースを提供できず、現在のユーザーがRFC2617を使用してこれを解決する方法がなく、試行する意味がないことを示します。これは、認証のレベルが十分ではないことがわかっているため(IPブラックリストなどが原因)、ユーザーがすでに認証されており、権限がないことが原因である可能性があります。RFC2617モデルは1ユーザー1クレデンシャルであるため、ユーザーが許可される可能性のある2番目のクレデンシャルセットを持っている場合は無視できます。これは、ある種のログインページやその他の非RFC2617認証プロトコルが役立つかどうかを示唆も示唆もしていません。これは、RFC2616標準と定義の範囲外です。


編集:RFC2616は廃止されました。RFC7231およびRFC7235を参照してください。


7
では、ユーザーがhttp以外の認証を必要とするページを要求した場合はどうすればよいでしょうか。ステータスコード403を送信しますか?
marcovtwout 2014年

2
これは、区別についての私の質問に答えた答えです。
Patrick 14

9
これは重要です。「独自の独自のログインプロセスがあり、HTTP認証を使用しない場合、403は常に適切な応答であり、401は使用しないでください。」
ggg 2014

1
@marcovtwoutログインページに302を送信するか、ログイン方法の情報を含む本文を含む403を送信しますか?
アレックス

4
RFC7235は「roll-your-own」または代替の認証チャレンジを提供していませんか?アプリのログインフローがWWW-Authenticateヘッダーの形で課題を提示できないのはなぜですか?ブラウザーがサポートしていなくても、私のReactアプリはできる...
jchook

127
  + -----------------------
  | リソースは存在しますか?(プライベートの場合、認証チェックの後に頻繁にチェックされます)
  + -----------------------
    | |
 いいえ| vはい
    v + -----------------------
   404 | ログインしていますか?(認証済み、別名セッションまたはJWT Cookieがあります)
   または+ -----------------------
   401 | |
   403いいえ| | はい
   3xx vv
              401 + -----------------------
       (404明らかにしない)| リソースにアクセスできますか?(許可、承認済み、...)
              または+ -----------------------
             リダイレクト| |
             ログインしない| | はい
                               | |
                               vv
                               403 OK 200、リダイレクト、...
                      (または404:非公開)
                      (または404:プライベートの場合、リソースは存在しません)
                      (または3xx:リダイレクト)

チェックは通常、次の順序で行われます。

  • リソースが公開されていて存在しない場合は404、または3xxリダイレクト
  • さもないと:
  • ログインしていない場合、またはセッションが期限切れの場合は401
  • 403ユーザーがリソース(ファイル、jsonなど)にアクセスする権限を持っていない場合
  • リソースが存在しないか、何も公開しない場合は404、または3xxリダイレクト

UNAUTHORIZED:リクエストに認証が必要であることを示すステータスコード(401)。通常、これはユーザーがログイン(セッション)する必要があることを意味します。サーバーで不明なユーザー/エージェント。他の資格情報で繰り返すことができます。注:これは「無許可」ではなく「非認証」と名付けられているはずなので、混乱を招きます。これは、セッションの有効期限が切れた場合、ログイン後にも発生する可能性があります。特殊なケース:404の代わりに使用して、リソースの存在または非存在を明らかにしないようにすることができます(クレジット@gingerCodeNinja)

FORBIDDEN:サーバーが要求を理解したが、要求の実行を拒否したことを示すステータスコード(403)。サーバーはユーザー/エージェントを認識していますが、資格情報不十分です。資格情報が変更されない限り、リクエストの繰り返しは機能しません。これは、短期間ではほとんどありません。特殊なケース:404の代わりに使用して、リソースの存在または非存在を明らかにしないようにすることができます(クレジット@gingerCodeNinja)

NOT FOUND:リクエストされたリソースが利用できないことを示すステータスコード(404)。ユーザー/エージェントは既知ですが、サーバーはリソースについて何も公開せず、存在しないかのように表示します。繰り返しは機能しません。これは404の特別な使用法です(たとえば、githubがそれを行います)。

@ChrisHで述べたように、リダイレクト 3xxにはいくつかのオプションがあります(301、302、303、307、またはまったくリダイレ​​クトせず、401を使用)。


たとえば、ログインしていて、ページにアクセスできますが、権限が有効になっていません。どのステータスコードが返されますか?
barteloma 2017

@bookmarkerログインは認証と呼ばれ、最初のステップです。したがって、ログイン後に権限がない場合は、403 Forbiddenになります(資格情報が不十分な場合は、十分な権限がないことを意味します)。
クリストフ・ルシー2017

3
明確で簡単な説明。ちょうど私が必要なもの。
エステベス2018

ユーザーがログインしていないか、ログインしていても権限がなく、コンテンツがその場所に存在しない場合は、404ではなく401/403を返して、何であるか、または何でないかを公開したくない場合があります。ユーザーが認証されておらず、ログインしていない場合は表示されません。何かが存在することを知っているだけで、何かを示唆したりNDAを破ったりする可能性があります。したがって、この図の404部分は、ログイン/認証済みの下に移動する必要がある場合があります。
gingerCodeNinja

1
@MattKocajは、no revealケースが微妙なタイミングの違いによって検出される場合があり、セキュリティ機能と見なすべきではないことに注意してください。攻撃者の速度を低下させるか、プライバシーの保護に少し役立ちます。
Christophe Roussy

113

RFC 2616(HTTP / 1.1)によると、403は次の場合に送信されます。

サーバーはリクエストを理解しましたが、リクエストの実行を拒否しています。承認は役に立たず、リクエストは繰り返されるべきではありません。リクエストメソッドがHEADではなく、サーバーがリクエストが実行されなかった理由を公開したい場合は、エンティティで拒否の理由を説明する必要があります。サーバーがこの情報をクライアントに提供したくない場合は、代わりにステータスコード404(見つかりません)を使用できます

つまり、クライアントが認証によってリソースにアクセスできる場合は、401を送信する必要があります。


5
そして、彼らがアクセスできるかどうかが明確でない場合はどうなりますか?パブリック、メンバー、プレミアムメンバーの3つのユーザーレベルがあるとします。このページはプレミアムメンバー専用であると想定します。パブリックユーザーは基本的に認証されておらず、ログイン時にメンバーまたはプレミアムメンバーに属している可能性があります。メンバーユーザーレベルでは、403が適切と思われます。プレミアムメンバーは401です。
VirtuosiMedia 2010

27
imho、これが最も正確な答えです。これはアプリケーションによって異なりますが、一般に、認証されたユーザーがリソースに対する十分な権限を持っていない場合は、資格情報を変更する方法または401を送信する方法を提供する必要があるかもしれません。asp.netでは、これはweb.configファイル* .resxファイルなどを意味します。どのユーザーがログインしても、これらのファイルは提供されないため、再試行しても意味がありません。
Mel

6
+1、しかし不確実な+1。論理的な結論は、401または404の方が厳密に優れた応答になるため、403は決して返すべきではないということです。
CurtainDog 2013年

12
@Melクライアントがアクセスしてはならないファイルは404だと思います。これは、システムの内部にあるファイルです。外部はそれが存在することさえ知らないはずです。403を返すことで、その情報をクライアントに知らせ、ハッカーにその情報を提供する必要がないようにします。403の仕様によるとAn origin server that wishes to "hide" the current existence of a forbidden target resource MAY instead respond with a status code of 404 (Not Found).
ファンメンデス

3
これはおそらく古いRFC 2616の正確な解釈だと思われますが、RFC 7231 は403のセマンティクスを別の方法で定義し、実際には「クライアントは新しいまたは別の認証情報でリクエストを繰り返すことができる」と明示的に述べていることに注意してくださいしたがって、この回答は2010年には正確でしたが、ステータスコードの意味が私たちの足元に書き直されたため、今日は完全に間違っています。(厄介なことに、付録RFC 2616から変更変更を認めません!)
Mark Amery

46

HTTP認証WWW-AuthenticateおよびAuthorizationヘッダー)が使用されていると仮定すると、別のユーザーとして認証すると、要求されたリソースへのアクセスが許可される場合は、401 Unauthorizedが返されます。

403 Forbiddenは、リソースへのアクセスがすべてのユーザーに禁止されているか、特定のネットワークに制限されているか、HTTP認証に関連しない限り、SSL経由でのみ許可されている場合に使用されます。

HTTP認証が使用されておらず、サービスが現在の標準であるCookieベースの認証スキームである場合、403または404が返されます。

401に関しては、これはRFC 7235(Hypertext Transfer Protocol(HTTP / 1.1):Authentication)によるものです。

3.1。401無許可

401(無許可)ステータスコードは、ターゲットリソースの有効な認証資格情報がないため、要求が適用されなかったことを示します。オリジンサーバーは、ターゲットリソースに適用可能なチャレンジを少なくとも1つ含むWWW-Authenticateヘッダーフィールド(4.4節)を送信する必要があります。 要求に認証資格情報が含まれている場合、401応答は、それらの資格情報の承認が拒否されたことを示します。クライアントは、新しいまたは置き換えられたAuthorizationヘッダーフィールド(セクション4.1)を使用して要求を繰り返すことができます(MAY)。401応答に前の応答と同じチャレンジが含まれ、ユーザーエージェントが少なくとも1回認証を試みた場合、ユーザーエージェントは通常、関連する診断情報を含むため、囲まれた表現をユーザーに提示する必要があります。

403(および404)のセマンティクスは時間とともに変化しました。これは1999年のものです(RFC 2616)。

10.4.4 403 Forbidden

サーバーはリクエストを理解しましたが、リクエストの実行を拒否しています。
承認は役に立たず、リクエストは繰り返されるべきではありません。
リクエストメソッドがHEADではなく、サーバー
がリクエストが実行されなかった理由を公開したい場合は、エンティティで拒否の理由を説明する必要があります。サーバーがこの情報をクライアントに提供したくない場合は、
代わりにステータスコード404 (見つかりません)を使用できます。

2014年にRFC 7231(Hypertext Transfer Protocol(HTTP / 1.1):Semantics and Content)は403の意味を変更しました:

6.5.3。403禁止します

403(禁止)ステータスコードは、サーバーが要求を理解したが、承認を拒否したことを示します。要求が禁止された理由を公開したいサーバーは、その理由を応答ペイロード(存在する場合)に記述できます。

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


禁止されているターゲットリソースの現在の存在を「非表示」にするオリジンサーバーは、代わりにステータスコード
404(Not Found)で応答する場合があります。

したがって、403(または404)は現在、何についても意味する可能性があります。新しい資格情報を提供すると役立つ場合とそうでない場合があります。

これが変更された理由は、RFC 2616がHTTP認証を実際に使用して、今日のWebアプリがフォームやCookieなどを使用してカスタム認証スキームを構築するときに使用されると想定しているためだと思います。


2
これは面白い。RFC 7231とRFC 7235に基づいて、401と403の明確な区別はありません
ブライアン

2
403は「私はあなたを知っているが、あなたはこのリソースを見ることができない」という意味です。混乱する理由はありません。
マイケルブラックバーン

「リクエストに認証クレデンシャルが含まれている場合、401レスポンスは、それらのクレデンシャルの許可が拒否されたことを示します。クライアントは、新しいまたは置き換えられたAuthorizationヘッダーフィールドでリクエストを繰り返すことができます(セクション4.1)。」ただし、「4.2。「Authorization」ヘッダーフィールドにより、ユーザーエージェントはオリジンサーバーで自身を認証できます。」RFC7235では、「認証」のように「認可」という用語を使用しているように見えます。その場合、認証されたが承認されていないユーザーは401を取得するべきではなく、403を取得する必要があるように見えるかもしれません
arcuri82

29

これは古い質問ですが、実際に取り上げられなかったオプションの1つは404を返すことでした。セキュリティの観点から、投票数の多い回答には、情報漏えいの脆弱性が存在する可能性があります。たとえば、問題の安全なWebページがシステム管理ページである、またはおそらくより一般的には、ユーザーがアクセスできないシステムのレコードであるとします。理想的には、悪意のあるユーザーにページ/レコードがあることを知らせたくないだけでなく、アクセスできないことも望まないでしょう。このようなものを構築しているときは、認証されていない/許可されていないリクエストを内部ログに記録しようとしますが、404を返します。

OWASPには、攻撃者がこの種の情報を攻撃の一部としてどのように使用できるかについて、いくつかの詳細情報があります。


3
404の使用については、以前の回答で説明しています。情報漏えいが発生しています。これは、独自の認証/承認スキームを導入する人にとって重要な考慮事項です。OWASPについて言及した場合は+1。
Dave Watts

皮肉なことに、OWASPリンクは404ページに移動します。私はowasp.org/index.php/…で
anned20

ヘッドアップをありがとう、私はそれを更新しました!
パトリックホワイト

APIとアクセス権の付与方法によって異なります。しかし、「リーク」がユーザー名/パスワードに対して401を返す場合は問題ありません。Webフォームの場合と同じですか?
ジェームズ

26
  • 401 Unauthorized:私はあなたが誰なのかわかりません。これは認証エラーです。
  • 403 Forbidden:私はあなたが誰であるか知っていますが、このリソースにアクセスする権限がありません。これは認証エラーです。

特に「常に」という意味では、送信者が不明であることを確信できません。彼らが要求したものは何も許可されていませんでした。
ジェームズ

22

この質問は少し前に尋ねられましたが、人々の考えは変わりません。

このドラフトの6.5.3(Fielding and Reschkeが作成)は、ステータスコード403にRFC 2616で文書化されているものとは少し異なる意味を与えています。

これは、多くの一般的なWebサーバーおよびフレームワークで採用されている認証および承認スキームで何が発生するかを反映しています。

最も目立つと思うビットを強調しました。

6.5.3。403禁止します

403(禁止)ステータスコードは、サーバーが要求を理解したが、承認を拒否したことを示します。要求が禁止された理由を公開したいサーバーは、その理由を応答ペイロード(存在する場合)に記述できます。

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

禁止されているターゲットリソースの現在の存在を「非表示」にするオリジンサーバーは、代わりにステータスコード404(Not Found)で応答する場合があります。

どのような規則を使用する場合でも、重要なことは、サイト/ API全体に均一性を提供することです。


2
草案は承認され、現在はRFC 7231.ありました
Vebjorn Ljosa

13

TL; DR

  • 401:認証に関連する拒否
  • 403:認証とは何の関係もない拒否

実例

Apache (を介して.htaccess認証を必要とする場合、を押すCancelと、401 Authorization Required

場合nginxのは、ファイルを見つけますが、何も持っていないアクセス権(ユーザー/グループ)読むために/アクセスそれを、それがで応答します403 Forbidden

RFC(2616セクション10)

401無許可(10.4.2)

意味1:認証が必要

リクエストにはユーザー認証が必要です。...

意味2:認証が不十分

...要求にすでに認証資格情報が含まれている場合、401応答は、それらの認証情報の承認が拒否されたことを示します。...

403 Forbidden(10.4.4)

意味:認証とは無関係

...承認は役に立ちません...

詳細:

  • サーバーはリクエストを理解しましたが、リクエストの実行を拒否しています。

  • エンティティでの拒否の理由を説明する必要があります

  • 代わりにステータスコード404(見つかりません)を使用できます

    (サーバーがクライアントからのこの情報を保持したい場合)


11

ログインしていないか、適切なユーザーグループに属していません

あなたは2つの異なるケースを述べました。ケースごとに異なる応答が必要です。

  1. ログインしていない場合は、401 Unauthorizedを返す必要があります
  2. ログインしているが適切なユーザーグループに属していない場合は、403 Forbiddenを返す必要があります。

この回答に対して受け取ったコメントに基づくRFCに関するメモ:

ユーザーがログインしていない場合、ユーザーは認証されていません。これに相当するHTTPは401であり、RFCでは誤ってUnauthorizedと呼ばれています。セクション10.4.2401 Unauthorizedの状態として:

「リクエストにはユーザー認証が必要です。」

認証されていない場合は、401が正しい応答です。ただし、無許可の場合、意味的に正しい意味では、403が正しい応答です。


5
これは正しくありません。RFCと@Cumbayahの回答を参照しください。
Davide R.

7
@DavideR。RFCは認証承認を互換的に使用します。認証の意味で読んだ方が理にかなっていると思います。
Zaid Masud

この答えは逆です。UnauthorizedはUn-authenticatedと同じではありません。@DavideRは正しいです。認証と承認は互換性がありません
BozoJoe 2013年

2
2616を燃やす必要があります。いくつかの新しいRFCは、「あなたを知らない」と「私はあなたを知っているが、あなたはこれにアクセスできない」とを区別する必要があることをより明確にしています。403トゥルーサーが示唆しているように、決して実現されない(またはhttpを通じて実現されない)リソースの存在を認める正当な理由はありません
マイケルブラックバーン

6

これらは意味です:

401:ユーザーは(正しく)認証されていません。リソース/ページには認証が必要です

403:ユーザーは認証されましたが、その役割または権限では要求されたリソースへのアクセスが許可されていません。たとえば、ユーザーは管理者ではなく、要求されたページは管理者用です


これは、この質問に対する優れたTLDR回答です。
Kousha、

5

これは私の頭の中でここのどこよりも簡単なので、:

401:これを表示するには、HTTP基本認証が必要です。

403:これを見ることができず、HTTP基本認証は役に立ちません。

ユーザーがサイトの標準HTMLログインフォームを使用してログインする必要があるだけの場合、401はHTTP基本認証に固有であるため、適切ではありません。

403を使用してへのアクセスを拒否することはお勧めしません/includes。Webに関する限り、これらのリソースはまったく存在しないため、404にする必要があります。

これにより、403は「ログインする必要があります」として残ります。

つまり、403は「このリソースにはHTTP基本認証以外の認証が必要」を意味します。

https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.2


5

ブラウザに対して、401はユーザーが新しい資格情報を入力するための認証ダイアログを開始し、403は開始しないことを考慮することが重要だと思います。ブラウザは、401が返された場合、ユーザーは再認証する必要があると考えています。したがって、401は無効な認証を表し、403は権限の欠如を表します。

そのロジックの下で、認証または承認からエラーが返されるいくつかのケースを以下に示します。重要なフレーズは太字で表示されています。

  • リソースには認証が必要ですが、資格情報指定されてません

401:クライアントは資格情報を指定する必要があります。

  • 指定された資格情報は無効な形式です

400:構文エラーは常に400を返すため、これは401でも403でもありません。

  • 指定された資格情報は、存在しないユーザーを参照しています

401:クライアントは有効な資格情報を指定する必要があります。

  • 指定された資格情報無効ですが、有効なユーザーを指定してください(または、指定されたユーザーが必要ない場合はユーザーを指定しないでください)。

401:ここでも、クライアントは有効な資格情報を指定する必要があります。

  • 指定された資格情報有効期限切れています。

401:これは、一般的に無効な資格情報を持つことと実質的に同じであるため、クライアントは有効な資格情報を指定する必要があります。

  • 指定された資格情報は完全に有効ですが、特定のリソースでは不十分ですが、より多くの権限を持つ資格情報が可能である可能性があります。

403:現在の資格情報は既に有効ですが、権限がないため、有効な資格情報を指定してもリソースへのアクセスは許可されません。

  • 資格情報に関係なく、特定のリソースアクセスできません

403:これは資格情報に関係なく、有効な資格情報を指定しても役に立ちません。

  • 指定された資格情報は完全に有効ですが、特定のクライアントはそれらの使用をブロックされています。

403:クライアントがブロックされている場合、新しい資格情報を指定しても何も起こりません。


4

英語で:

401

アクセスが許可されている可能性がありますが、何らかの理由でこのリクエストで拒否されました。不正なパスワードなど?もう一度お試しください。正しいリクエストを送信すると、代わりに成功の応答が返されます。

403

あなたは許可されていません。あなたの名前はリストに載っていません、あなたは入ったり出たりすることはなく、再試行リクエストを送信しないでください、それは常に拒否されます。どこかに行って。


1

問題に関する最新のRFC(7231および7235)を考えると、ユースケースは非常に明確に見えます(斜体を追加):

  • 401は非認証(「有効な認証がない」)の場合です。すなわち、「私はあなたが誰であるかを知らない、または私はあなたがあなたがあなたであると言う人であると信頼していません。」

401無許可

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

要求に認証資格情報が含まれている場合、401応答は、それらの資格情報の承認が拒否されたことを示します。ユーザーエージェントは、新しいまたは置き換えられたAuthorizationヘッダーフィールド(セクション4.2)を使用して要求を繰り返すことができます(MAY)。401応答に前の応答と同じチャレンジが含まれ、ユーザーエージェントが少なくとも1回認証を試みた場合、ユーザーエージェントは通常、関連する診断情報を含むため、囲まれた表現をユーザーに提示する必要があります。

  • 403は不正なものです(「承認を拒否」)。つまり、「私はあなたが誰であるか知っていますが、このリソースにアクセスする権限がありません。」

403禁止します

403(禁止)ステータスコードは、サーバーが要求を理解したが、承認を拒否しことを示します。要求が禁止された理由を公開したいサーバーは、その理由を応答ペイロード(存在する場合)に記述できます。

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

禁止されているターゲットリソースの現在の存在を「非表示」にするオリジンサーバーは、代わりにステータスコード404(Not Found)で応答する場合があります。


2
-1; これらの聖句は、すでに他の回答で引用されています。私はその違いが何であるかは明らかに明らかではないと主張します。2つのコードを「有効な認証がない」と「認証を拒否する」としてまとめていますが、これらの短い説明の1つが適用され、もう1つが同様に解釈されない状況は想像できません。
マークアメリー2018年

ここには多くのRFCをカバーする多くの回答があり、編集されて水を濁して更新されています。何authenticatedが何であるかを説明するリンクを含めauthorized、アプリケーションが明確になるように古いRFCをすべて省略しました。
cjbarth

編集により、2つのコードの解釈が明確になり、他の多くの人々の解釈と一致するようです。しかし、私は個人的に解釈はほとんど意味がないと信じています。403の説明で「認証資格情報が提供された場合という語句の使用は、資格情報が提供されていない場合でも、403が適切であることを意味します。つまり、「非認証」の場合です。一方、401の説明に含まれている「対象リソース」というフレーズの最も自然な解釈は、401は認証されているが許可されていないユーザーに使用できるというものです。
Mark Amery

-6

401対403の場合、これは何度も回答されています。これは本質的に「アプリケーション」の議論ではなく、「HTTPリクエスト環境」の議論です。

自分のログインのロールの問題(アプリケーション)に質問があるようです。

この場合、HTTP認証とログインページ(HTTP認証の設定に関連付けられていない)を使用しない限り、401または403を送信するには、単にログインしていないだけでは不十分です。ファイルへのアプリケーションレベルのアクセスのために(要求されたリソースではなく)自分のログイン画面が表示されている「201 Created」を探しているようです。これは言う:

「聞いたよ、ここにあるが、代わりにこれを試してください(あなたはそれを見ることができません)」


正確には何が作成されていますか?
Grant Gryczan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.