1

ユーザーが写真をアップロードして後で表示できる写真サイトを構築しています。これらの写真は公開でも非公開でもありません。写真とサムネイルをS3に保存しています。現在、私がフォローしている実装は、ユーザーがページに来たときにサムネイルの署名付き URL を提供し、S3 からロードすることです (ただし、クラウドフロントから署名付き URL を使用することも考えています)。

現在の問題は次のとおりです。

  • 各リクエストでは、サムネイルごとに異なる URL が提供されるため、ブラウザのキャッシュは使用できません。これにより、ユーザーがサイトを更新すると、ブラウザは各画像を再度ロードします。ページが遅くなります。
  • これはまた、誰かがソースとすべてを詮索すると、写真の署名付き URL を見つけて、それを他の人に配布して閲覧できるというもう 1 つの問題を引き起こします (ただし、署名付き URL は 10 分間だけです)。私が望むのは、ユーザーを許可するかどうかを決定できるように、アプリケーションによって URL が渡されることです。

ページの読み込み時間を速くし、セキュリティ上の懸念にも対応したいので、どのようなアプローチをとるべきか教えてください。また、毎回異なる署名付き URL であっても、クラウドフロントからのサービスがブラウザーのキャッシュよりも高速であることを知りたいです (どこかで読んだことがあります)。あなたの答えを説明してください。

4

1 に答える 1

2

あなたが望むものに対する完璧な答えはないと思います。いくつかのランダムなアイデア/トレードオフ:

1) HTTPS に切り替えます。そうすれば、URL をスニッフィングする人を無視できます。ただし、HTTPS アイテムはブラウザに長時間キャッシュすることはできません。

2) 署名付き URL を配布する場合は、expires = "time + 10m" を設定しないでください。このように、URL は少なくとも 10 分間一定であり、ブラウザーはそれらをキャッシュできます。(ブラウザがキャッシュできることを認識できるように、S3 のファイルに expires: ヘッダーも設定してください。)

3) すべての URL をプロキシできます。ブラウザーサーバーからの写真をリクエストさせ、S3 の写真にリクエストをプロキシする Web プロキシを作成します。途中で、ユーザー認証を確認し、S3 用の署名付き URL を生成し、写真をローカルにキャッシュすることもできます)。これは「効率が悪い」ように思えますが、ブラウザが URL を必要なだけキャッシュできるようにします。写真の URL をブックマークできるので、ユーザーにとっても便利です。いつでも機能します。別のコンピューターに移動した場合でも、サーバーにアクセスして、写真を表示する前にサインインするように求めることができます.

Python Twisted や Node.js などの「イベント化された」サーバーを必ず使用してください。そうすれば、サーバーのメモリや CPU を大量に使用することなく、同時に何千もの写真をプロキシできます。(すべてのデータがサーバーを経由するため、大量の帯域幅を使用します。ただし、複数のサーバーを実行することで簡単に「スケールアウト」できます。)

4) Cloudfront はキャッシュです。リソースが CF サーバーから初めて要求されるときは、遅くなります (数百ミリ秒)。ただし、2 番目のリクエストがキャッシュされるとは思わないでください。各 CF の場所には最大 20 の異なるサーバーがあり、毎回ランダムにヒットします。したがって、写真を 10 回リクエストすると、10 回のキャッシュ ミスが発生する可能性が高く、次のリクエストでキャッシュ ヒットが発生する可能性は 50% しかありません。CF は、何百回も要求される人気のあるコンテンツにのみ役立ちます。CF から S3 へのプライベート接続は通常のインターネットよりも優れているため、外国のユーザーにとって CF は多少便利です。

どのようにして CF にセキュリティ チェックを行わせるのか正確にはわかりません。ただし、S3 認証を通過する場合 (デフォルトではありません)、「mod 10 minutes」トリックを使用して、10 分間キャッシュできる URL を作成できます。

CF が「ブラウザのキャッシュよりも高速」であることは不可能です。ただし、ブラウザーのキャッシュを使用していない場合、CF は S3 よりも高速になる可能性がありますが、ほとんどの場合、外国の場所にあります。

他の人が何をしているか見てみましょう (つまり、smugmug は S3 を使用していると思います)。

于 2013-06-15T18:31:48.643 に答える