質問: Webサービスにおいてユーザごとにデータを保存するサービスがあるかと思います.例えば,Google Drive,Amazon Photoなどでアカウントを作り,アカウントごとで画像データなりファイルなりを保存すると思います.そこで質問なのですが,そのようなサービスにおいてユーザごとの画像をどのように保存するのがベストなのでしょうか. Webページにおいてサーバからリンクに従って画像を取得するのが一般的であるかと思いますが,サーバの階層が解析されたり,リンクの総当たりによって,誰にでも個人の画像が取得されるのではないかと懸念しています.そもそも,アカウントを作ってアカウントごとに画像を取得するサービスにおいて,imgタグの中にある画像データはリンクを複雑にしておけば,アクセスされないということが前提にあるのでしょうか.ちなみに,Google driveにおけるマイページにおいて * のようなリンクで個人の画像が誰にでも見られるようになっていますが,***の部分が複雑でありこれ自体がバレることがないというのが前提にあるのでしたら納得はいきます. なお,安全にサーバから画像を取り出すことを考えると,DBに画像をバイナリで保存しておくことが考えられるかと思いますが,一般的にそれはよしとされていないため,ベストな解決策があるのでしたら教えていただきたいです.
回答: 前提としてサーバサイドのスクリプト(プログラミング言語)が必要になります。 > > Webページにおいてサーバからリンクに従って画像を取得するのが一般的であるかと思いますが, > > > この一般的だと思っている方法とは違う方法をとられます。 まず認証が必要なファイルを運用するときは、非公開領域にファイルを置きます。 サーバスクリプトで認証を通して、サーバスクリプトでファイルを改めて出力するようにします。 一度も公開領域にファイルは置かず、サーバスクリプトを通してファイルを出力するようにします。どのように出力しているかは言語により違うので調べてみるとよいでしょう。 DBに保存するのと保存場所が違うだけでやることは一緒になります。 Paasであればオブジェクトストレージに保存することもあります。 > > imgタグの中にある画像データはリンクを複雑にしておけば,アクセスされないということが前提 > > > もちろんサービスとしてセキュリティ要件に合うのであればそういった運用をすることもあるでしょう。ですがガチガチの個人情報だったりすると、URLの漏洩や総当たり攻撃を考えると、公開領域に保存するのも危ないと判断されることがあります。その場合は残念ながらランダム文字列によるファイルの保存は残念ながら対応ができません。その場合は上記の対応をします。 そこはプロダクトおよびプロジェクトの要件と照らし合わせて確認してみてください。