CORS
CORS(Cross-Origin Resource Sharing)는 서버가 리소스에 접근할 수 있는 대상과 방법을 지정할 수 있도록 해주는 Fiber용 미들웨어입니다. 이는 보안 기능이 아니라 크로스-오리진 요청에 대한 웹 브라우저의 보안 모델을 완화하는 방법입니다. CORS에 대해 더 알고 싶다면 Mozilla Developer Network를 참고하세요.
이 미들웨어는 Fiber 애플리케이션의 응답에 CORS 헤더를 추가하는 방식으로 동작합니다. 이 헤더는 크로스-오리진 요청에 허용되는 오리진, 메서드, 헤더를 지정합니다. 또한 실제 요청을 보내기에 안전한지 확인하는 CORS 메커니즘인 프리플라이트 요청도 처리합니다.
이 미들웨어는 AllowOrigins
옵션을 사용하여 크로스-오리진 요청을 할 수 있는 오리진을 제어합니다. 단일 오리진, 다중 오리진, 서브도메인 매칭, 와일드카드 오리진을 지원합니다. 또한 AllowOriginsFunc
옵션을 통해 프로그래밍 방식으로 오리진 유효성 검사를 할 수 있습니다.
제공된 AllowOrigins
오리진이 올바르게 포맷되도록 하기 위해, 이 미들웨어는 오리진을 검증하고 정규화합니다. HTTP 또는 HTTPS와 같은 유효한 스킴을 확인하고, 끝에 슬래시를 자동으로 제거합니다. 제공된 오리진이 유효하지 않으면 미들웨어는 패닉을 발생시킵니다.
CORS를 구성할 때는 크레덴셜과 함께 와일드카드 오리진을 사용하거나, 오리진에 너무 관대하거나, AllowOriginsFunc
로 부적절한 검증을 하는 등의 일반적인 함정을 피하는 것이 중요합니다. 잘못된 구성은 애플리케이션을 다양한 보안 위험에 노출시킬 수 있습니다.
Signatures
Examples
Fiber 웹 프레임워크의 일부인 미들웨어 패키지를 임포트합니다.
Fiber 앱을 초기화한 후에는 다음과 같은 가능성이 있습니다:
Basic usage
기본 구성을 사용하려면 그냥 cors.New()
를 사용하면 됩니다. 이렇게 하면 와일드카드 오리진 '*', 모든 메서드, 크레덴셜 없음, 헤더나 노출된 헤더 없음이 허용됩니다.
Custom configuration (specific origins, headers, etc.)
Dynamic origin validation
AllowOriginsFunc
를 사용하여 요청의 오리진을 기반으로 요청을 허용할지 여부를 프로그래밍 방식으로 결정할 수 있습니다. 이는 데이터베이스나 기타 동적 소스에 대해 오리진을 검증해야 할 때 유용합니다. 이 함수는 오리진이 허용되면 true
를, 그렇지 않으면 false
를 반환해야 합니다.
AllowOriginsFunc
를 사용할 때는 보안 고려사항을 검토하세요.
AllowCredentials
가 true
로 설정된 경우에는 특히 중요한데, AllowOriginsFunc
가 모든 오리진에 대해 true
를 반환하도록 허용하지 마세요. 그렇게 하면 크레덴셜과 함께 와일드카드 오리진을 사용하는 제한을 우회하여 애플리케이션을 심각한 보안 위협에 노출시킬 수 있습니다.
와일드카드 오리진을 허용해야 한다면, AllowOriginsFunc
대신 AllowOrigins
에 와일드카드 "*"
를 사용하세요.
Prohibited usage
다음 예제는 애플리케이션을 보안 위험에 노출시킬 수 있으므로 금지됩니다. AllowOrigins
를 "*"
(와일드카드)로, AllowCredentials
를 true
로 설정합니다.
이렇게 하면 다음과 같은 패닉이 발생합니다:
Config
AllowCredentials
bool
AllowCredentials는 크레덴셜 플래그가 true일 때 요청에 대한 응답을 노출할 수 있는지 여부를 나타냅니다. 프리플라이트 요청에 대한 응답의 일부로 사용될 때, 이는 크레덴셜을 사용하여 실제 요청을 할 수 있는지 여부를 나타냅니다. 참고: true인 경우 보안 취약점을 방지하기 위해 AllowOrigins를 와일드카드("*"
)로 설정할 수 없습니다.
false
AllowHeaders
[]string
AllowHeaders는 실제 요청을 할 때 사용할 수 있는 요청 헤더 목록을 정의합니다. 이는 프리플라이트 요청에 대한 응답입니다.
[]
AllowMethods
[]string
AllowMethods는 리소스에 접근할 때 허용되는 메서드 목록을 정의합니다. 이는 프리플라이트 요청에 대한 응답으로 사용됩니다.
"GET, POST, HEAD, PUT, DELETE, PATCH"
AllowOrigins
[]string
AllowOrigins는 리소스에 접근할 수 있는 오리진 목록을 정의합니다. 이는 서브도메인 매칭을 지원하므로 "https://*.example.com"과 같은 값을 사용하여 example.com의 모든 서브도메인이 요청을 제출할 수 있도록 할 수 있습니다. 목록에 특수 와일드카드 "*"
가 있으면 모든 오리진이 허용됩니다.
["*"]
AllowOriginsFunc
func(origin string) bool
AllowOriginsFunc
는 요청의 오리진을 기반으로 요청을 허용할지 여부를 동적으로 결정하는 함수입니다. 이 함수가 true
를 반환하면 'Access-Control-Allow-Origin' 응답 헤더가 요청의 'origin' 헤더로 설정됩니다. 이 함수는 요청의 오리진이 AllowOrigins
의 어떤 오리진과도 일치하지 않는 경우에만 사용됩니다.
nil
AllowPrivateNetwork
bool
Access-Control-Allow-Private-Network
응답 헤더를 true
로 설정해야 하는지 여부를 나타내며, 이는 프라이빗 네트워크에서의 요청을 허용합니다. 이는 프라이빗 네트워크와 상호작용하는 웹 애플리케이션의 현대적인 보안 관행에 부합합니다.
false
ExposeHeaders
string
ExposeHeaders는 클라이언트가 액세스할 수 있도록 허용되는 화이트리스트 헤더를 정의합니다.
[]
MaxAge
int
MaxAge는 프리플라이트 요청 결과를 캐시할 수 있는 시간(초)을 나타냅니다. MaxAge를 0으로 전달하면 Access-Control-Max-Age 헤더가 추가되지 않고 브라우저는 기본적으로 5초를 사용합니다. 캐싱을 완전히 비활성화하려면 MaxAge 값을 음수로 전달하세요. 그러면 Access-Control-Max-Age 헤더가 0으로 설정됩니다.
0
Next
func(fiber.Ctx) bool
Next는 true를 반환하면 이 미들웨어를 건너뛰는 함수를 정의합니다.
nil
AllowOrigins가 영(zero) 값 []string{}
이고, AllowOriginsFunc가 제공되면, 미들웨어는 와일드카드 값 "*"로 모든 오리진을 허용하도록 기본 설정되지 않습니다. 대신 AllowOriginsFunc에 의존하여 요청의 오리진에 따라 요청을 허용할지 여부를 동적으로 결정합니다. 이는 허용되는 오리진에 대해 더 많은 유연성과 제어를 제공합니다.
Default Config
Subdomain Matching
AllowOrigins
구성은 모든 수준의 서브도메인 매칭을 지원합니다. 즉, "https://*.example.com"
과 같은 값을 사용하여 "https://sub.sub.example.com"
과 같은 여러 서브도메인 수준을 포함하여 example.com
의 모든 서브도메인에서 요청을 제출할 수 있습니다.
Example
example.com
의 모든 서브도메인(중첩된 서브도메인 포함)에서 CORS 요청을 허용하려면 다음과 같이 AllowOrigins
를 구성할 수 있습니다:
How It Works
CORS 미들웨어는 Fiber 애플리케이션의 응답에 필요한 CORS 헤더를 추가하는 방식으로 동작합니다. 이 헤더는 브라우저에게 크로스 오리진 요청에 대해 허용되는 오리진, 메서드, 헤더를 알려줍니다.
요청이 들어오면 미들웨어는 먼저 실제 요청을 보내는 것이 안전한지 확인하는 CORS 메커니즘인 프리플라이트 요청인지 확인합니다. 프리플라이트 요청은 특정 CORS 헤더가 있는 HTTP OPTIONS 요청입니다. 프리플라이트 요청이라면 미들웨어는 적절한 CORS 헤더로 응답하고 요청을 종료합니다.
프리플라이트 요청이 아니라면, 미들웨어는 CORS 헤더를 응답에 추가하고 요청을 다음 핸들러로 전달합니다. 실제로 추가되는 CORS 헤더는 미들웨어의 구성에 따라 달라집니다.
AllowOrigins
옵션은 크로스-오리진 요청을 할 수 있는 오리진을 제어합니다. 미들웨어는 다양한 AllowOrigins
구성을 다음과 같이 처리합니다:
단일 오리진:
AllowOrigins
가"http://www.example.com"
과 같은 단일 오리진으로 설정되고, 해당 오리진이 들어오는 요청의 오리진과 일치하면, 미들웨어는 응답에Access-Control-Allow-Origin: http://www.example.com
헤더를 추가합니다.다중 오리진:
AllowOrigins
가"https://example.com, https://www.example.com"
과 같이 다중 오리진으로 설정되면, 미들웨어는 들어오는 요청의 오리진과 일치하는 오리진을 선택합니다.서브도메인 매칭:
AllowOrigins
에"https://*.example.com"
이 포함되어 있으면,https://sub.example.com
과 같은 서브도메인이 매칭되고"https://sub.example.com"
이 헤더가 됩니다. 또한https://sub.sub.example.com
등도 매칭되지만,https://example.com
은 매칭되지 않습니다.와일드카드 오리진:
AllowOrigins
가"*"
로 설정되면, 미들웨어는 그것을 사용하고 응답에Access-Control-Allow-Origin: *
헤더를 추가합니다.
위의 와일드카드 오리진을 제외한 모든 경우, 미들웨어는 들어오는 요청의 오리진과 일치하는 Access-Control-Allow-Origin
헤더를 응답에 추가하거나, 오리진이 허용되지 않으면 헤더를 전혀 추가하지 않습니다.
프로그래밍 방식 오리진 유효성 검사: 미들웨어는 또한
AllowOriginsFunc
옵션을 처리하며, 이는 오리진이 허용되는지를 프로그래밍 방식으로 결정할 수 있게 해줍니다.AllowOriginsFunc
가 오리진에 대해true
를 반환하면, 미들웨어는Access-Control-Allow-Origin
헤더를 해당 오리진으로 설정합니다.
AllowMethods
옵션은 허용되는 HTTP 메서드를 제어합니다. 예를 들어, AllowMethods
가 "GET, POST"
로 설정되면, 미들웨어는 응답에 Access-Control-Allow-Methods: GET, POST
헤더를 추가합니다.
AllowHeaders
옵션은 실제 요청에서 허용되는 헤더를 지정합니다. 미들웨어는 Access-Control-Allow-Headers 응답 헤더를 AllowHeaders
의 값으로 설정합니다. 이는 클라이언트에게 실제 요청에서 사용할 수 있는 헤더를 알려줍니다.
AllowCredentials
옵션은 크레덴셜 플래그가 true일 때 요청에 대한 응답을 노출할 수 있는지 여부를 나타냅니다. AllowCredentials
가 true
로 설정되면, 미들웨어는 응답에 Access-Control-Allow-Credentials: true
헤더를 추가합니다. 보안 취약점을 방지하기 위해, AllowOrigins
가 와일드카드(*
)로 설정된 경우 AllowCredentials
를 true
로 설정할 수 없습니다.
ExposeHeaders
옵션은 클라이언트가 액세스할 수 있도록 허용되는 화이트리스트 헤더를 정의합니다. ExposeHeaders
가 "X-Custom-Header"
로 설정되면, 미들웨어는 응답에 Access-Control-Expose-Headers: X-Custom-Header
헤더를 추가합니다.
MaxAge
옵션은 프리플라이트 요청 결과를 캐시할 수 있는 시간을 나타냅니다. MaxAge
가 3600
으로 설정되면, 미들웨어는 응답에 Access-Control-Max-Age: 3600
헤더를 추가합니다.
Vary
헤더는 이 미들웨어에서 사용되어 클라이언트에게 서버의 요청에 대한 응답을 알려줍니다. 프리플라이트 요청과 실제 요청 모두에 대해 Vary 헤더는 Access-Control-Request-Method
와 Access-Control-Request-Headers
로 설정됩니다. 프리플라이트 요청의 경우 Vary 헤더는 Origin
으로도 설정됩니다. Vary
헤더는 캐싱에 중요합니다. 이는 캐시(웹 브라우저의 캐시나 CDN 같은)가 향후 요청에 대한 응답으로 캐시된 응답을 사용할 수 있는 시점과 서버에 새로운 응답을 요청해야 하는 시점을 결정하는 데 도움이 됩니다.
Security Considerations
CORS를 구성할 때, 잘못된 구성은 애플리케이션을 다양한 보안 위험에 노출시킬 수 있습니다. 다음은 안전한 구성과 피해야 할 일반적인 함정입니다:
Secure Configurations
허용된 오리진 지정: 와일드카드(
"*"
)를 사용하는 대신, 요청을 할 수 있는 정확한 도메인을 지정하세요. 예를 들어,AllowOrigins: "https://www.example.com, https://api.example.com"
은 이 도메인만 애플리케이션에 크로스-오리진 요청을 할 수 있도록 합니다.크레덴셜 신중하게 사용: 애플리케이션이 크로스-오리진 요청에서 크레덴셜을 지원해야 하는 경우,
AllowCredentials
를true
로 설정하고AllowOrigins
에 정확한 오리진을 지정하세요. 이 경우 와일드카드 오리진을 사용하지 마세요.노출된 헤더 제한:
ExposeHeaders
를 적절히 설정하여 클라이언트 측 애플리케이션에 필요한 헤더만 화이트리스트로 지정하세요. 이는 민감한 정보 노출 위험을 최소화합니다.
Common Pitfalls
크레덴셜과 함께 와일드카드 오리진 사용:
AllowOrigins
를"*"
(와일드카드)로,AllowCredentials
를true
로 설정하는 것은 흔한 잘못된 구성입니다. 이 조합은 애플리케이션을 보안 위험에 노출시킬 수 있으므로 금지됩니다.너무 허용적인 오리진: 너무 많은 오리진을 지정하거나 너무 광범위한 패턴(
https://*.example.com
등)을 사용하면 악의적인 사이트가 의도치 않게 애플리케이션과 상호작용할 수 있습니다. 허용된 오리진을 가능한 한 구체적으로 지정하세요.부적절한
AllowOriginsFunc
유효성 검사:AllowOriginsFunc
를 사용하여 동적 오리진 유효성 검사를 할 때는 허가되지 않은 오리진이 수락되지 않도록 함수에 강력한 검사를 포함해야 합니다. 너무 허용적인 유효성 검사는 보안 취약점으로 이어질 수 있습니다.AllowOriginsFunc
가 모든 오리진에 대해true
를 반환하도록 허용하지 마세요.AllowCredentials
가true
로 설정된 경우에는 특히 중요합니다. 그렇게 하면 크레덴셜과 함께 와일드카드 오리진을 사용하는 제한을 우회하여 애플리케이션을 심각한 보안 위협에 노출시킬 수 있습니다. 와일드카드 오리진을 허용해야 한다면,AllowOriginsFunc
대신AllowOrigins
에 와일드카드"*"
를 사용하세요.
안전한 CORS 구성의 핵심은 특정성과 주의입니다. 허용되는 오리진, 메서드, 헤더를 신중하게 선택함으로써 애플리케이션을 크로스-오리진 공격으로부터 보호하는 데 도움이 될 수 있습니다.
Last updated