Flashで別ドメインから署名付きURLでCloudFrontにアクセスするときの問題

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

前回に引き続き今回も担当したプロジェクトでAWSを使用したので、同じく事例を書いてみました。

■FlashとCloudFrontを使ったプロジェクト

担当したプロジェクトは、UIにFlashを採用し、要件として様々な形式のファイルがアップロード可能(保存)かつ、ダウンロードも可能(閲覧)である事、さらにダウンロードの速度についてもある程度の速さを求められるというものでした。

扱うファイルは大別して二種類あり、ひとつは機密性が重視されるファイルで外部に漏洩させることが出来ないファイル。
もうひとつは、共有するユーザー間でのみ公開を目的としたファイルや、アップロードした画像ファイルから生成したサムネイルファイルなど外部へ漏洩したとしても比較的問題のないファイルです。

そこで、CloudFrontを使った構成を考えました。

CloudFrontはS3上のファイルをキャッシュし、物理的にユーザーから近いエッジロケーションから広い帯域幅を使って高速にダウンロードさせることが可能なため、全てのファイルをCloudFrontに配置させます。

機密性に関する問題は、CloudFront上のファイルを非公開にしておき、アクセスする時のみ、アクセス権を一時的に有効にする署名付きURL(期限付きの一時URL)を発行し、そのURLにアクセスしてダウンロードすることで解決する予定でした。

アクセス権を有効にすると同時にダウンロードが開始されるので、有効期限は60秒に設定しました。

60秒というと短いように思われるかも知れませんが、ダウンロード開始時にアクセス認証をパスすればダウンロード中に有効期限を失効しても正常にダウンロードできるので十分な時間です。

■Flashで別ドメインから署名付きURLでCloudFrontにアクセスできない!

FlashではSWFの生成元となるドメイン外にあるデータにアクセスすることが出来ないので(クロスドメインのセキュリティ問題)CloudFrontにcrossdomain.xmlを設置したのですが、crossdomain.xmlについても署名付きURLでアクセスする必要があり、Flexでこの処理を行うと、署名付きURLを正常に読み込んだ後、内部的に署名なしのURLにて再度読み込みを行ってしまい、crossdomain.xmlを読み込めない事態が発生しました。

■結局、対処は。。。

原因についていろいろ調べたのですが、同様の事例がAWSのフォーラムやAdobeのフォーラムでもあがっており現在のところ解決策はありませんでした。

結局、機密性重視のファイルについては、CloudFrontを諦めてS3上に配置し、当初の予定どおり非公開で署名付きURLでアクセスすることにしました。(S3からcrossdomain.xmlの読み込みは問題なし)

他のファイルは、CloudFrontに配置してパブリック公開(アクセスに制限なし)にするが、ファイル名をハッシュ化し、容易にURIを推測できないようにすることで対処しました。