📝 概要(Summary)
プリサインド URL(Pre-Signed URL)は、S3 の私有(private)オブジェクトに対して、一時的にアクセス権を付与するための特別な URL です。通常、private の S3 オブジェクトは外部から直接アクセスできませんが、Pre-Signed URL を使うことで 署名付きの一時的な「公開 URL」 を発行でき、特定のユーザーが期間限定でオブジェクトを取得・アップロードできます。
💡 なぜプリサインドURLが必要なのか?
✔ セキュリティと利便性の両立
- S3 バケットやオブジェクトを public にすると誰でもアクセス可能 になるため、セキュリティ上のリスクがあります。
- しかし、Webアプリや管理画面では 画像・資料など S3 のファイルを表示したい というケースが多い。
- このギャップを埋めるのが「プリサインドURL」。
プリサインド URL を使用すると:
- S3 バケットは 完全 private のまま 保つことができる
- 必要なユーザーだけに 一時的アクセス権 を配布できる
- URL は期限が切れると無効になる
つまり、安全にファイルを公開したい内部システムに最適 です。
🔒 プリサインドURLのポイント
🎯 1. 有効期限がある
例:5分、10分、1時間など。 有効期限が切れると、URL を持っていてもアクセス不可。
🎯 2. バケットやオブジェクトは private のまま
バケットの設定(Block Public Access)は ON のままでよい。 アクセス制御を破らず、AWS のベストプラクティスに完全準拠。
🎯 3. サーバー側で生成する
原則としてプリサインドURLは バックエンドで生成して、フロントに返す。 セキュリティ的に AccessKey をフロントに渡さないため。
🎯 4. GET と PUT が作れる
- GET:ファイルをダウンロード/表示するための URL
- PUT:フロントから直接 S3 にアップロードできる URL
🧩 プリサインドURLの典型的なユースケース
🖼 1. 管理画面に画像を表示したい(あなたのケース)
private なまま画像を
<img src="...">で表示したい
→ GET のプリサインドURLを生成して返せばOK。
📄 2. ダウンロードリンクを安全に提供したい
ユーザーへの資料、請求書など。
📤 3. フロントから S3 に直接アップロードしたい
サーバーを経由しない高速アップロードが可能。
🔧 プリサインドURLを生成する流れ(SDK v2)
① サーバー側で presigner を作成
S3Presigner presigner = S3Presigner.builder()
.region(Region.of(region))
.credentialsProvider(StaticCredentialsProvider.create(
AwsBasicCredentials.create(accessKey, secretKey)
))
.build();
② GET 用のプリサインドURL生成
GetObjectRequest getObjectRequest = GetObjectRequest.builder()
.bucket(bucketName)
.key(path)
.build();
GetObjectPresignRequest presignRequest = GetObjectPresignRequest.builder()
.signatureDuration(Duration.ofMinutes(10))
.getObjectRequest(getObjectRequest)
.build();
PresignedGetObjectRequest presigned = presigner.presignGetObject(presignRequest);
String url = presigned.url().toString();
③ これを API のレスポンスとしてフロントへ返す
{
"url": "https://s3.ap-northeast-1.amazonaws.com/..."
}
🎨 フロント側(React / Vue / 静的ページ等)
<img src="{プリサインドURL}" />
特別な認証は不要。期限内であれば表示できる。 期限切れなら 403 Forbidden になるため安全。
🔐 プリサインドURLのセキュリティ性
✔ URL を知っていても期限が切れれば無効
✔ 署名付きのため改ざん不可能
✔ バケットは完全 private のまま
✔ AWS が推奨する方式
⚠ 注意点
- URL をコピーした人は期限内ならアクセスできる(内部用途なら問題なし)
- 極端に長い有効期限の設定は避ける(一般的には 5分〜60分)
🔥 なぜあなたのケースにはプリサインドURLが最適か?
あなたの用途:
- 内部管理システム
-
ユーザーがブラウザで画像を見たい(
<img>で表示) - でも S3 を public にしたくない
- そして 将来 private モード(Scheme B)に切り替える可能性がある
→ 結論:プリサインドURLは将来的な拡張性、安全性、現場運用の柔軟性すべてに適合。
✨ メリットまとめ
| 項目 | プリサインドURL | 公開バケット(Policy) |
|---|---|---|
| セキュリティ | ⭐ 最高 | ❌ 低い(全公開) |
| 将来の切替容易さ | ⭐ 一瞬で PRIVATE に戻せる | ❌ 歴史ファイルがすべて public |
| AWS推奨 | ⭐ Yes | ❌ No |
| 管理負担 | 低 | 中 |
🎯 まとめ(結論)
プリサインドURLは、S3のファイルを安全に一時的に公開しつつ、将来の構成変更にも柔軟に対応できる最良の選択肢。
- バケットは private のまま
- フロントは URL を貼るだけで画像を表示可能
- 期限切れで自然に無効化
- Public Access や ACL の煩雑な管理も不要
- 特に「内部用途」「非公開システム」「将来の拡張性を重視」する場合に最適
おまけ:
📤 ファイルのアップロード(PUT)用プリサインドURLとは?
📝 アップロード版プリサインドURLの概要
プリサインドURLには GET(ダウンロード/閲覧) と PUT(アップロード) の2種類があります。 そのうち PUT プリサインドURL は、フロントエンドなどのクライアントが サーバーを経由せずに S3 に直接ファイルをアップロードできる仕組み です。
サーバー側はアクセスキーを保持し、アップロード権限を持つ「署名付きURL」だけをクライアントに渡します。 これにより安全なアップロードフローが実現できます。
🔧 PUT プリサインドURLの生成方法(SDK v2)
① Presigner の生成
S3Presigner presigner = S3Presigner.builder()
.region(Region.of(region))
.credentialsProvider(StaticCredentialsProvider.create(
AwsBasicCredentials.create(accessKey, secretKey)
))
.build();
② PutObjectRequest を作る
PutObjectRequest objectRequest = PutObjectRequest.builder()
.bucket(bucketName)
.key(path)
.contentType("image/jpeg") // 任意
.build();
③ PUT 用プリサインドURLを生成
PutObjectPresignRequest presignRequest = PutObjectPresignRequest.builder()
.signatureDuration(Duration.ofMinutes(10))
.putObjectRequest(objectRequest)
.build();
PresignedPutObjectRequest presigned = presigner.presignPutObject(presignRequest);
String uploadUrl = presigned.url().toString();
サーバーはこの uploadUrl をクライアントへ返します。
🎨 フロント側(JavaScript)でアップロード
プリサインドURLを受け取ったフロントは以下のようにアップロードできます:
await fetch(uploadUrl, {
method: "PUT",
headers: {
"Content-Type": file.type
},
body: file
});
✔ 特徴
- 認証不要で S3 に直接アップロード
- サーバー帯域を消費しない(大幅な高速化)
- URL が漏れても有効期限が切れれば無効
🔐 PUT プリサインドURLのセキュリティ特性
✔ バケットは private のまま
✔ URLに署名があり、操作は PUT に限定される
✔ 有効期限があるため安全
✔ 誰がアップロードしたかトラッキングも可能(key にユーザーIDを付与など)
⚠ 注意点
- PUT プリサインドURLは アップロード専用 であり、閲覧(GET)はできません
- フロントで
Content-Typeを正しく指定する必要があります
🧩 PUT プリサインドURLが活躍する場面
- 大容量ファイルのアップロード(動画・画像)
- サーバー帯域を節約したい場合
- マイクロサービス構成でファイルアップロードを共通化したい場合
- ブラウザから直接 S3 アップロードを許可したい場合
🚀 GET と PUT のプリサインドURLの違いまとめ
| 種類 | 目的 | 操作 |
|---|---|---|
| GET | ファイルを表示・ダウンロード | 読み取り |
| PUT | ファイルをアップロード | 書き込み |