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 コードから。
出力を参照してください。
GoLang の CORS パッケージ
サードパーティ パッケージ CORS を使用して、NET/HTTP ハンドラーを定義することによりクロス オリジン リソース共有を実装します。 このパッケージの使用を開始する前に、インストールする必要があります。
次のコマンドを使用します。
go get github.com/rs/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() は、GET や POST などの単純なメソッドですべてのオリジンが受け入れられるデフォルト オプションでミドルウェアをセットアップします。
上記のコードの出力を参照してください。
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 パッケージを使用してポリシーを実装し、GET と POST の 2つのメソッドを有効にしてリクエストを送信します。
出力を参照してください。