Everything-claude-code springboot-security
Spring Security best practices for authn/authz, validation, CSRF, secrets, headers, rate limiting, and dependency security in Java Spring Boot services.
install
source · Clone the upstream repo
git clone https://github.com/affaan-m/everything-claude-code
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/affaan-m/everything-claude-code "$T" && mkdir -p ~/.claude/skills && cp -r "$T/docs/ja-JP/skills/springboot-security" ~/.claude/skills/affaan-m-everything-claude-code-springboot-security && rm -rf "$T"
manifest:
docs/ja-JP/skills/springboot-security/SKILL.mdsource content
Spring Boot セキュリティレビュー
認証の追加、入力処理、エンドポイント作成、またはシークレット処理時に使用します。
認証
- ステートレスJWTまたは失効リスト付き不透明トークンを優先
- セッションには
、httpOnly
、Secure
クッキーを使用SameSite=Strict
またはリソースサーバーでトークンを検証OncePerRequestFilter
@Component public class JwtAuthFilter extends OncePerRequestFilter { private final JwtService jwtService; public JwtAuthFilter(JwtService jwtService) { this.jwtService = jwtService; } @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException { String header = request.getHeader(HttpHeaders.AUTHORIZATION); if (header != null && header.startsWith("Bearer ")) { String token = header.substring(7); Authentication auth = jwtService.authenticate(token); SecurityContextHolder.getContext().setAuthentication(auth); } chain.doFilter(request, response); } }
認可
- メソッドセキュリティを有効化:
@EnableMethodSecurity
または@PreAuthorize("hasRole('ADMIN')")
を使用@PreAuthorize("@authz.canEdit(#id)")- デフォルトで拒否し、必要なスコープのみ公開
入力検証
を使用してコントローラーでBean Validationを使用@Valid- DTOに制約を適用:
、@NotBlank
、@Email
、カスタムバリデーター@Size - レンダリング前にホワイトリストでHTMLをサニタイズ
SQLインジェクション防止
- Spring Dataリポジトリまたはパラメータ化クエリを使用
- ネイティブクエリには
バインディングを使用し、文字列を連結しない:param
CSRF保護
- ブラウザセッションアプリの場合はCSRFを有効にし、フォーム/ヘッダーにトークンを含める
- Bearerトークンを使用する純粋なAPIの場合は、CSRFを無効にしてステートレス認証に依存
http .csrf(csrf -> csrf.disable()) .sessionManagement(sm -> sm.sessionCreationPolicy(SessionCreationPolicy.STATELESS));
シークレット管理
- ソースコードにシークレットを含めない。環境変数またはvaultから読み込む
を認証情報から解放し、プレースホルダーを使用application.yml- トークンとDB認証情報を定期的にローテーション
セキュリティヘッダー
http .headers(headers -> headers .contentSecurityPolicy(csp -> csp .policyDirectives("default-src 'self'")) .frameOptions(HeadersConfigurer.FrameOptionsConfig::sameOrigin) .xssProtection(Customizer.withDefaults()) .referrerPolicy(rp -> rp.policy(ReferrerPolicyHeaderWriter.ReferrerPolicy.NO_REFERRER)));
レート制限
- 高コストなエンドポイントにBucket4jまたはゲートウェイレベルの制限を適用
- バーストをログに記録してアラートを送信し、リトライヒント付きで429を返す
依存関係のセキュリティ
- CIでOWASP Dependency Check / Snykを実行
- Spring BootとSpring Securityをサポートされているバージョンに保つ
- 既知のCVEでビルドを失敗させる
ロギングとPII
- シークレット、トークン、パスワード、完全なPANデータをログに記録しない
- 機密フィールドを編集し、構造化JSONロギングを使用
ファイルアップロード
- サイズ、コンテンツタイプ、拡張子を検証
- Webルート外に保存し、必要に応じてスキャン
リリース前チェックリスト
- 認証トークンが正しく検証され、期限切れになっている
- すべての機密パスに認可ガードがある
- すべての入力が検証およびサニタイズされている
- 文字列連結されたSQLがない
- アプリケーションタイプに対してCSRF対策が正しい
- シークレットが外部化され、コミットされていない
- セキュリティヘッダーが設定されている
- APIにレート制限がある
- 依存関係がスキャンされ、最新である
- ログに機密データがない
注意: デフォルトで拒否し、入力を検証し、最小権限を適用し、設定によるセキュリティを優先します。