HTTPQUERY
日本語

403 Forbidden

使い方

403 Forbidden エラーが届いたとき、クライアントにはそのリソースへアクセスするための十分な権限がありません。これは、リクエストが許可されていないことをクライアントに伝える一般的でよくあるエラーです。クライアントが再認証してリクエストを再送信してもエラーが続くという点で、このステータスは 401 Unauthorized とは異なります。より具体的な 405 Method Not Allowed ステータスは、リソースは利用可能であるものの、その特定の HTTP メソッドが許可されていないことを示します。

セキュリティ上の判断としての 403 と 404

サーバーは、リソースが存在するという事実を隠すために意図的に 403 ではなく 404 を返します。403 で応答するとリソースが存在するもののアクセスが制限されていることを確認させてしまい、機微なパスにとっては望ましくありません。403 と 404 のどちらを選ぶかは、意図的なセキュリティ設計上の判断です。

SEO への影響

Google のような検索エンジンは、403 ステータスを返す URL をインデックスしません。以前にインデックスされていた URL がこのステータスコードを返すようになると、検索結果から削除されます。このコードを返すページはクロールバジェットを消費しません。Googlebot の速度を落とすために 403 を使わないでください。クロール頻度を低下させるのは 429 だけです。

例

クライアントが保護されたリソースを要求し、サーバーはクライアントにアクセス権がないことを示すために 403 Forbidden で応答します。レスポンスボディはその制限を説明します。

リクエスト

GET /tech-news/confidential.pdf HTTP/1.1
Host: example.com

レスポンス

HTTP/1.1 403 Forbidden
Content-Type: text/html
Content-Length: 154

<html>
  <head>
    <title>Access Denied</title>
  </head>
  <body>
    <p>Permission to access this resource is
    restricted.</p>
  </body>
</html>

対処方法

403 Forbidden は、サーバーがリクエストを理解したうえで、その操作を認可することを拒否していることを意味します。

サーバー上のファイルとディレクトリの権限を検証します。Linux では、ls -la で所有者と権限ビットを確認します。Web サーバーのプロセス(通常は www-data または nginx として実行)には、要求されたファイルへの読み取りアクセスが必要です。標準的な権限は、ディレクトリが 755、ファイルが 644 です。再帰的に修正します。

find /var/www/html -type d -exec chmod 755 {} \;
find /var/www/html -type f -exec chmod 644 {} \;
chown -R www-data:www-data /var/www/html

nginx はさらに、/ から配信対象のファイルに至るパス上のすべての親ディレクトリに実行権限を必要とします。

.htaccess やサーバー設定に拒否ルールがないか確認します。Apache の Require ディレクティブ、nginx の deny ルール、または類似のアクセス制御が特定のパスや IP 範囲をブロックします。Apache では、.htaccess や ブロック内の Require all denied や Deny from all を探します。nginx では、location ブロック内の deny all; を探します。該当する設定ファイルを確認し、具体的な拒否理由をエラーログで調べます。

リクエスト元の IP がブロックされていないことを確認します。ファイアウォール、Web アプリケーションファイアウォール(WAF)、地域ブロックのルールが、制限されたアドレスからのリクエストを拒否します。サーバーのアクセスログで拒否のエントリを確認します。Cloudflare、AWS WAF、mod_security はいずれも、ルールが発動すると 403 レスポンスを生成します。WAF のダッシュボードや監査ログを確認して、ブロックしているルールを特定します。

認証済みのユーザーが必要なロールやスコープを持っていることを確認します。有効な認証があっても、アカウントには正しい権限レベルが必要です。アプリケーションのアクセス制御システムでロールの割り当てを検証します。API エンドポイントは、トークンに必要な OAuth スコープがない場合にしばしば 403 を返します。

フォルダーを要求する場合はディレクトリインデックスの設定を確認します。デフォルトのインデックスファイル(例:index.html)がないディレクトリを要求すると、ディレクトリ一覧表示が無効な場合に 403 が返ります。インデックスファイルを追加するか、一覧表示を有効にします。nginx では次のようにします。

location /files/ {
    autoindex on;
}

Apache では、ディレクトリの設定に Options +Indexes を追加します。本番サーバーでディレクトリ一覧表示を有効にすることはセキュリティリスクを伴います。

SELinux や AppArmor のポリシーを確認します。RHEL/CentOS 系のシステムでは、Unix の権限が読み取りを許可していても、SELinux が想定外のパスにあるファイルへの Web サーバーのアクセスを拒否します。sestatus を実行して SELinux のモードを確認し、/var/log/audit/audit.log で拒否のエントリを調べます。restorecon -Rv /var/www/html でファイルを再ラベル付けするか、chcon で正しいコンテキストを設定します。

SSL/TLS のクライアント証明書の要件を調べます。相互 TLS 用に設定されたサーバーは、クライアントが有効な証明書を提示しない場合に 403 を返します。nginx の ssl_verify_client ディレクティブ、または Apache の SSLVerifyClient ディレクティブを確認します。

コードリファレンス

.NET

HttpStatusCode.Forbidden

Rust

http::StatusCode::FORBIDDEN

Rails

:forbidden

Go

http.StatusForbidden

Symfony

Response::HTTP_FORBIDDEN

Python3.5+

http.HTTPStatus.FORBIDDEN

Java

java.net.HttpURLConnection.HTTP_FORBIDDEN

Apache HttpComponents Core

org.apache.hc.core5.http.HttpStatus.SC_FORBIDDEN

Angular

@angular/common/http/HttpStatusCode.Forbidden