Go Fiber Cors 에러 해결 및 세팅

beluga000·2024년 8월 2일
0
post-thumbnail

Go의 Fiber 프레임워크를 사용하며 개발을 진행하며 CORS 에러가 종종 발생하여 해당 에러를 해결하기 위한 세팅 과정과 세부 옵션은 무엇이 있는지 확인해보겠습니다.

CORS?

CORS(Cross-Origin Resource Sharing)는 웹 브라우저에서 보안 목적으로 사용되는 메커니즘으로, 한 출처(Origin)의 웹 페이지가 다른 출처의 리소스에 접근할 수 있도록 허용하는 방법을 정의합니다. 이는 웹 애플리케이션의 보안을 강화하고, 다양한 출처 간의 안전한 통신을 가능하게 합니다.

CORS의 필요성

기본적으로 웹 브라우저는 보안 정책(동일 출처 정책, Same-Origin Policy)에 따라, 한 출처에서 로드된 웹 페이지가 다른 출처의 리소스에 접근하는 것을 제한합니다. 예를 들어 A에서 로드된 웹 페이지가 B의 리소스에 접근하려고 할 때, 브라우저는 이를 차단합니다. 하지만 상황에 맞게 이러한 제한을 완화할 필요가 있고 이때, CORS를 사용하여 특정 출처에서의 접근을 허용할 수 있습니다.

CORS 세팅

Go Fiber 프레임워크에서는 Cors(Cross-Origin Resource Sharing)를 설정하기 위해 fiber에서 제공하는 fiber/middleware/cors 패키지를 사용하면 됩니다.

CORS 설정 옵션은 아래와 같습니다.

  1. AllowOrigins

허용할 오리진을 쉼표로 구분하여 설정합니다.

AllowOrigins: "http://localhost:9000, http://localhost:8080",
  1. AllowMethods

허용할 HTTP 메서드를 설정합니다.

AllowMethods: "GET,POST,HEAD,DELETE,PATCH",
  1. AllowHeaders

허용할 요청 헤더를 설정합니다.

AllowHeaders: "Origin,Content-Type,Accept,Content-Length,Accept-Language,Accept-Encoding,Connection,Access-Control-Allow-Origin,Authorization",
  1. AllowCredentials

자격 증명(쿠키, HTTP 인증 등)을 허용할지 여부를 설정합니다.

AllowCredentials: true,
  1. ExposeHeaders

클라이언트에게 노출할 응답 헤더를 설정합니다.

ExposeHeaders: "Content-Disposition",
  1. MaxAge

preflight 요청의 결과를 캐시할 최대 시간을 설정합니다. 단위는 초단위

MaxAge: 3600, // 1시간
  1. AllowOriginFunc

허용할 오리진을 동적으로 설정할 수 있는 함수입니다. 요청의 오리진을 기반으로 특정 로직을 통해 허용할지를 결정합니다.

AllowOriginFunc: func(origin string) bool {
    return origin == "http://localhost:9000" || origin == "http://localhost:8080"
},
  1. AllowPrivateNetwork

비공개 네트워크의 요청을 허용할지 여부를 설정합니다.

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")
}
profile
Developer

0개의 댓글