HOWTO · Go

GoLang で CORS を有効にする

このチュートリアルでは、GoLang で CORS を有効にして使用する方法を示します。

このチュートリアルでは、GoLang で CORS を有効にして使用する方法を示します。

GoLang CORS

Cross-Origin Resource Sharing (CORS) は、ブラウザーがリソースを読み込んで使用できるオリジンを定義する HTTP ヘッダー ベースのプロセスです。 CORS は、ページ上の JS スクリプトが他のページ上のデータにアクセスすることを許可する Same-origin policy ポリシーを緩和するために使用されます。

同じオリジン ポリシーにより、両方の Web ページのオリジンが同じになります。 このポリシーは、悪意のあるドキュメントを隔離することでセキュリティを向上させるのに役立ちます。

CORS は、表に示すように、ヘッダーを使用して同じオリジン ポリシーを緩和するために使用されます。

ヘッダ タイプ 説明
Origin リクエスト リクエストの発信元をサーバーに示すために使用されます。
Access-Control-Request-Method リクエスト サーバーへのリクエストを実装するための HTTP メソッドを示すために使用されます。
Access-Control-Request-Headers リクエスト サーバーへの要求のヘッダーを示すために使用されます。
Access-Control-Allow-Origin 応答 サーバーによって許可されているオリジンに使用されます。
Access-Control-Allow-Methods 応答 サーバーが許可するカンマ区切りのメソッドのリストに使用されます。
Access-Control-Allow-Headers 応答 サーバーが許可するカンマ区切りのヘッダーのリストに使用されます。
Access-Control-Expose-Headers 応答 クライアントが応答にアクセスできるようにする、カンマ区切りのヘッダーのリストに使用されます。
Access-Control-Max-Age 応答 プリフライト要求への応答をキャッシュするのにかかる秒数をサーバーに通知するために使用されます。
Access-Control-Allow-Credentials 応答 サーバーの資格情報を許可または制限するために使用されます。

GoLang で CORS を有効にする

GoLang の net/http パッケージを使用して、CORS ポリシーを実装する関数を Go に実装できます。 ステップバイステップのプロセスに従って、GO で CORS を有効にします。

  • 他のページから現在のサーバーのリソースにアクセスするヘッダーを含むポート番号を使用して、localhost で実行されるアプリケーションを作成します。 ヘッダーを参照してください。
    Response_Writer.Header().Set("Content-Type", "text/plain; charset=utf-8")
    Response_Writer.Header().Set("Access-Control-Allow-Origin", "http://127.0.1.1:5555")
    Response_Writer.Header().Set("Access-Control-Max-Age", "10")
    
  • ご覧のとおり、CORS ポリシーを有効にして、http://127.0.1.1:5555 の JS スクリプトがページまたはリソースのデータにアクセスできるようにします。 サーバーに CORS ポリシーを実装できるように、これらのヘッダーをメソッドに保持することをお勧めします。
  • 次に、サーバーの CORS ポリシーを設定します。 たとえば、ヘッダーの関数は DelftstackHandler です。 今これを行います:
    http.HandleFunc("/delftstack", DelftstackHandler)
    log.Fatal(http.ListenAndServe(":3000", nil))
    

log.Fatal(http.ListenAndServe(":3000", nil)) は、サーバーの CORS ポリシーを設定します。 この例を実装して、出力を見てみましょう。

CORS ポリシーの GoLang ファイル:

package main

import (
    "fmt"
    "log"
    "net/http"
)

func main() {

    http.HandleFunc("/delftstack", DelftstackHandler)

    log.Println("Listening the request..")
    log.Fatal(http.ListenAndServe(":3000", nil))
}

func DelftstackHandler(Response_Writer http.ResponseWriter, _ *http.Request) {

    Response_Writer.Header().Set("Content-Type", "text/plain; charset=utf-8")
    Response_Writer.Header().Set("Access-Control-Allow-Origin", "http://127.0.1.1:5555")
    Response_Writer.Header().Set("Access-Control-Max-Age", "10")
    fmt.Fprintf(Response_Writer, "Hello, this is delftstack.com!")
}

応答用の HTML/JS ファイル:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Delftstack</title>
</head>

<body>

    <script>
        async function doRequest() {
            let localhost_url = 'http://localhost:3000/delftstack';
            let page_response = await fetch(localhost_url);

            if (page_response.ok) {

                let text = await page_response.text();

                return text;
            } else {
                return `HTTP error: ${page_response.status}`;
            }
        }

        doRequest().then(data => {
            document.getElementById("print_output").innerText = data;
        });
    </script>

    <div id="print_output">

    </div>

</body>

</html>

上記のコードは、応答 Hello, this is delftstack.com! を書き込みます。 HTML/JS ページの Go コードから。

出力を参照してください。

CORS ポリシー

GoLang の CORS パッケージ

サードパーティ パッケージ CORS を使用して、NET/HTTP ハンドラーを定義することによりクロス オリジン リソース共有を実装します。 このパッケージの使用を開始する前に、インストールする必要があります。

次のコマンドを使用します。

go get github.com/rs/cors

CORS を取得

正常にインストールされたら、コードで CORS を使用できます。 簡単な例を試してみましょう。

package main

import (
    "net/http"

    "github.com/rs/cors"
)

func main() {
    Demo_Mux := http.NewServeMux()
    Demo_Mux.HandleFunc("/", func(Response_Writer http.ResponseWriter, Req *http.Request) {
        Response_Writer.Header().Set("Content-Type", "application/json")
        Response_Writer.Write([]byte("{\"hello!\": \"This is delftstack.com\"}"))
    })

    DemoHandler := cors.Default().Handler(Demo_Mux)
    http.ListenAndServe(":3000", DemoHandler)
}

上記のコードでは、cors.Default() は、GETPOST などの単純なメソッドですべてのオリジンが受け入れられるデフォルト オプションでミドルウェアをセットアップします。

上記のコードの出力を参照してください。

単純な CORS 出力

Go の CORS で GET メソッドと POST メソッドを使用する

GET および POST メソッドを使用して、CORS でリクエストを送信することもできます。 AllowedMethods フィールドを使用して、CORS でそれらを割り当てる必要があります。

例を見てみましょう:

package main

import (
    "net/http"

    "github.com/rs/cors"
)

func main() {

    Demo_Mux := http.NewServeMux()

    Demo_CORS := cors.New(cors.Options{
        AllowedOrigins:   []string{"*"}, //all
        AllowedMethods:   []string{http.MethodPost, http.MethodGet},
        AllowedHeaders:   []string{"*"}, //all
        AllowCredentials: false,         //none
    })

    Demo_Mux.HandleFunc("/delftstack", func(Response_Writer http.ResponseWriter, r *http.Request) {
        Response_Writer.Header().Set("Content-Type", "application/json")
        Response_Writer.Write([]byte("{\"hello!\": \"This is delftstack.com\"}"))
    })

    Demo_Handler := Demo_CORS.Handler(Demo_Mux)
    http.ListenAndServe(":3000", Demo_Handler)
}

上記のコードは、CORS パッケージを使用してポリシーを実装し、GETPOST の 2つのメソッドを有効にしてリクエストを送信します。

出力を参照してください。

CORS GET POST