Cross-Originを許容してCookieを送受信する【Go】
フロントをVue (port :8081)で、サーバーをGo (port :8080)で実行した時、Safariは「開発」メニューから一時的にCross-Originの制限を無効にすることができますが、Chromeにはそれらしきものが見当たらず、Headerにセットすることにしました。備忘として残します。
func main() { http.HandleFunc("/ax", ax) http.Handle("/favicon.ico", http.NotFoundHandler()) http.ListenAndServe(":8080", nil) } func ax(w http.ResponseWriter, req *http.Request) { w.Header().Set("Access-Control-Allow-Origin", "http://localhost:8081") // :8081からはCross-Originを許容する bs, _ := ioutil.ReadAll(req.Body) fmt.Println(string(bs)) fmt.Fprint(w, "From server.") }
フロントエンドから、カスタムheaderも指定している場合には、下記も必要です。
w.Header().Set("Access-Control-Allow-Headers", "Content-Type")
Cookieを送受信するには、まずGoファイルで下記を追加し、
w.Header().Set("Access-Control-Allow-Credentials", "true")
フロントエンド 側のリクエストに「{withCredentials: true}」を追記します(下記はaxiosを利用する場合の例です)。
axios.post('https://localhost:10443/ax', JSON.stringify({ name: 'test@example.com' }), {withCredentials: true} // 追加 )
Cookieを送受信する場合、Goファイルの「Access-Control-Allow-Origin」のドメイン指定に、下記のようなワイルドカードを使うことができなくなります。
w.Header().Set("Access-Control-Allow-Origin", "*") // Cookieの送受信には、このようなワイルドカードは使えない
Cookieを送受信する、と書きましたが、クライアントからのリクエストに対するサーバーサイドの処理の中で、Cookieの中身にアクセスするようなら、この対策が必要なようです。
例えば、次のような場合には、対策をしなくてもCORS関係のエラーは起きませんが、
c, _ := req.Cookie("session") fmt.Println(c)
次の場合、対策を講じないと、CORS関係のエラーが起きます。
c, _ := req.Cookie("session") fmt.Println(c.Value) // Cookieの中身を取り出すため