カテゴリ: Go言語 更新日: 2026/02/23

Go言語でのCORS対応の基礎と安全な設定方法

Go言語でのCORS対応の基礎と安全な設定方法
Go言語でのCORS対応の基礎と安全な設定方法

先生と生徒の会話形式で理解しよう

生徒

「先生、GoでWeb APIを作ったんですが、他のサイトからリクエストが弾かれてしまいます。どうすればいいですか?」

先生

「それはCORSの問題ですね。CORSとは、異なるドメインからのアクセスを制御する仕組みです。Cross-Origin Resource Sharingの略で、Webブラウザがセキュリティ上の理由で制限しているものです。」

生徒

「具体的にはどうやって対応するんですか?」

先生

「Goでは、HTTPヘッダにAccess-Control-Allow-Originを追加することで対応できます。また、サードパーティのライブラリを使うと簡単に設定できます。」

1. CORSとは?

1. CORSとは?
1. CORSとは?

CORSは、Webブラウザが異なるオリジン(ドメイン、ポート、プロトコルの組み合わせ)からのリクエストを制限する仕組みです。 もともとブラウザには「同一オリジンポリシー」という基本ルールがあり、勝手に別ドメインの情報へアクセスできないようにしています。 その制限を、決めた条件の範囲内で“許可するための仕組み”がCORSだと考えると分かりやすいです。

例えば、https://example.comの画面(フロント側)が、 https://api.example2.comのAPI(サーバー側)へデータを取りに行くとき、 何も設定しないとブラウザが「安全確認ができないので止めます」と判断して弾くことがあります。 このとき、サーバーが「このオリジンからのアクセスならOK」とHTTPヘッダで伝えることで、ブラウザは安心して通信を続けられます。

初心者の方は、CORSを「外部サイトからのアクセスに対して、通していい相手だけ通す入場チェック」のようなものだと思ってください。 設定が合っていないと、サーバーは動いているのにブラウザ側だけエラーになることもあるので、まずは仕組みを押さえておくのが近道です。


// イメージ:サーバーが許可を出すと、ブラウザが通信を続けられる
func handler(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Access-Control-Allow-Origin", "https://example.com")
    w.Write([]byte("CORSの基本イメージ"))
}

このように、CORSは「ブラウザが安全のために止める動き」と「サーバーが許可を示すヘッダ」がセットで成り立っています。 まずは“別オリジンの通信にはルールがある”という点を覚えておくと、次の設定の話もスムーズにつながります。

2. 基本的なCORS対応

2. 基本的なCORS対応
2. 基本的なCORS対応

GoでCORSを有効にするもっとも基本的な方法は、 HTTPレスポンスヘッダに Access-Control-Allow-Origin を追加することです。 これは「どのオリジンからのアクセスを許可するか」をブラウザに伝える役割を持っています。 まずは、このヘッダがCORS対応の出発点になると覚えておきましょう。

たとえば、すべてのオリジンからのアクセスを一時的に許可したい場合は、 値に * を指定します。 開発中に動作確認をしたいときなど、原因切り分けの目的で使われることが多い設定です。 プログラミング未経験の方は「とりあえず全部OKにする設定」と考えると分かりやすいです。


func handler(w http.ResponseWriter, r *http.Request) {
    // すべてのオリジンからのアクセスを許可
    w.Header().Set("Access-Control-Allow-Origin", "*")
    w.Write([]byte("CORS対応テスト"))
}

このコードでは、ブラウザに対して 「どのサイトから来たリクエストでも受け付けます」 という意思表示をしています。 そのため、CORSエラーが原因で画面が動かなかった場合は、 まずこの形で通信できるか確認するのが定番です。

ただし、* を使うと本当にすべてのサイトからアクセスできてしまいます。 本番環境でこの設定を使い続けるのは危険なので、 動作確認ができたら、許可するオリジンを絞る設定に切り替えることが重要です。 ここでは「CORS対応の基本形」として、この仕組みをしっかり理解しておきましょう。

3. サードパーティライブラリで簡単に設定

3. サードパーティライブラリで簡単に設定
3. サードパーティライブラリで簡単に設定

CORS対応は手書きでもできますが、実務では「設定漏れ」や「書き忘れ」を避けるために、 サードパーティのCORSライブラリを使うことがよくあります。 Go言語では、github.com/rs/cors が定番で、許可するオリジンやメソッドをまとめて管理できるのが強みです。 初心者の方は「CORS用の便利な部品を借りて、設定を整理しやすくする方法」と思うとイメージしやすいです。

