Go言語でHTTPサーバを実装する際にCORS(Cross-Origin Resource Sharing)の設定を行う方法。
※CORS:ウェブアプリケーションが異なるオリジンのリソースを安全にリクエストできるようにする仕組み
CORSミドルウェアの実装
CORSポリシーを実施するミドルウェア関数を定義。(今回は全てのHTTPレスポンスに適切なCORSヘッダーを追加し、プリフライトリクエストに適切に応答するものとして定義している)
presentation/cors_middleware.go
package presentation
import "net/http"
func CORSMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Access-Control-Allow-Origin", "*")
w.Header().Set("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE")
w.Header().Set("Access-Control-Allow-Headers", "Accept, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization")
if r.Method == "OPTIONS" {
w.WriteHeader(http.StatusOK)
return
}
next.ServeHTTP(w, r)
})
}
CORSミドルウェアの適用
HTTPハンドラーに定義したCORSミドルウェアを適応。
...
corsHandler := CORSMiddleware(proxyHandler)
http.Handle(config.Path, corsHandler)
...
今回ドメイン駆動設計をアーキテクチャに実装してるものとして、presentation
層に実装した。
(どのドメインからのアクセスを許可するかというHTTPレベルのセキュリティポリシーの管理、presentation
層の責務!)