Django - X-Sendfile を理解する 質問する

Django - X-Sendfile を理解する 質問する

私は、Django を使用して、アクセス制御によるファイルのダウンロードについて調査してきました。私の目標は、特定のユーザーがアクセスする場合を除いて、ファイルへのアクセスを完全にブロックすることです。Django を使用する場合、これを実現するための選択肢の 1 つとして X-Sendfile が挙げられます (他の SO の質問などに基づく)。Django で X-Sendfile を使用する方法についての私の基本的な理解は次のとおりです。

  1. ユーザーは保護されたファイルを取得するためにURIを要求します
  2. Django アプリは URL に基づいて返すファイルを決定し、ユーザーの権限などをチェックします。
  3. Djangoアプリは、サーバーのファイルパスに設定された「X-Sendfile」ヘッダーを含むHTTPレスポンスを返します。
  4. Web サーバーはファイルを見つけて、それを要求者に返します (Web サーバーは途中で 'X-Sendfile' ヘッダーも削除すると想定しています)

Django から直接ファイルを転送するのと比べると、X-Sendfile は保護されたダウンロードを実現するより効率的な方法であると思われます (Django ではなく Nginx に頼ってファイルを提供できるため)。しかし、2 つの疑問が残ります。

  1. X-Sendfile についての私の説明は、少なくとも抽象的には正しいでしょうか?
  2. 通常のフロントエンドHTTPアクセスを提供しないと仮定すると、それは本当に安全でしょうか(例:http://www.example.com/downloads/secret-file.jpg) を、ファイルが保存されているディレクトリに追加 (つまり、自分のディレクトリに保存しないpublic_html) できますか? または、技術に精通したユーザーがヘッダーなどを調べて、ファイルにアクセスする方法 (その後配布する) をリバース エンジニアリングできますか?
  3. パフォーマンスには本当に大きな違いがあるのでしょうか。150 MB のファイルを 8 ビットのチャンクに分割して直接 Django からダウンロードすると、アプリケーション サーバーがダウンしてしまうのでしょうか。それとも、これは問題にならないのでしょうか。質問する理由は、両方のバージョンがほぼ同等である場合、完了したダウンロードの数を記録したり、ダウンロードの帯域幅を集計したりするなど、Python で操作できるため、Django バージョンの方が適しているからです。

前もって感謝します。

ベストアンサー1

  1. はい、そういう仕組みです。
  2. 正確な実装は Web サーバーに依存しますが、nginx の場合は、外部からのアクセスを防ぐために場所を内部としてマークすることをお勧めします。
  3. Nginx は非同期でファイルを提供できますが、Django ではリクエストごとに 1 つのスレッドが必要であり、並列リクエストの数が多いと問題が発生する可能性があります。

nginxの場合はX-SendfileではなくX-Accel-Redirectヘッダーを送信することを忘れないでください。http://wiki.nginx.org/XSendfile詳細については。

おすすめ記事