使い方はシンプルで、まず通常どおりに http.NewServeMux() でルーティングを作り、 その後に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設定済み"))
    })

    // CORSの許可ルールをまとめて定義する
    c := cors.New(cors.Options{
        AllowedOrigins: []string{"https://example.com"},
        AllowedMethods: []string{"GET", "POST"},
    })

    // ルーティング全体をCORS対応のハンドラで包む
    handler := c.Handler(mux)
    http.ListenAndServe(":8080", handler)
}

この設定では、https://example.com からのアクセスだけを許可し、 HTTPメソッドは GETPOST に限定しています。 それ以外のサイトや不要なメソッドはブラウザ側でブロックされやすくなるため、 「必要な範囲だけ許可する」というCORSの基本方針にも合っています。

まずはライブラリで動かしてみると、CORSの全体像がつかみやすくなります。 そのうえで「どのオリジンを許可するか」「どのメソッドを通すか」を少しずつ調整していくと、 GoでのWeb API開発でも自然に安全なCORS設定へ近づけられます。

4. 安全なCORS設定のポイント

4. 安全なCORS設定のポイント
4. 安全なCORS設定のポイント

CORSは正しく設定すれば便利ですが、設定を間違えると意図しないアクセスを許してしまう可能性があります。 そのため、「とりあえず動いたからOK」ではなく、最低限押さえておきたい安全面のポイントを理解しておくことが大切です。 ここでは、初心者の方でも実践しやすい基本的な考え方を整理します。

  • 許可するオリジンは、必要なものだけを AllowedOrigins に明示的に指定します。 利用していないドメインまで許可してしまうと、思わぬ経路からAPIを使われる原因になります。
  • HTTPメソッドも同様に、実際に使うものだけを許可します。 GETしか使わないAPIでPOSTやDELETEまで許可すると、攻撃の入口を増やすことになります。
  • Cookieや認証情報を使う場合は、AllowCredentials: true を設定し、 オリジンに * を使わないようにします。 これはブラウザ側の仕様でもあり、セキュリティを守るための重要なルールです。

これらを意識するだけでも、CORS設定の安全性は大きく変わります。 「必要なものだけを許可する」という考え方は、CORSに限らずWeb開発全体で役立つ基本姿勢です。 まずはこのポイントを守りながら、無理のない範囲で設定を見直していきましょう。

5. 実際の利用ケース

5. 実際の利用ケース
5. 実際の利用ケース

例えば、フロントエンドがhttps://myfrontend.com、バックエンドがhttps://myapi.comの構成の場合、CORSを正しく設定することで、フロントエンドから安全にAPIにアクセスできるようになります。間違って*を設定すると、他の悪意あるサイトからもAPIにアクセスできてしまうため注意が必要です。

6. プリフライトリクエストとは何か

6. プリフライトリクエストとは何か
6. プリフライトリクエストとは何か

CORS対応を進めていくと、「プリフライトリクエスト」という言葉を目にすることがあります。 これは、ブラウザが実際のリクエストを送信する前に、 「この操作をしても問題ありませんか?」とサーバーに事前確認を行う仕組みです。 特に、POSTやPUT、DELETEといった操作や、カスタムヘッダを含むリクエストでは自動的に発生します。

GoでAPIを作っている場合、プリフライトリクエストはHTTPメソッドが OPTIONS として送られてきます。 このリクエストに正しく応答しないと、本来のAPI処理が実行される前に ブラウザ側で通信が止められてしまいます。 初心者の方は「本番リクエストの前にチェック用の通信がある」と覚えておくと理解しやすいです。


func handler(w http.ResponseWriter, r *http.Request) {
    // プリフライトリクエストへの対応
    if r.Method == http.MethodOptions {
        w.Header().Set("Access-Control-Allow-Origin", "https://example.com")
        w.Header().Set("Access-Control-Allow-Methods", "GET, POST")
        w.Header().Set("Access-Control-Allow-Headers", "Content-Type")
        w.WriteHeader(http.StatusOK)
        return
    }

    w.Write([]byte("通常のAPIレスポンス"))
}

このようにOPTIONSリクエストを明示的に処理することで、 ブラウザとの通信がスムーズになり、CORSエラーを防ぎやすくなります。

