HTTP401エラーとHTTP403エラー–ステータスコードの応答の説明

403(Forbidden)HTTPエラーコードについては以前に詳細に説明しましたが、ほぼ同じ兄弟もあります。

では、401(無許可)と403(禁止)のステータスコードの違いは正確には何ですか?確かにそれらは同じことを意味しますか?よく見てみましょう!

RFC標準

401(無許可)を定義する最新のRFC標準はRFC7235です。

401(Unauthorized)ステータスコードは、ターゲットリソースの有効な認証資格情報がないため、リクエストが適用されなかったことを示します...ユーザーエージェントは、新しいまたは置換されたAuthorizationヘッダーフィールドを使用してリクエストを繰り返すことができます。

一方、403(禁止)はRFC7231で最近定義されています

403(Forbidden)ステータスコードは、サーバーがリクエストを理解したが、それを承認することを拒否したことを示します...リクエストで認証資格情報が提供された場合、サーバーはそれらがアクセスを許可するには不十分であると見なします。

一般的な原因

前の記事で述べたように、ユーザーがログインしたが、要求されたリソースにアクセスするための十分な権限がない場合、403エラーが発生する可能性があります。たとえば、一般ユーザーが「admin」ルートを読み込もうとしている可能性があります。

一方、401エラーが発生する最も明白な時期は、まったくログインしていないか、間違ったパスワードを入力したときです。

これらは、このペアのエラーの2つの最も一般的な原因です。

あまり一般的でない原因

ただし、それほど単純ではない場合もあります。

ログインしたユーザーの資格情報に完全に依存しない制限が原因で、403エラーが発生する可能性があります。

たとえば、サーバーが特定のリソースをロックダウンして、事前定義された範囲のIPアドレスからのアクセスのみを許可したり、ジオブロッキングを利用したりする場合があります。後者は、VPNで回避できる可能性があります。

ユーザーが正しい資格情報を入力した場合でも、401エラーが発生する可能性があります。これはまれであり、独自の認証済みバックエンドを開発しているときにのみ実際に遭遇する可能性があります。ただし、認証ヘッダーの形式が正しくない場合は、401が返されます。

たとえば、リクエストヘッダーに含めるJWT(JSON Web Token)があり、フォーマットが必要な場合がありますAuthorization: Bearer eyJhbGci......yJV_adQssw5c。JWTの前に「Bearer」という単語を忘れると、401エラーが発生します。

Postmanで開発中のAPIをテストし、認証ヘッダーの正しい構文を忘れたときに、この問題に自分で遭遇しました。

それでおしまい

これにより、これらの非常に類似したエラーを取り巻く混乱が解消されることを願っています。

これが役に立ったと感じた場合、またはここで提起されたものに挑戦または拡張したい場合は、Twitter @ JacksonBatesで私に連絡してください。