Go의 Fiber 프레임워크를 사용하며 개발을 진행하며 CORS 에러가 종종 발생하여 해당 에러를 해결하기 위한 세팅 과정과 세부 옵션은 무엇이 있는지 확인해보겠습니다.
CORS(Cross-Origin Resource Sharing)는 웹 브라우저에서 보안 목적으로 사용되는 메커니즘으로, 한 출처(Origin)의 웹 페이지가 다른 출처의 리소스에 접근할 수 있도록 허용하는 방법을 정의합니다. 이는 웹 애플리케이션의 보안을 강화하고, 다양한 출처 간의 안전한 통신을 가능하게 합니다.
기본적으로 웹 브라우저는 보안 정책(동일 출처 정책, Same-Origin Policy)에 따라, 한 출처에서 로드된 웹 페이지가 다른 출처의 리소스에 접근하는 것을 제한합니다. 예를 들어 A에서 로드된 웹 페이지가 B의 리소스에 접근하려고 할 때, 브라우저는 이를 차단합니다. 하지만 상황에 맞게 이러한 제한을 완화할 필요가 있고 이때, CORS를 사용하여 특정 출처에서의 접근을 허용할 수 있습니다.
Go Fiber 프레임워크에서는 Cors(Cross-Origin Resource Sharing)를 설정하기 위해 fiber에서 제공하는 fiber/middleware/cors 패키지를 사용하면 됩니다.
CORS 설정 옵션은 아래와 같습니다.
허용할 오리진을 쉼표로 구분하여 설정합니다.
AllowOrigins: "http://localhost:9000, http://localhost:8080",
허용할 HTTP 메서드를 설정합니다.
AllowMethods: "GET,POST,HEAD,DELETE,PATCH",
허용할 요청 헤더를 설정합니다.
AllowHeaders: "Origin,Content-Type,Accept,Content-Length,Accept-Language,Accept-Encoding,Connection,Access-Control-Allow-Origin,Authorization",
자격 증명(쿠키, HTTP 인증 등)을 허용할지 여부를 설정합니다.
AllowCredentials: true,
클라이언트에게 노출할 응답 헤더를 설정합니다.
ExposeHeaders: "Content-Disposition",
preflight 요청의 결과를 캐시할 최대 시간을 설정합니다. 단위는 초단위
MaxAge: 3600, // 1시간
허용할 오리진을 동적으로 설정할 수 있는 함수입니다. 요청의 오리진을 기반으로 특정 로직을 통해 허용할지를 결정합니다.
AllowOriginFunc: func(origin string) bool {
return origin == "http://localhost:9000" || origin == "http://localhost:8080"
},
비공개 네트워크의 요청을 허용할지 여부를 설정합니다.
AllowPrivateNetwork: true,
종합적으로 다양한 옵션을 사용하여 Fiber 애플리케이션에서 CORS 미들웨어를 설정하는 예시는 아래와 같습니다.
package main
import (
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/cors"
)
func main() {
app := fiber.New()
app.Use(cors.New(cors.Config{
AllowOrigins: "http://localhost:9000, http://localhost:8080",
AllowMethods: "GET,POST,HEAD,DELETE,PATCH",
AllowHeaders: "Origin,Content-Type,Accept,Content-Length,Accept-Language,Accept-Encoding,Connection,Access-Control-Allow-Origin,Authorization",
AllowCredentials: true,
ExposeHeaders: "Content-Disposition",
MaxAge: 3600,
AllowOriginFunc: func(origin string) bool {
return origin == "http://localhost:9000" || origin == "http://localhost:8080"
},
AllowPrivateNetwork: true,
}))
app.Get("/", func(c *fiber.Ctx) error {
return c.SendString("Hello, World!")
})
app.Listen(":8090")
}