3秒でわかる
有効期限と許可する操作を署名として埋め込んだ URL。非公開のファイルを、鍵を配らずに一時的に取得させるための仕組みです。
もう少し詳しく
どういうものか
アクセスを許可する条件を URL の中に書き込み、その全体をサーバーの秘密鍵で署名した URL のこと。クエリ文字列に有効期限、対象のファイル、許可する操作、署名が並ぶ。受け取ったストレージ側は署名を検証し、条件に合っていればファイルを返す。期限を過ぎていたり、URL の一部が書き換えられていたりすると拒否される。
Amazon S3 の presigned URL、Google Cloud Storage の signed URL、CDN の署名付き URL が代表例になる。
なぜ必要か
非公開のファイルを利用者に渡すとき、選択肢は 3 つある。バケット全体を公開する、アプリのサーバーが中継して配信する、署名付き URL を発行する、の 3 つになる。公開は論外で、中継はサーバーの帯域と CPU を消費する。署名付き URL なら、アプリは短い文字列を返すだけで、実際の転送はストレージが直接引き受ける。
アップロードにも使える。利用者のブラウザが直接ストレージへ送るため、大きなファイルがアプリのサーバーを通らない。
具体例
// AWS SDK v3 でダウンロード用の URL を発行する
import { S3Client, GetObjectCommand } from "@aws-sdk/client-s3";
import { getSignedUrl } from "@aws-sdk/s3-request-presigner";
const s3 = new S3Client({ region: "ap-northeast-1" });
const url = await getSignedUrl(
s3,
new GetObjectCommand({ Bucket: "invoices", Key: "2026/07/1234.pdf" }),
{ expiresIn: 300 } // 5分だけ有効
);発行される URL は下記のような形になる。
https://invoices.s3.ap-northeast-1.amazonaws.com/2026/07/1234.pdf
?X-Amz-Algorithm=AWS4-HMAC-SHA256
&X-Amz-Expires=300
&X-Amz-SignedHeaders=host
&X-Amz-Signature=8b1c...つまずきやすいところ
有効期限を長く取りすぎる設計が最も危ない。URL は貼り付けて共有できてしまうため、期限内なら誰でも取得できる。用途に合わせて数分から数十分に収める。
発行そのものに認可の判定を挟み忘れる例も多い。「ログインしていれば任意のファイル ID で発行できる」実装だと、他人の請求書を取り放題になる。発行前に、その利用者がそのファイルの持ち主かを必ず確かめる。
期限切れの扱いも忘れられやすい。画面に表示したあと利用者が席を外し、戻ってクリックすると 403 が返る。押した時点で再発行する作りにしておくと事故が減る。
覚え方
合鍵を渡すのではなく、時間制限つきの入館証を発行する仕組み。証は期限が来れば自然に無効になる。