APIでファイルアップロード時に発行するURLについて 

この記事を書いたチーム:frontier
APIでファイルアップロード時に発行するURLについて   株式会社Smallit 技術ブログ

結論 

【エンジニア募集中】フルリモート可◎、売上/従業員数9年連続UP、平均残業8時間、有給取得率90%、年休124日以上 etc.  詳細はこちらから>

サーバ側のアカウントや権限に関わらず、利用者がファイルをアップロードするためにURLを発行している。

いきさつ

開発中、画像アップロードを行う処理があり、手順としては下記の通り、2回API通信をしていました。 

  1. 画像アップロード用のURLを発行するAPIを実施 
  2. 上記APIで発行したURLでAPIを実施し、画像をアップロード 

なぜわざわざ1度URLを発行するのか、画像アップロード用のURLを設定すればいいのでは?と疑問に思い、調べることにしました。すると、そのURLが「署名付きURL」であること、それを用いる理由が分かりました。 

署名付きURLとは※簡単に 

通信を行う際の制限や有効期限が設定されているURLです。署名付きURLを使用すれば、サーバ側の権限を持たないユーザーも、ファイルアップロードなどの処理を実行することができます。 

署名付きURLを使わない場合に想定されるリスク 

①サーバ側のアカウントがないとファイルがアップロードできない 

ほとんどの場合、アップロードを行う画面そのものではなく、その画面を管理するサーバにファイルをアップロードします。画面を利用するユーザー全てがそのサーバのアカウントを持っている状態というのは管理面、費用面からも現実的ではないでしょう。 

②無差別にファイルの送受信、削除や変更が行われる 

サーバ側のファイルを操作する権限を無しにするわけにはいきません。必要なファイルが削除されたり、他の作業に支障をきたすほど重いファイルを送信されたりする攻撃を受けるかもしれません。 

まとめ 

URLを発行する処理は、利用者がファイルアップロードできるようにするために必要な処理であることが理解できました。今回は確認できませんでしたが、署名付きURL実施前後でサーバ側のデータがどのようになっているか、サーバ側でどのように署名付きURLを発行しているのかを調べたり、用いない場合はどうするのかを検証したりしてみたいです。 

いきさつで行っていた処理についておまけ 

最終的に以下のような処理になりました。URLの発行は必要な処理でしたが、APIをその都度フロントエンドから送るのは冗長でした。 

参考サイト 

署名付きURLについての説明: 
https://cloud.google.com/storage/docs/access-control/signed-urls?hl=ja 

署名付きURLを用いてS3にアップロードする方法 
https://qiita.com/sugimount-a/items/247517c2ee39f0b15bf0 

【エンジニア募集中】フルリモートも◎(リモート率85.7%)、平均残業8時間、年休124日以上、有給取得率90% etc. 詳細はこちらから>

Smallitのサービス