Go言語でのCORS対応の基礎と安全な設定方法
生徒
「先生、GoでWeb APIを作ったんですが、他のサイトからリクエストが弾かれてしまいます。どうすればいいですか?」
先生
「それはCORSの問題ですね。CORSとは、異なるドメインからのアクセスを制御する仕組みです。Cross-Origin Resource Sharingの略で、Webブラウザがセキュリティ上の理由で制限しているものです。」
生徒
「具体的にはどうやって対応するんですか?」
先生
「Goでは、HTTPヘッダにAccess-Control-Allow-Originを追加することで対応できます。また、サードパーティのライブラリを使うと簡単に設定できます。」
1. CORSとは?
CORSは、Webブラウザが異なるオリジン(ドメイン、ポート、プロトコルの組み合わせ)からのリクエストを制限する仕組みです。例えば、https://example.comのページがhttps://api.example2.comのデータにアクセスするときに、ブラウザは安全性のために制限します。
2. 基本的なCORS対応
GoでCORSを有効にするには、HTTPレスポンスヘッダにAccess-Control-Allow-Originを追加します。例えば、すべてのオリジンからアクセスを許可する場合は*を設定します。
func handler(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Access-Control-Allow-Origin", "*")
w.Write([]byte("CORS対応テスト"))
}
この方法は簡単ですが、*を使うとどのサイトからでもアクセスできるため、セキュリティ上注意が必要です。
3. サードパーティライブラリで簡単に設定
GoにはCORS設定を簡単に行えるライブラリがあります。例えばgithub.com/rs/corsを使うと安全かつ柔軟に設定できます。
import (
"net/http"
"github.com/rs/cors"
)
func main() {
mux := http.NewServeMux()
mux.HandleFunc("/api", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("CORS設定済み"))
})
c := cors.New(cors.Options{
AllowedOrigins: []string{"https://example.com"},
AllowedMethods: []string{"GET", "POST"},
})
handler := c.Handler(mux)
http.ListenAndServe(":8080", handler)
}
この設定では、https://example.comからのGETとPOSTのみ許可し、それ以外のサイトからのアクセスはブロックされます。
4. 安全なCORS設定のポイント
- 必要なオリジンのみを
AllowedOriginsに指定する - 不要なHTTPメソッドは許可しない
- Cookieを利用する場合は
AllowCredentials: trueを設定し、*を使わない
これにより、意図しない外部サイトからの不正アクセスを防ぎ、セキュリティを保ちながらCORS対応できます。
5. 実際の利用ケース
例えば、フロントエンドがhttps://myfrontend.com、バックエンドがhttps://myapi.comの構成の場合、CORSを正しく設定することで、フロントエンドから安全にAPIにアクセスできるようになります。間違って*を設定すると、他の悪意あるサイトからもAPIにアクセスできてしまうため注意が必要です。