7. Cookieや認証情報を使う場合の注意点

7. Cookieや認証情報を使う場合の注意点
7. Cookieや認証情報を使う場合の注意点

ログイン状態を維持するAPIや、セッションを使った認証を行う場合、 Cookieを伴うCORS通信が必要になることがあります。 このとき、単にオリジンを許可するだけでは不十分で、 追加の設定が必要になります。

具体的には、Access-Control-Allow-Credentialstrue に設定し、許可するオリジンを明示的に指定します。 この場合、* を使うことはできません。 セキュリティ上の理由から、ブラウザが厳しく制限しているためです。


func handler(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Access-Control-Allow-Origin", "https://example.com")
    w.Header().Set("Access-Control-Allow-Credentials", "true")
    w.Write([]byte("認証付きCORS対応"))
}

認証情報を扱うAPIでは、CORS設定のミスが セキュリティ事故につながる可能性があります。 必要な範囲だけを許可する意識を持つことが重要です。

8. 開発環境と本番環境で設定を分ける考え方

8. 開発環境と本番環境で設定を分ける考え方
8. 開発環境と本番環境で設定を分ける考え方

CORS設定は、開発環境と本番環境で内容が変わることがよくあります。 開発中はローカル環境や複数のURLからアクセスする必要があるため、 比較的ゆるい設定を使うケースが多いです。 一方で、本番環境では不要なオリジンをすべて遮断することが求められます。

Goでは、環境変数や設定ファイルを使って、 環境ごとに許可するオリジンを切り替える方法が一般的です。 これにより、開発のしやすさと本番環境の安全性を両立できます。


allowedOrigin := "https://example.com"

func handler(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Access-Control-Allow-Origin", allowedOrigin)
    w.Write([]byte("環境に応じたCORS設定"))
}

最初から完璧な設定を目指す必要はありませんが、 「環境によってCORSの考え方が変わる」という点を理解しておくと、 実務でのトラブルを大きく減らすことができます。

Go言語を基礎からスッキリ学びたい人や、 文法だけでなく「実用的な使い方」まで押さえたい人には、 定番の入門書がこちらです。

基礎からわかるGo言語をAmazonで見る

※ Amazon広告リンク

まとめ

まとめ
まとめ

CORS対応の全体像を振り返る

この記事では、Go言語を使ったWebアプリやWeb API開発において避けて通れない CORS対応について、基礎から実務で役立つ考え方まで順を追って解説してきました。 CORSは、ブラウザが安全性を守るために用意している仕組みであり、 サーバー側が意図しないアクセスを防ぐための重要な役割を担っています。 単にエラーを消すための設定ではなく、 「どのサイトから、どの操作を許可するのか」を明確にするためのルールだと理解することが大切です。

基本としては、HTTPレスポンスヘッダに Access-Control-Allow-Origin を設定することで、 ブラウザに対して「このリクエストは許可してよい」と伝えます。 しかし、すべてのオリジンを許可する * の指定は手軽な反面、 意図しない外部サイトからのアクセスを許してしまう可能性があります。 学習段階では便利でも、実際の運用では慎重に扱う必要があります。

そこで紹介したのが、Go向けのサードパーティライブラリを使ったCORS設定です。 ライブラリを使うことで、許可するオリジンやHTTPメソッドを明確に指定でき、 コードの可読性も高まります。 特にフロントエンドとバックエンドを分離した構成では、 CORSの正しい設定がないとAPI通信そのものが成り立ちません。 その意味でも、CORSはWeb開発の基礎知識として早めに理解しておく価値があります。

最低限覚えておきたいCORS設定サンプル


func handler(w http.ResponseWriter, r *http.Request) {
    // 特定のオリジンのみ許可する例
    w.Header().Set("Access-Control-Allow-Origin", "https://example.com")
    w.Header().Set("Access-Control-Allow-Methods", "GET, POST")
    w.Write([]byte("CORS設定済みレスポンス"))
}

このように、許可するオリジンやメソッドを明示するだけでも、 セキュリティと利便性のバランスは大きく向上します。 CORS対応は「とりあえず動かす」ことよりも、 「なぜこの設定が必要なのか」を理解しながら進めることが重要です。 それが結果的に、トラブルの少ない安定したWeb API設計につながります。

先生と生徒の振り返り会話

生徒

