私は、Django を使用して、アクセス制御によるファイルのダウンロードについて調査してきました。私の目標は、特定のユーザーがアクセスする場合を除いて、ファイルへのアクセスを完全にブロックすることです。Django を使用する場合、これを実現するための選択肢の 1 つとして X-Sendfile が挙げられます (他の SO の質問などに基づく)。Django で X-Sendfile を使用する方法についての私の基本的な理解は次のとおりです。
- ユーザーは保護されたファイルを取得するためにURIを要求します
- Django アプリは URL に基づいて返すファイルを決定し、ユーザーの権限などをチェックします。
- Djangoアプリは、サーバーのファイルパスに設定された「X-Sendfile」ヘッダーを含むHTTPレスポンスを返します。
- Web サーバーはファイルを見つけて、それを要求者に返します (Web サーバーは途中で 'X-Sendfile' ヘッダーも削除すると想定しています)
Django から直接ファイルを転送するのと比べると、X-Sendfile は保護されたダウンロードを実現するより効率的な方法であると思われます (Django ではなく Nginx に頼ってファイルを提供できるため)。しかし、2 つの疑問が残ります。
- X-Sendfile についての私の説明は、少なくとも抽象的には正しいでしょうか?
- 通常のフロントエンドHTTPアクセスを提供しないと仮定すると、それは本当に安全でしょうか(例:http://www.example.com/downloads/secret-file.jpg) を、ファイルが保存されているディレクトリに追加 (つまり、自分のディレクトリに保存しない
public_html
) できますか? または、技術に精通したユーザーがヘッダーなどを調べて、ファイルにアクセスする方法 (その後配布する) をリバース エンジニアリングできますか? - パフォーマンスには本当に大きな違いがあるのでしょうか。150 MB のファイルを 8 ビットのチャンクに分割して直接 Django からダウンロードすると、アプリケーション サーバーがダウンしてしまうのでしょうか。それとも、これは問題にならないのでしょうか。質問する理由は、両方のバージョンがほぼ同等である場合、完了したダウンロードの数を記録したり、ダウンロードの帯域幅を集計したりするなど、Python で操作できるため、Django バージョンの方が適しているからです。
前もって感謝します。
ベストアンサー1
- はい、そういう仕組みです。
- 正確な実装は Web サーバーに依存しますが、nginx の場合は、外部からのアクセスを防ぐために場所を内部としてマークすることをお勧めします。
- Nginx は非同期でファイルを提供できますが、Django ではリクエストごとに 1 つのスレッドが必要であり、並列リクエストの数が多いと問題が発生する可能性があります。
nginxの場合はX-SendfileではなくX-Accel-Redirectヘッダーを送信することを忘れないでください。http://wiki.nginx.org/XSendfile詳細については。