技術向上

プログラミングの学び、気になるテクノロジーやビジネストレンドを発信

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の中身を取り出すため