| この記事の要点 |
|---|
|
エラーの状況
# Tomcat 標準 403 ページ
HTTP Status 403 - 要求されたリソースへのアクセスが拒否されました
# 英語版
HTTP Status 403 - Access to the requested resource has been denied
# Manager App のリモートアクセス
403 Access Denied
You are not authorized to view this page.
主な原因と対処
原因 1: directory listing 無効
Tomcat のデフォルトでは、ディレクトリ一覧表示が無効です:
# webapps/myapp/static/ にアクセス (index.html がない)
http://localhost:8080/myapp/static/
# → 403
# 対処 1: index.html / index.jsp を配置
echo "<h1>Static</h1>" > webapps/myapp/static/index.html
# 対処 2: directory listing を有効化 (開発用、本番非推奨)
# conf/web.xml の DefaultServlet 設定
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>listings</param-name>
<param-value>true</param-value> <!-- ← true に変更 -->
</init-param>
</servlet>
原因 2: web.xml の security-constraint
<!-- WEB-INF/web.xml に認証必須設定 -->
<security-constraint>
<web-resource-collection>
<web-resource-name>Protected</web-resource-name>
<url-pattern>/admin/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>admin</role-name>
</auth-constraint>
</security-constraint>
# 対処
# - 該当ロールでログイン
# - URL パターンを再確認
# - 不要なら制約を削除
原因 3: ファイル / フォルダの OS 権限
# Linux で webapps の所有者
$ ls -la /opt/tomcat/webapps/myapp
drwxr-x--- 5 root root 4096 May 15 12:00 .
# → tomcat ユーザが読めない
# 対処
$ sudo chown -R tomcat:tomcat /opt/tomcat/webapps/myapp
$ sudo chmod -R 755 /opt/tomcat/webapps/myapp
原因 4: Manager App / Host Manager の IP 制限
# webapps/manager/META-INF/context.xml
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
# → 127.x.x.x と ::1 (localhost) からのみ許可
# リモートからは 403
# 対処 1: 許可 IP を追加 (社内 IP 等)
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1|192\.168\.1\.\d+" />
# 対処 2: SSH トンネル経由でアクセス
$ ssh -L 8080:localhost:8080 user@tomcat-server
# ローカルから http://localhost:8080/manager/html
原因 5: 認証情報なしで認証必須リソース
# Manager App は basic 認証
# tomcat-users.xml にユーザ登録が必要
# conf/tomcat-users.xml
<role rolename="manager-gui"/>
<user username="admin"
password="secret"
roles="manager-gui"/>
# Tomcat 再起動 → ブラウザで認証ダイアログ → 入力
原因 6: HTTPS リダイレクトミス
<!-- HTTPS 強制 (HSTS 設定等) -->
<security-constraint>
<web-resource-collection>
<web-resource-name>HTTPS Only</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
# HTTP でアクセスすると HTTPS にリダイレクト
# HTTPS が設定されていないと 403
調査の流れ
- URL を確認: ディレクトリ or ファイル?
- Tomcat ログ確認:
logs/localhost_access_log.YYYY-MM-DD.txt - web.xml 確認: security-constraint があるか
- OS 権限確認:
ls -la - context.xml 確認: RemoteAddrValve の制限
- 認証必要か: 401 と区別
403 vs 401 の違い
| コード | 意味 | 例 |
|---|---|---|
| 401 Unauthorized | 未認証 (認証必要) | ログインしていない |
| 403 Forbidden | 認証済だが権限なし | 一般ユーザが管理画面 |
Spring Security での 403
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/admin/**").hasRole("ADMIN")
.requestMatchers("/api/**").authenticated()
.anyRequest().permitAll()
)
.exceptionHandling(ex -> ex
.accessDeniedHandler((request, response, accessDeniedException) -> {
response.setStatus(403);
response.getWriter().write("Access Denied: " + accessDeniedException.getMessage());
})
);
return http.build();
}
}
// アクセス拒否ページ
@Controller
public class ErrorController {
@GetMapping("/access-denied")
public String accessDenied() {
return "errors/403";
}
}
nginx の 403
# nginx が返す 403
# - location ブロックで deny
# - root ディレクトリの権限不足
# - directory listing 無効でディレクトリアクセス
# 対処
location / {
autoindex on; # ディレクトリ一覧
}
location /admin {
allow 192.168.1.0/24;
deny all;
}
# 権限
$ sudo chown -R www-data:www-data /var/www/html
$ sudo chmod -R 755 /var/www/html
関連エラー
401 Unauthorized: 認証必要403 Forbidden: このページ (認証済だが権限なし)404 Not Found: リソース未存在405 Method Not Allowed: HTTP メソッド不一致
関連記事
子ページ
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスのソフト一覧|Blender・Metasequoiaと用途別の選び方
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- Visual Studio「デザイナーを表示できません」エラーの原因と対処 2026-10-28 12:06:00
- SSH 認証に失敗しました。再試行してください の対処 2026-10-28 12:06:00
- SSH2 秘密鍵の読み込みに失敗しました の原因と対処 2026-10-28 12:06:00
- TeraTerm のよくあるエラーと対処法完全ガイド — Connection refused / 2026-10-28 12:06:00
- Visual Studio エラー一覧|コンパイルエラー・警告の確認方法と対処 2026-10-28 11:39:57
- Whitelabel Error Page の原因と消し方|Spring Boot のエラーページ 2026-10-28 11:39:57
- Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法 2026-10-28 11:39:57
- SQL WHERE 句完全ガイド 2026-10-28 11:39:57
- SQL JOIN 完全ガイド (INNER/LEFT/RIGHT/FULL OUTER) 2026-10-28 11:39:57
- tomcat の起動 / 停止ログと catalina.log・catalina.out の違い 2026-10-28 10:24:23
- Tomcat の起動確認方法 5 つ|localhost:8080・ポート・プロセス・ログ 2026-10-28 10:24:23
- Oracle 19c COMMITの使い方: 暗黙コミット・自動確定・応答不明時の確認 2026-10-28 09:59:09
- Oracle 19c DELETE文|削除対象の確認・COMMIT前の判断・ROLLBACKの条件 2026-10-28 09:59:09
- Oracle 19c INSERT文|INSERT ALL・SELECT・RETURNINGとMERGEの使い分け 2026-10-28 09:59:09
- Oracle 19cのトランザクション制御|COMMIT・ROLLBACK・分離レベルと接続設定 2026-10-28 09:59:09