こう 聞かれます
- 「CORS の
エラーが 出た ことは ありますか。 なぜ 起きて、 どう 直しましたか」 - 「同じ API を curl で
呼ぶと 動くのに、 ブラウザの fetch だと エラーに なります。 なぜですか」 - 「プリフライトとは
何ですか」
面接官が 見ている点
- 止めているのは
サーバーではなく ブラウザだ、 と分かっているか - 画面の
側を いじって 逃げるのではなく、 API の 側で 許可を 返すのが 直し方だと言えるか - 許可を
広げすぎる 危うさ (何でも *にする ) に 気づけるか
短い答え
- ブラウザには、
JavaScript が 別の オリジン (スキーム、 ホスト、 ポートの 組) から 受け取った 応答を、 勝手に 読めないように する 決まりが あります。 - CORS は、
サーバーが 応答の ヘッダーで 「この オリジンからなら 読んで よい」と 許す仕組みで、 許可が 無いと ブラウザが 応答を 読ませずに エラーにします。 - 直すのは API の
側で、 Access-Control-Allow-Originに画面の オリジンを 返すようにします。 必要なら、 先に 届く OPTIONS の 確かめにも 答えます。
少し 詳しい答え
なぜブラウザが 止めるのか
ブラウザは、
たとえば http://localhost:5173 のhttp://localhost:3000 の API を
直し方
API のAccess-Control-Allow-Origin のhttp://localhost:5173 のように
プリフライト
JSON を
Cookie を 付けるとき
fetch で credentials: "include" をAccess-Control-Allow-Origin に * はAccess-Control-Allow-Credentials も
作った
よく ある間違い
- 画面の
側の コードで 直そうとする 許すか どうかを 決めるのは サーバーの 応答です。 fetch の 書き方を 変えても、 許可が 無ければ 読めません - 「CORS が
サーバーへの 攻撃を 防ぐ」と思う CORS は ブラウザの 中だけの 決まりです。 curl などは そのまま 呼べるので、 API の 認証と 権限の 確かめは 別に要ります - とりあえず
全部 *で許す 公開してよい 物なら 問題は 小さいですが、 ログインの 要る API で 許す先を 広げると、 意図しない サイトから 使われる 入り口になります
深掘りの問い
- 「CORS の
エラーの とき、 要求は サーバーに 届いていますか」 届いている こともあります。 プリフライトの 要らない 要求は 送られ、 ブラウザは 応答を 読ませないだけなので、 サーバーで 処理は 走りうる、と答えます - 「プリフライトが
起きないのは どんな 要求ですか」 GET、 HEAD、 POST で、 Content-Type が form や text/plainなどに限られ、 独自の ヘッダーが 無い もの、と答えます - 「開発の
ときだけ CORS を 避ける方法は」開発用の サーバーの 中継 (プロキシ) で、 画面と API を 同じ オリジンに 見せる 方法を挙げます