本ドキュメントでは、SummaryWriterAppのセキュリティ機能と設定方法について説明します。
すべてのAPI エンドポイント(/api/text、/api/history、/api/statsなど)とWebSocket接続には認証が必要です。
使用方法:
# HTTPリクエストの例
curl -H "X-API-Key: your-api-key" http://localhost:8080/api/text
# WebSocket接続の例(JavaScriptクライアント)
const ws = new WebSocket('ws://localhost:8080/textHub');
ws.onopen = function() {
// 接続後、最初のメッセージで認証
};JWT(JSON Web Token)ベースの認証も実装されており、より高度なセキュリティが必要な場合に使用できます。
トークン生成例:
import security.JWTService
import config.SecurityConfig
val config = SecurityConfig.fromEnvironment()
val token = JWTService.generateToken(config, "username")異なるドメインからのアクセスを制御します。
デフォルト設定:
- 許可されたホスト:
localhost:3000,localhost:8080,127.0.0.1:3000,127.0.0.1:8080 - 許可されたメソッド: GET, POST, PUT, DELETE, PATCH, OPTIONS
- 許可されたヘッダー: Authorization, Content-Type, X-API-Key
カスタマイズ方法:
環境変数 ALLOWED_HOSTS でカンマ区切りのホストリストを指定:
export ALLOWED_HOSTS="myapp.com,api.myapp.com"DDoS攻撃や過度なリクエストを防ぐため、レート制限を実装しています。
制限:
- グローバル: 100リクエスト/分
- API エンドポイント: 30リクエスト/分
- WebSocket接続: 10接続/分
- マスキング有効化:
masking = trueでデータを保護 - フレームサイズ制限: 最大1MB(DoS攻撃防止)
- タイムアウト: 15秒のping/pongタイムアウト
- 内部エラーの詳細をクライアントに公開しない
- すべての例外をログに記録(サーバーサイド)
- ユーザーフレンドリーなエラーメッセージを返却
セキュリティ設定は環境変数で上書き可能です:
# サーバー設定
export PORT=8080
export HOST="0.0.0.0"
# JWT設定
export JWT_SECRET="your-super-secret-key-change-in-production"
export JWT_ISSUER="your-app-name"
export JWT_AUDIENCE="your-audience"
# API Key
export API_KEY="your-secure-api-key"
# CORS
export ALLOWED_HOSTS="localhost:3000,myapp.com"src/main/resources/application.conf でデフォルト値を設定できます:
ktor {
deployment {
port = 8080
port = ${?PORT}
host = "0.0.0.0"
host = ${?HOST}
}
}
security {
jwt {
secret = "change-this-secret-in-production"
secret = ${?JWT_SECRET}
issuer = "summary-writer-app"
audience = "summary-writer-audience"
realm = "SummaryWriterApp"
}
apiKey = "default-api-key-change-me"
apiKey = ${?API_KEY}
}-
強力なAPIキーを使用
# 強力なランダムキーを生成 openssl rand -base64 32 -
JWT秘密鍵を変更
- デフォルトの秘密鍵は絶対に使用しない
- 最低256ビット(32文字以上)の秘密鍵を使用
-
HTTPSを使用
- リバースプロキシ(Nginx、Apache)でHTTPSを設定
- すべてのHTTPトラフィックをHTTPSにリダイレクト
-
許可するホストを制限
export ALLOWED_HOSTS="yourdomain.com"
-
定期的なセキュリティ監査
- 依存関係の脆弱性スキャン
- ログの監視
- 不正アクセスの検出
- デフォルトのAPIキーは開発専用です
- 本番環境のAPIキーをコミットしない
.envファイルを.gitignoreに追加
セキュリティ機能のテストを実行:
./gradlew test --tests SecurityConfigTest --tests SecurityTestセキュリティ上の問題を発見した場合は、GitHubのIssueではなく、プロジェクトメンテナーに直接連絡してください。