CORSとパニックリカバリーのミドルウェア
クロスオリジンポリシーとパニックからの復旧
「CORSとパニックリカバリーのミドルウェア」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Go Academyコースには全4レッスンが含まれています。
CORS とは
Cross-Origin Resource Sharing(CORS)は、どのオリジンが API に HTTP リクエストを送信できるかを制限するブラウザーのセキュリティ機構です。サーバーはレスポンスヘッダーを設定して、リクエストを許可します。
CORS のプリフライト
カスタムヘッダーまたは単純ではないメソッドを使うクロスオリジンリクエストの前に、ブラウザーは OPTIONS プリフライトを送信します。ミドルウェアは OPTIONS を処理し、CORS ヘッダーを付けて 200 を返す必要があります。
CORS ミドルウェア
開発用のシンプルな CORS ミドルウェア:
func CORS(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Access-Control-Allow-Origin", "https://myapp.com")
w.Header().Set("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE,OPTIONS")
w.Header().Set("Access-Control-Allow-Headers", "Authorization,Content-Type")
if r.Method == http.MethodOptions {
w.WriteHeader(http.StatusOK); return
}
next.ServeHTTP(w, r)
})
}許可するオリジン
認証情報(Cookie や Authorization ヘッダー)を使用する場合は、Access-Control-Allow-Origin: * を使わないでください。明示的なオリジンを指定します。複数のオリジンを許可する場合は、ホワイトリストと照合してください。
allowedOrigins := map[string]bool{
"https://app.example.com": true,
"https://dev.example.com": true,
}
if allowedOrigins[r.Header.Get("Origin")] {
w.Header().Set("Access-Control-Allow-Origin", r.Header.Get("Origin"))
}Access-Control-Allow-Credentials
クロスオリジンで Cookie と認証ヘッダーを送信できるようにします:
w.Header().Set("Access-Control-Allow-Credentials", "true")rs/cors ライブラリ
柔軟なオリジン照合、認証情報のサポート、プリフライトのキャッシュに対応した本番品質の CORS には、github.com/rs/cors ライブラリを使用します。
c := cors.New(cors.Options{
AllowedOrigins: []string{"https://example.com"},
AllowedMethods: []string{"GET","POST","PUT","DELETE"},
AllowedHeaders: []string{"Authorization","Content-Type"},
AllowCredentials: true,
})
handler := c.Handler(mux)パニックリカバリーミドルウェア
パニックから復旧して、サーバーのクラッシュやアクティブな接続の全消失を防ぎます:
func Recovery(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
defer func() {
if rec := recover(); rec != nil {
log.Printf("panic: %v\n%s", rec, debug.Stack())
http.Error(w, "Internal Server Error", 500)
}
}()
next.ServeHTTP(w, r)
})
}runtime/debug.Stack
パニックが発生したときに goroutine の完全なスタックトレースを出力し、根本原因の診断に役立てます:
import "runtime/debug"
log.Printf("panic: %v\n%s", rec, debug.Stack())Sentry との統合
クライアントに 500 を返す前に、リカバリーミドルウェア内でパニックを Sentry または同様のエラートラッキングサービスに送信します。
順序: Recovery を最外側に配置
他のすべてのミドルウェアとハンドラーで発生するパニックを捕捉できるよう、必ず Recovery を最外側(最初に適用される位置)のミドルウェアとして登録してください。
handler := Recovery(RequestID(Logger(Auth(mux))))パニックリカバリーのテスト
意図的にパニックを発生させるハンドラーを作成し、httptest でミドルウェアを通して呼び出して、レスポンスが 500 になることをアサートします。
panicHandler := http.HandlerFunc(func(_ http.ResponseWriter, _ *http.Request) { panic("test") })
w := httptest.NewRecorder()
Recovery(panicHandler).ServeHTTP(w, httptest.NewRequest("GET", "/", nil))
assert.Equal(t, 500, w.Code)確認問題
パニックリカバリーミドルウェアを最外側の層に配置する必要があるのはなぜですか?
まとめ: CORS とパニックリカバリー
重要なポイント:
- CORS: Access-Control-Allow-* ヘッダーを設定し、OPTIONS プリフライトを処理する
- 認証情報を使用する場合は、Allow-Origin に * ではなく明示的なオリジンを指定する
- リカバリー: defer recover()、スタックトレースの記録、500 の返却を行う
- Recovery は最外側のミドルウェアにする
よくある質問
「CORSとパニックリカバリーのミドルウェア」レッスンは無料ですか?
はい。「CORSとパニックリカバリーのミドルウェア」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。
「CORSとパニックリカバリーのミドルウェア」で何を学びますか?
クロスオリジンポリシーとパニックからの復旧 ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Go Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「CORSとパニックリカバリーのミドルウェア」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このGo Academyレッスンでコードを書いて実行できますか?
はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- HTTPミドルウェアチェーンの基本
- ロギングとリクエストIDのミドルウェア
- 認証とレート制限のミドルウェア
- CORSとパニックリカバリーのミドルウェア