401と403:拒否するリクエストに正しいステータスを選ぶ

401と403の違い

401と403:UnauthorizedかForbiddenか、どちらを返すべきか | We.Inc

401は認証されていないこと、403は認証済みだが許可されていないことを意味します。リクエストについて4つの質問に答えると、正しいステータスとヘッダー、コードがわかります。

トークンがない、セッションが期限切れ、署名が不正など、リクエストに有効な認証情報がない場合は401 Unauthorizedを返します。ログインすれば解決する可能性があり、レスポンスにはWWW-Authenticateヘッダーが必須です。呼び出し元が誰かわかっていて、それでもその操作が許されない場合は403 Forbiddenを返します。再ログインしても何も変わりません。

UnauthorizedとForbiddenの違い

サーバーが拒否しているリクエストについて、4つの質問に答えてください。返すべきステータス、それに付けるヘッダー、コードコメントに書ける1行の理由が表示されます。リソースの存在自体を明かしたくない場合にも対応しています。

よくある質問

401と403の主な違いは何ですか?

401は、サーバーがあなたを誰か知らない、または送った証明を受け入れなかったことを示します。403は、誰かはわかっているが、それでも答えはノーであることを示します。

401にはWWW-Authenticateヘッダーが必須ですか?

はい。RFC 9110によると、401レスポンスを生成するサーバーは、トークンAPIならBearerのようなチャレンジを含むWWW-Authenticateヘッダーフィールドを少なくとも1つ送らなければなりません。

期限切れのトークンには401と403のどちらを返すべきですか?

401です。認証情報はもう有効ではなく、新しいものなら解決します。Bearerチャレンジでerror="invalid_token"を付けてそれを伝えられます。

403の代わりに404を返してもよいですか?

はい。仕様では、リソースが存在するかどうかを隠すために、403の代わりに404を送ることが認められています。他のユーザーに属するIDではよく使われる選択です。

403はIPアドレスがブロックされたという意味ですか?

その可能性はあります。サーバーは、IPルール、ファイル権限の不足、ファイアウォールのルール、ロールのチェック失敗など、そのリクエストに対して最終的と判断したあらゆる拒否で403を送ります。どれかは、たいていレスポンス本文かサーバーログに書かれています。

2つの異なる問い

仕様が補足していること

コードでのチェック

Expressのミドルウェア:先に401、次に403

verifyTokenは、自分のセッションやJWTのチェックの代わりです。順序が重要で、まず認証、次に認可です。

フロントエンド:それぞれに異なる対応をする

一方の処理はユーザーをログインへ案内し、もう一方は拒否の理由を説明します。

どのステータスを返すべき?

はい

いいえ

リクエストに認証情報(セッションCookie、トークン、Authorizationヘッダー)が含まれていましたか?

その認証情報は有効で、期限切れではありませんでしたか?

この呼び出し元は、このリソースに対してこの操作を行うことが許可されていますか?

アクセス権のない呼び出し元に、リソースの存在を知られないようにすべきですか?

返すもの

誰もログインしていません。チャレンジを付けて認証情報を求めましょう。

認証情報は届きましたが、拒否されました。新しいものなら解決します。

呼び出し元はわかっていますが、権限がありません。再ログインしても解決しません。

呼び出し元には権限がなく、リソースの存在を明かさないほうが望ましい状況です。

認証済みで、許可もあります。リクエストを処理しましょう。

前の回答ですでにステータスが決まったため、質問していません。

無料で始める · クレジットカード不要

関連: ガイド|Webマーケティングと集客を学ぶ

製品

ご利用いただける方

機能

リソース

会社情報

サイトマップを見る