なんとなく「ウェブから動画とか画像をダウンロードしたい!」って思ったことあるよね?でも自分で作ろうとすると、CORSポリシーっていう壁にぶつかって、うまくファイルを取ってこれない…ってこと、けっこうあると思うんだ💭
じゃあ、なんで世の中にはいっぱいそういうダウンロードサイトがあるのか?どうやって“アクセス制限”を突破してるのか?めっちゃ気になるよね😳✨
そもそもCORSポリシーって?
CORS(Cross-Origin Resource Sharing)は、「他のサイトから勝手にデータを取らせないよ」というブラウザのルールのこと。
たとえば、あなたのサイト(origin)がyoutubeみたいな別のサイト(origin)にアクセスして動画ファイルを取ろうとしたとき、普通は「許可しません!」って引っかかっちゃうんだ📌
それで、許可されてる時はレスポンスヘッダに
Access-Control-Allow-Origin: *
とか自分のサイトのURLが書いてあって、そこではじめてブラウザが「OK!」ってなる感じ💡
ダウンロードサイトはどうやって突破してる?
実は、多くのダウンロードサイトは「直接ブラウザから」コンテンツを取ってないんだよね!
じゃあどうしてるかというと…
- サーバー側で代理(プロキシ)として動く
- ブラウザの代わりにサーバーが動画や画像を取得する
- 取得したデータを自分のサーバー経由でユーザーに渡す
つまり、自分のサーバーが「間に入って」データを取るってこと✨
こうすると、ブラウザは自分のサーバーからデータをもらうだけだから、CORSの壁は関係なくなるんだ👍
じゃあ自分のアプリでもやるなら?
もし自分でダウンロードアプリを作っててCORSに悩んでるなら、「ブラウザじゃなくて自分のサーバーに一度データを取りに行かせる」仕組みを作るのがポイントだよ🌸
でも、これってサーバーの負担が増えるし、通信量が多くなるから結構大変💦
あとYouTubeみたいに規約が厳しいところもあるから、法律面のチェックも忘れずにね😳💭
ざっくり言うと、CORSの壁はブラウザが守ってるルールで、サーバーはその壁を越えられるから代理で取ってるんだなーって話だったよ!
なんだかんだで、こういう裏側知るとネットの仕組みっておもしろいよね🥺✨
コメント
グレース
CORSはブラウザからの直接アクセスだけで、サーバー経由のcurlやfetchは関係ないよ。
エイダン
たぶんみんなyt-dlp使ってるよ。
ロバート
サーバーでダウンロードしてるんだよ。
クリス
CORSはクライアント側のセキュリティで、クライアントを自由に扱えるなら無効にもできるけど、やらないほうがいいよ。
リリー
CORSポリシーなんてなくて、ブラウザが守ってるのはSame-Origin Policy(同一生成元ポリシー)だけで、CORSはその例外だよ。
ロバート
彼らは直接はやってなくて、サーバーでメディアを受け取ってからクライアントに送ってる。
グレース
CORSのオプションリクエストはブラウザだけの話で、wgetやcurlは問題なくダウンロードできるよ。
ハンナ
PHPとかサーバー側で処理するんだよ。 そもそもダウンロードツールが多すぎるのはなぜ? そんなに需要あるのかな?
レオ
これはやばいアイデアだけど、要求元に応じてCORSヘッダーを動的に変えるのは簡単だよ。
グレース
wgetもcurlもCORSは無視するから、ブラウザだけの問題なんだ。
ミア
サーバーが同一生成元のセキュアクッキーを使ってなければ、プロキシでヘッダー付けるだけでOKで、「cors proxy」みたいな小さなサービスもあるよ。
ロバート
全部バックエンドでダウンロードしてるんだよ。 昔はYouTubeの直リンクを渡すサイトもあったけど、今はほぼ使えないか低画質だけだね。
リリー
信用が基本なんだよね。
クリス
CORSはサーバーがブラウザに対して、「このドメインからのリソース読み込みはOKだよ」ってHTTPヘッダーで教える仕組みだよ。