「CORSって、最初はエラーの原因くらいにしか思っていませんでしたけど、 実はWeb全体の安全を守るための仕組みなんですね。」

先生

「その通りです。CORSはブラウザ側の制限ですが、 サーバーが正しくルールを示すことで初めて意味を持ちます。 何でも許可する設定は楽ですが、長い目で見ると危険です。」

生徒

「なるほど……。 フロントエンドとバックエンドを分ける構成だと、 CORSを理解していないと開発が止まってしまいそうですね。」

先生

「その通りです。 GoでAPIを作るなら、CORSは必須の知識です。 今日学んだように、許可するオリジンやメソッドを整理して考えれば、 難しいものではありません。」

生徒

「これからは、エラーが出たときも 『なぜCORSで止められているのか』を考えられそうです。 安全な設定を意識してAPIを作ってみます!」

先生

「それができれば十分です。 CORSを理解しているだけで、GoのWeb開発は一段レベルアップしますよ。」

関連セミナーのご案内

【超入門】ゼロから始めるGo言語プログラミング:最速で「動くアプリ」を作るマンツーマン指導

「プログラミングの仕組み」が根本からわかる。Go言語でバックエンド開発の第一歩を。

本講座を受講することで、単なる文法の暗記ではなく、「プログラムがコンピュータの中でどう動いているか」という本質的な理解につながります。シンプルながら強力なGo言語(Golang)を通じて、現代のバックエンドエンジニアに求められる基礎体力を最短距離で身につけます。

具体的な開発内容と環境

【つくるもの】
ターミナル(黒い画面)上で動作する「対話型計算プログラム」や、データを整理して表示する「ミニ・ツール」をゼロから作成します。自分の書いたコードが形になる感動を体験してください。

【開発環境】
プロの現場でシェアNo.1のVisual Studio Code (VS Code)を使用します。インストールから日本語化、Go言語用の拡張機能設定まで、現場基準の環境を一緒に構築します。

この60分で得られる3つの理解

1. 環境構築の完全な理解

「なぜ動くのか」という設定の仕組みを理解し、今後の独学で詰まらない土台を作ります。

2. Go言語の基本構造(変数・型)

データの種類やメモリの概念など、他言語にも通じるプログラミングの本質を学びます。

3. 読みやすいコードの書き方

ただ動くだけでなく、誰が見ても分かりやすい「綺麗なコード」を書くための考え方を伝授します。

※本講座は、将来的にバックエンドエンジニアクラウドインフラに興味がある未経験者のためのエントリー講座です。マンツーマン形式により、あなたの理解度に合わせて進行します。

セミナー画像

初めてのGo言語を一緒に学びましょう!

カテゴリの一覧へ
新着記事
New1
Swift
Swiftのnilとは?Optionalとの関係や初期化について初心者向けにやさしく解説!
New2
Go言語
Go言語のinit関数の役割と使い方!プログラム起動時の初期化処理
New3
Go言語
Go言語のマップの順序保証がない理由と扱い方の工夫をやさしく解説!初心者でもわかる基本知識
New4
Kotlin
Kotlinのforループの基本!範囲・配列・コレクションの繰り返し処理
人気記事
No.1
Java&Spring記事人気No1
Kotlin
Kotlinのsettings.gradleファイルを完全解説!初心者でもわかるプロジェクト設定の基本
No.2
Java&Spring記事人気No2
Go言語
Swiftの配列(Array)の使い方を完全ガイド!初心者でもわかるデータのまとめ方
No.3
Java&Spring記事人気No3
Go言語
Go言語のSQLインジェクション対策を完全解説!初心者でも安全なデータベース操作がわかる
No.4
Java&Spring記事人気No4
Swift
Swiftの高階関数map・filter・reduceを完全解説!初心者でもわかる配列操作の基本
No.5
Java&Spring記事人気No5
Go言語
Swiftの文字列操作を完全ガイド!初心者でもわかるStringの基本
No.6
Java&Spring記事人気No6
Kotlin
KotlinのRoomで複雑なクエリを使いこなす!初心者でもわかる応用テクニック
No.7
Java&Spring記事人気No7
Go言語
Go言語のgo installコマンドの役割とインストール先の仕組みを徹底解説!
No.8
Java&Spring記事人気No8
Swift
Swift Playgroundの使い方を完全解説!初心者に最適な学習環境の始め方