[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6E3CWMHS640J7APV1E4852Y":3,"skill-same:01M6E3CWMHS640J7APV1E4852Y":70},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":22,"publishedAt":38,"linkOnly":39,"markdownContent":40,"markdownBody":41,"frontMatter":42,"refName":43,"commitSha":44,"skillDirectory":45,"forksCount":13,"repositoryHtmlUrl":46,"repositoryHomepageUrl":47,"ownerHtmlUrl":48,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":49,"install":50,"resources":63},"01M6E3CWMHS640J7APV1E4852Y","springboot-security",null,"Spring Security best practices for authn\u002Fauthz, validation, CSRF, secrets, headers, rate limiting, and dependency security in Java Spring Boot services.","7dvq6yrkgs-stack\u002Fplaywright","7dvq6yrkgs-stack","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F251638143?v=4","01M6E061J2AMGWYZ6TK7Y8NM74","01M6E061PQCQJGQMPBERMCFN5G",0,"Apache-2.0","https:\u002F\u002Fgithub.com\u002F7dvq6yrkgs-stack\u002Fplaywright\u002Fblob\u002Fmain\u002Fskills\u002Fspringboot-security\u002FSKILL.md",[17],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",[23,24,25,26,27,28,29,30,31,32,33,34,35,36,37],"security","springboot security","boot","best practices","validation","security best practices","java","spring boot","services","csrf","secrets","spring","dependency","java spring","rate limiting","2026-11-10 10:12:30",false,"---\nname: springboot-security\ndescription: Spring Security best practices for authn\u002Fauthz, validation, CSRF, secrets, headers, rate limiting, and dependency security in Java Spring Boot services.\n---\n\n# Spring Boot セキュリティレビュー\n\n認証の追加、入力処理、エンドポイント作成、またはシークレット処理時に使用します。\n\n## 認証\n\n- ステートレスJWTまたは失効リスト付き不透明トークンを優先\n- セッションには `httpOnly`、`Secure`、`SameSite=Strict` クッキーを使用\n- `OncePerRequestFilter` またはリソースサーバーでトークンを検証\n\n```java\n@Component\npublic class JwtAuthFilter extends OncePerRequestFilter {\n  private final JwtService jwtService;\n\n  public JwtAuthFilter(JwtService jwtService) {\n    this.jwtService = jwtService;\n  }\n\n  @Override\n  protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,\n      FilterChain chain) throws ServletException, IOException {\n    String header = request.getHeader(HttpHeaders.AUTHORIZATION);\n    if (header != null && header.startsWith(\"Bearer \")) {\n      String token = header.substring(7);\n      Authentication auth = jwtService.authenticate(token);\n      SecurityContextHolder.getContext().setAuthentication(auth);\n    }\n    chain.doFilter(request, response);\n  }\n}\n```\n\n## 認可\n\n- メソッドセキュリティを有効化: `@EnableMethodSecurity`\n- `@PreAuthorize(\"hasRole('ADMIN')\")` または `@PreAuthorize(\"@authz.canEdit(#id)\")` を使用\n- デフォルトで拒否し、必要なスコープのみ公開\n\n## 入力検証\n\n- `@Valid` を使用してコントローラーでBean Validationを使用\n- DTOに制約を適用: `@NotBlank`、`@Email`、`@Size`、カスタムバリデーター\n- レンダリング前にホワイトリストでHTMLをサニタイズ\n\n## SQLインジェクション防止\n\n- Spring Dataリポジトリまたはパラメータ化クエリを使用\n- ネイティブクエリには `:param` バインディングを使用し、文字列を連結しない\n\n## CSRF保護\n\n- ブラウザセッションアプリの場合はCSRFを有効にし、フォーム\u002Fヘッダーにトークンを含める\n- Bearerトークンを使用する純粋なAPIの場合は、CSRFを無効にしてステートレス認証に依存\n\n```java\nhttp\n  .csrf(csrf -> csrf.disable())\n  .sessionManagement(sm -> sm.sessionCreationPolicy(SessionCreationPolicy.STATELESS));\n```\n\n## シークレット管理\n\n- ソースコードにシークレットを含めない。環境変数またはvaultから読み込む\n- `application.yml` を認証情報から解放し、プレースホルダーを使用\n- トークンとDB認証情報を定期的にローテーション\n\n## セキュリティヘッダー\n\n```java\nhttp\n  .headers(headers -> headers\n    .contentSecurityPolicy(csp -> csp\n      .policyDirectives(\"default-src 'self'\"))\n    .frameOptions(HeadersConfigurer.FrameOptionsConfig::sameOrigin)\n    .xssProtection(Customizer.withDefaults())\n    .referrerPolicy(rp -> rp.policy(ReferrerPolicyHeaderWriter.ReferrerPolicy.NO_REFERRER)));\n```\n\n## レート制限\n\n- 高コストなエンドポイントにBucket4jまたはゲートウェイレベルの制限を適用\n- バーストをログに記録してアラートを送信し、リトライヒント付きで429を返す\n\n## 依存関係のセキュリティ\n\n- CIでOWASP Dependency Check \u002F Snykを実行\n- Spring BootとSpring Securityをサポートされているバージョンに保つ\n- 既知のCVEでビルドを失敗させる\n\n## ロギングとPII\n\n- シークレット、トークン、パスワード、完全なPANデータをログに記録しない\n- 機密フィールドを編集し、構造化JSONロギングを使用\n\n## ファイルアップロード\n\n- サイズ、コンテンツタイプ、拡張子を検証\n- Webルート外に保存し、必要に応じてスキャン\n\n## リリース前チェックリスト\n\n- [ ] 認証トークンが正しく検証され、期限切れになっている\n- [ ] すべての機密パスに認可ガードがある\n- [ ] すべての入力が検証およびサニタイズされている\n- [ ] 文字列連結されたSQLがない\n- [ ] アプリケーションタイプに対してCSRF対策が正しい\n- [ ] シークレットが外部化され、コミットされていない\n- [ ] セキュリティヘッダーが設定されている\n- [ ] APIにレート制限がある\n- [ ] 依存関係がスキャンされ、最新である\n- [ ] ログに機密データがない\n\n**注意**: デフォルトで拒否し、入力を検証し、最小権限を適用し、設定によるセキュリティを優先します。\n","# Spring Boot セキュリティレビュー\n\n認証の追加、入力処理、エンドポイント作成、またはシークレット処理時に使用します。\n\n## 認証\n\n- ステートレスJWTまたは失効リスト付き不透明トークンを優先\n- セッションには `httpOnly`、`Secure`、`SameSite=Strict` クッキーを使用\n- `OncePerRequestFilter` またはリソースサーバーでトークンを検証\n\n```java\n@Component\npublic class JwtAuthFilter extends OncePerRequestFilter {\n  private final JwtService jwtService;\n\n  public JwtAuthFilter(JwtService jwtService) {\n    this.jwtService = jwtService;\n  }\n\n  @Override\n  protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,\n      FilterChain chain) throws ServletException, IOException {\n    String header = request.getHeader(HttpHeaders.AUTHORIZATION);\n    if (header != null && header.startsWith(\"Bearer \")) {\n      String token = header.substring(7);\n      Authentication auth = jwtService.authenticate(token);\n      SecurityContextHolder.getContext().setAuthentication(auth);\n    }\n    chain.doFilter(request, response);\n  }\n}\n```\n\n## 認可\n\n- メソッドセキュリティを有効化: `@EnableMethodSecurity`\n- `@PreAuthorize(\"hasRole('ADMIN')\")` または `@PreAuthorize(\"@authz.canEdit(#id)\")` を使用\n- デフォルトで拒否し、必要なスコープのみ公開\n\n## 入力検証\n\n- `@Valid` を使用してコントローラーでBean Validationを使用\n- DTOに制約を適用: `@NotBlank`、`@Email`、`@Size`、カスタムバリデーター\n- レンダリング前にホワイトリストでHTMLをサニタイズ\n\n## SQLインジェクション防止\n\n- Spring Dataリポジトリまたはパラメータ化クエリを使用\n- ネイティブクエリには `:param` バインディングを使用し、文字列を連結しない\n\n## CSRF保護\n\n- ブラウザセッションアプリの場合はCSRFを有効にし、フォーム\u002Fヘッダーにトークンを含める\n- Bearerトークンを使用する純粋なAPIの場合は、CSRFを無効にしてステートレス認証に依存\n\n```java\nhttp\n  .csrf(csrf -> csrf.disable())\n  .sessionManagement(sm -> sm.sessionCreationPolicy(SessionCreationPolicy.STATELESS));\n```\n\n## シークレット管理\n\n- ソースコードにシークレットを含めない。環境変数またはvaultから読み込む\n- `application.yml` を認証情報から解放し、プレースホルダーを使用\n- トークンとDB認証情報を定期的にローテーション\n\n## セキュリティヘッダー\n\n```java\nhttp\n  .headers(headers -> headers\n    .contentSecurityPolicy(csp -> csp\n      .policyDirectives(\"default-src 'self'\"))\n    .frameOptions(HeadersConfigurer.FrameOptionsConfig::sameOrigin)\n    .xssProtection(Customizer.withDefaults())\n    .referrerPolicy(rp -> rp.policy(ReferrerPolicyHeaderWriter.ReferrerPolicy.NO_REFERRER)));\n```\n\n## レート制限\n\n- 高コストなエンドポイントにBucket4jまたはゲートウェイレベルの制限を適用\n- バーストをログに記録してアラートを送信し、リトライヒント付きで429を返す\n\n## 依存関係のセキュリティ\n\n- CIでOWASP Dependency Check \u002F Snykを実行\n- Spring BootとSpring Securityをサポートされているバージョンに保つ\n- 既知のCVEでビルドを失敗させる\n\n## ロギングとPII\n\n- シークレット、トークン、パスワード、完全なPANデータをログに記録しない\n- 機密フィールドを編集し、構造化JSONロギングを使用\n\n## ファイルアップロード\n\n- サイズ、コンテンツタイプ、拡張子を検証\n- Webルート外に保存し、必要に応じてスキャン\n\n## リリース前チェックリスト\n\n- [ ] 認証トークンが正しく検証され、期限切れになっている\n- [ ] すべての機密パスに認可ガードがある\n- [ ] すべての入力が検証およびサニタイズされている\n- [ ] 文字列連結されたSQLがない\n- [ ] アプリケーションタイプに対してCSRF対策が正しい\n- [ ] シークレットが外部化され、コミットされていない\n- [ ] セキュリティヘッダーが設定されている\n- [ ] APIにレート制限がある\n- [ ] 依存関係がスキャンされ、最新である\n- [ ] ログに機密データがない\n\n**注意**: デフォルトで拒否し、入力を検証し、最小権限を適用し、設定によるセキュリティを優先します。\n",{"name":5,"description":7},"main","a2e3284ed4488780397ee2f78217366e11470dfb","skills\u002Fspringboot-security","https:\u002F\u002Fgithub.com\u002F7dvq6yrkgs-stack\u002Fplaywright","https:\u002F\u002Fplaywright.dev","https:\u002F\u002Fgithub.com\u002F7dvq6yrkgs-stack","2026-04-25 06:04:45",{"source":8,"skillName":5,"commands":51,"prompt":61,"zipAvailable":62},[52,55,58],{"tool":53,"command":54},"npx","npx skills add 7dvq6yrkgs-stack\u002Fplaywright --skill springboot-security",{"tool":56,"command":57},"bunx","bunx skills add 7dvq6yrkgs-stack\u002Fplaywright --skill springboot-security",{"tool":59,"command":60},"pnpm","pnpm dlx skills add 7dvq6yrkgs-stack\u002Fplaywright --skill springboot-security","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002F7dvq6yrkgs-stack\u002Fplaywright\u002Fblob\u002Fmain\u002Fskills\u002Fspringboot-security\u002FSKILL.md",true,[64],{"path":65,"resourceType":66,"resourceTypeDesc":67,"sizeBytes":68,"sourceHtmlUrl":69},".skillfish.json","REFERENCE","参考文档",256,"https:\u002F\u002Fgithub.com\u002F7dvq6yrkgs-stack\u002Fplaywright\u002Fblob\u002Fmain\u002Fskills\u002Fspringboot-security\u002F.skillfish.json",[71,101,111,121,136,151],{"skillNo":72,"name":73,"nameZh":6,"description":74,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":75,"categories":76,"keywords":89,"publishedAt":38},"01M6E3XK4PRPMQHM7Y98FQPTY1","zyte-api-automation","Automate Zyte API tasks via Rube MCP (Composio). Always search tools first for current schemas.","https:\u002F\u002Fgithub.com\u002F7dvq6yrkgs-stack\u002Fplaywright\u002Fblob\u002Fmain\u002Fskills\u002Fzyte-api-automation\u002FSKILL.md",[77,78,81,84],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":79,"categoryName":80,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000010","后端与接口",{"categoryNo":82,"categoryName":83,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":85,"categoryName":86,"taxonomyType":87,"taxonomyTypeDesc":88},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[90,91,92,93,94,95,96,97,98,99,100],"zyte api automation","api","automation","MCP","tasks","search","Tools","first","automate","composio","via",{"skillNo":102,"name":103,"nameZh":6,"description":104,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":105,"categories":106,"keywords":109,"publishedAt":38},"01M6E3XFX6QSTR1QR59NFXJTMA","zylvie-automation","Automate Zylvie tasks via Rube MCP (Composio). Always search tools first for current schemas.","https:\u002F\u002Fgithub.com\u002F7dvq6yrkgs-stack\u002Fplaywright\u002Fblob\u002Fmain\u002Fskills\u002Fzylvie-automation\u002FSKILL.md",[107,108],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":82,"categoryName":83,"taxonomyType":20,"taxonomyTypeDesc":21},[110,92,98,93,94,95,96,97,99,100],"zylvie automation",{"skillNo":112,"name":113,"nameZh":6,"description":114,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":115,"categories":116,"keywords":119,"publishedAt":38},"01M6E3XCX2GDYYCHN58ZJHT37M","zoominfo-automation","Automate Zoominfo tasks via Rube MCP (Composio). Always search tools first for current schemas.","https:\u002F\u002Fgithub.com\u002F7dvq6yrkgs-stack\u002Fplaywright\u002Fblob\u002Fmain\u002Fskills\u002Fzoominfo-automation\u002FSKILL.md",[117,118],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":82,"categoryName":83,"taxonomyType":20,"taxonomyTypeDesc":21},[120,92,95,96,97,98,99,100,94,93],"zoominfo automation",{"skillNo":122,"name":123,"nameZh":6,"description":124,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":125,"categories":126,"keywords":129,"publishedAt":38},"01M6E3X9WJ2T73216WQHHTB9BD","zoho_mail-automation","Automate Zoho Mail tasks via Rube MCP (Composio): email sending, folders, labels, and mailbox management. Always search tools first for current schemas.","https:\u002F\u002Fgithub.com\u002F7dvq6yrkgs-stack\u002Fplaywright\u002Fblob\u002Fmain\u002Fskills\u002Fzoho_mail-automation\u002FSKILL.md",[127,128],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":82,"categoryName":83,"taxonomyType":20,"taxonomyTypeDesc":21},[130,131,132,92,93,94,95,133,96,97,98,134,99,135,100],"mail","zoho mail automation","zoho","email","management","mailbox",{"skillNo":137,"name":138,"nameZh":6,"description":139,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":140,"categories":141,"keywords":147,"publishedAt":38},"01M6E3X719W648XZBW1EC6JQ64","zoho_invoice-automation","Automate Zoho Invoice tasks via Rube MCP (Composio): invoices, estimates, expenses, clients, and payment tracking. Always search tools first for current schemas.","https:\u002F\u002Fgithub.com\u002F7dvq6yrkgs-stack\u002Fplaywright\u002Fblob\u002Fmain\u002Fskills\u002Fzoho_invoice-automation\u002FSKILL.md",[142,143,144],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":82,"categoryName":83,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":145,"categoryName":146,"taxonomyType":87,"taxonomyTypeDesc":88},"01JBSEEDCAT000000000000040","财务",[148,132,92,94,95,96,97,98,149,150,99,100,93],"zoho invoice automation","tracking","payment",{"skillNo":152,"name":153,"nameZh":6,"description":154,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":155,"categories":156,"keywords":159,"publishedAt":38},"01M6E3X28JYTC3QTK32AQF7BYB","zoho_inventory-automation","Automate Zoho Inventory tasks via Rube MCP (Composio): items, orders, warehouses, shipments, and stock management. Always search tools first for current schemas.","https:\u002F\u002Fgithub.com\u002F7dvq6yrkgs-stack\u002Fplaywright\u002Fblob\u002Fmain\u002Fskills\u002Fzoho_inventory-automation\u002FSKILL.md",[157,158],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":82,"categoryName":83,"taxonomyType":20,"taxonomyTypeDesc":21},[92,160,132,161,97,98,96,95,94,93,99,100,162,163,134],"inventory","zoho inventory automation","stock","orders"]