0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

簡単!CORSの設定

Last updated at Posted at 2022-10-30

バックエンドにリクエストを送れないのはCORS設定できてないからかもしれない

例えばReact + Goで開発をしているとします。Reactlocalhost:8000でGoはlocalhost:8080で動いているとします。

ReactからGoへリクエストを投げてみます。すると次のエラーが出ます。

Screen Shot 2022-10-30 at 14.28.26.png

オリジンが異なるときはCORSの設定が必要

エラーの原因はReactとGoでオリジンが違うことです。今回の場合で言うと

React:http://localhost:8000
Go:http://localhost:8080

がオリジンです。

違うオリジンにリクエストを送るにはCORS(Cross-Origin Resource Sharing)の設定が必要です。

具体的にはフロントエンド側でモードの設定、バックエンド側でヘッダーを付与する必要があります。

モードの設定

クロスオリジンリクエストであることを指定します。クッキーを送信する場合は
credentials: "include"とします。

fetch("http://localhost:8080/ping", {
      mode: "cors",  // クロスオリジンリクエストであることを指定
      credentials: "include",
    })

ヘッダーを付与

Access-Control-Allow-Headers...許可するヘッダー

Access-Control-Allow-Origin...許可するOrigin

Access-Control-Allow-Methods...許可するメソッド

Access-Control-Allow-Credentials...クッキーを使うかどうか

今回はこのような感じで設定しました。

func ForCORS(next http.Handler) http.Handler {
	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		w.Header().Set("Access-Control-Allow-Headers", "*")
		w.Header().Set("Access-Control-Allow-Origin", "http://localhost:8000")
		w.Header().Set("Access-Control-Allow-Methods", "GET, POST, PUT, OPTIONS")
		w.Header().Set("Access-Control-Allow-Credentials", "true")

		if r.Method == "OPTIONS" {
	    	w.WriteHeader(http.StatusOK)
			return
		}
		next.ServeHTTP(w, r)
	})
}

以上の設定で無事、フロントエンドからバックエンドへリクエストを送れるようになりました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?