0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Java 21】APIレスポンスの「標準化」と「多層防御」を1行で実現するライブラリ「SasatoResLib」

0
Last updated at Posted at 2026-02-16

概要

Spring BootなどのAPI開発において、一貫したレスポンス形式の提供はフロントエンドとの連携に不可欠です。しかし、例外発生時のスタックトレース露出や、リクエスト詳細に含まれる機密情報の漏洩は、常にセキュリティリスクとなります。

SasatoResLib は、「開発の利便性」と「防御的設計」を両立するために開発したライブラリです。

主な機能

1. 自動セキュリティマスキング

本番環境での情報露出を最小限に抑えます。 debugMode(デフォルトは false)の設定により、例外発生時の挙動が自動で切り替わります。

  • false: スタックトレースを隠蔽し、安全なエラーメッセージを返却。
  • true: 開発効率向上のため、詳細なエラー情報を露出。

2. 機密情報の自動サニタイズ(黒塗り)

password, token, secret, apiKey などの機密情報が含まれる文字列を正規表現で検知し、自動的に ******** へ置換します。

3. 拡張性(Override対応)

SENSITIVE_PATTERN は外部から setSensitivePattern メソッドを通じてカスタマイズ可能です。プロジェクト固有の機密情報(口座番号、ID体系など)に合わせた柔軟な防護が可能です。

4. 標準化されたレスポンス構造

すべてのレスポンスに以下のメタ情報を自動付与します。

  • requestId (UUID): ログとの突合を容易にする追跡用ID。
  • processingTimeMs: APIのパフォーマンス計測用。

導入方法

GitHubの Releases から最新の SasatoRes-1.0.0.jar(または最新版)をダウンロードし、プロジェクトの libs フォルダに追加してください。

build.gradle の設定例:

dependencies {
    // libsフォルダ内のjarを読み込む
    implementation fileTree(dir: 'libs', include: ['*.jar'])
}

使い方

基本の成功レスポンス

// シンプルなデータ返却
return SasatoRes.success(data);

// ページネーション情報の付与
return SasatoRes.success(users, total, limit, offset);

エラーレスポンス(サニタイズ実行)

try {
    // 処理
} catch (Exception e) {
    // requestDetailsにパスワードが含まれていても、自動でマスクされます
    return SasatoRes.error("ERR_001", "認証失敗", e, "password=secret123");
}

技術スタックと品質保証

  • Language: Java 21 (LTS)
  • Build Tool: Gradle 8.5
  • Quality: JUnit 5 による単体テスト完備。サニタイズロジックおよびデバッグモード切り替えの正常動作を検証済み。

改良予定

さらに拡張性を上げるために、独自のPaginationInfoクラス、Errorクラスを渡せるようにしたいです。


リンク

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?